C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: ItemTemplate内で分岐するには?


(過去ログ 47 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■25143 / inTopicNo.1)  ItemTemplate内で分岐するには?
  
□投稿者/ ネクス (1回)-(2008/09/16(Tue) 11:07:56)

分類:[ASP.NET (C#)] 

VS.NET 2005 + ASP.NET(C#)で開発しています。

Repeaterを使い一覧を表示しているのですが、
ItemTemplate内で分岐をすることはできないのでしょうか?

<asp:Repeater >
 <ItemTemplate>
  <%# if(DataBinder.Eval(Container.DataItem, "hoge").ToString() != string.Empty %>
   <div>hogeは空じゃないです。</div>
  <%# } %>
 </ItemTemplate>
</asp:Repeater >

わかる方がいましたら、ご教授お願いします。
引用返信 編集キー/
■25144 / inTopicNo.2)  Re[1]: ItemTemplate内で分岐するには?
□投稿者/ みきぬ (80回)-(2008/09/16(Tue) 11:18:10)
No25143 (ネクス さん) に返信
> Repeaterを使い一覧を表示しているのですが、
> ItemTemplate内で分岐をすることはできないのでしょうか?
>

私がよくやる手は、

<% = getHoge(DataBinder.Eval(Container.DataItem, "hoge")) %>

って書いておいて、コードビハインド側で

protected string getHoge(object hoge)
{
// 分岐を含めた処理
}

を書いてあげる方法ですかねぇ。
Repeaterは使ったことないので、動かなかったらゴメン
引用返信 編集キー/
■25190 / inTopicNo.3)  Re[2]: ItemTemplate内で分岐するには?
□投稿者/ ネクス (2回)-(2008/09/16(Tue) 18:20:30)
みきぬ さん返信ありがとうございます。

<%= getHoge(DataBinder.Eval(Container.DataItem, "hoge")) %>
で、分岐することができましたが、

getHogeメソッド内が、HTML文字列をreturnしている、
ひどいソースになってしまいました。

あれから色々調べた結果、3項演算子が使えることはわかったのですが、
getHogeメソッドを使用した状態と、
ほとんど変わらない感じです(むしろさらに読みにくくなってしまいます。。。)

ItemTemplate内では、すっきり分岐することはできないのでしょうか?

No25144 (みきぬ さん) に返信
> ■No25143 (ネクス さん) に返信
>>Repeaterを使い一覧を表示しているのですが、
>>ItemTemplate内で分岐をすることはできないのでしょうか?
>>
>
> 私がよくやる手は、
>
> <% = getHoge(DataBinder.Eval(Container.DataItem, "hoge")) %>
>
> って書いておいて、コードビハインド側で
>
> protected string getHoge(object hoge)
> {
> // 分岐を含めた処理
> }
>
> を書いてあげる方法ですかねぇ。
> Repeaterは使ったことないので、動かなかったらゴメン
引用返信 編集キー/
■25337 / inTopicNo.4)  Re[3]: ItemTemplate内で分岐するには?
□投稿者/ YuO (1回)-(2008/09/17(Wed) 19:53:37)
No25190 (ネクス さん) に返信
> ItemTemplate内では、すっきり分岐することはできないのでしょうか?

「すっきり分岐」とはいかないですが,仕事でやった時は,次のような「IfControl.ascx」なるものを作って,強引に分岐させていました。
# .ascxなのは,都合によりコンパイルの手間を省きたかったからだったりします。
コード自体は仕事の物から書き直しており (そもそも元はVB.NET),さらに動作確認をしていないのでちゃんと動く保証はないですが,参考になれば幸いです。
# プロジェクト自体がViewStateを使わない方針だったため,ViewStateがまともに扱えないかもしれません。

<%@ Control Language="C#" %>
<script runat="server">
    /// <summary>
    /// 判定対象となる条件を取得・設定します。
    /// </summary>
    public bool Condition = false;

    private ITemplate _thenTemplate = null, _elseTemplate = null;
    /// <summary>
    /// <see cref="Condition"/> が真の場合にインスタンス化される <see cref="ITemplate"/> を設定します。
    /// </summary>
    [TemplateContainer(typeof(IfControlContainer))]
    public ITemplate Then { set { _thenTemplate = value; } }

    /// <summary>
    /// <see cref="Condition"/> が偽の場合にインスタンス化される <see cref="ITemplate"/> を設定します。
    /// </summary>
    [TemplateContainer(typeof(IfControlContainer))]
    public ITemplate Else { set { _elseTemplate = value; } }

    /// <summary>
    /// <see cref="Then"/> および <see cref="Else"/> で指定された <see cref="ITemplate"/> 中で, Container.DataItem として利用するオブジェクトを取得・設定します。
    /// </summary>
    public object DataItem = null;

    public override void DataBind ()
    {
        base.OnDataBinding(EventArgs.Empty);
        Controls.Clear();
        if (HasChildViewState) ClearChildViewState();
        ITemplate targetTemplate = Condition ? _thenTemplate : _elseTemplate;
        if (targetTemplate == null) return;
        IfControlContainer container = new IfControlContainer(DataItem);
        targetTemplate.InstantiateIn(container);
        Controls.Add(container);
        TrackViewState();
    }

    /// <summary>
    /// <see cref="Then"/> や <see cref="Else"/> 中で,実際に Container として働くクラスです。
    /// </summary>
    public class IfControlContainer : Control, INamingContainer
    {
        public readonly object DataItem;

        public IfControlContainer (object dataItem)
        {
            DataItem = dataItem;
        }
    }
</script>

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -