コードビハインドでアイテムテンプレート内のユーザーコントロールにリストをデータバインドする

StackOverflow https://stackoverflow.com/questions/1207147

質問

以下のようなDataListがあります:

<asp:DataList runat="server" ID="myDataList">
   <ItemTemplate>
     <uc:MyControl ID="id1" runat="server" PublicProperty='<%# Container.DataItem %>' />
   </ItemTemplate>
</asp:DataList>

アイテムテンプレートは、登録済みのユーザーコントロールであるMyControlです。 DataListのDataSourceはList<List<T>>であり、MyControlのPublicPropertyにList<T>が渡され、それから独自のデータバインディングが実行されます。これは正常に機能しますが、aspx / cページのデータバインディングに対する一般的な嫌悪感があります。コードビハインドでPublicProperty値を設定する最も効率的な方法は何ですか?

役に立ちましたか?

解決

インラインのデータバインディング構文が十分でない場合-DataListのItemDataboundイベントにいつでもフックできます。

<asp:DataList runat="server" ID="myDataList" 
                OnItemDataBound="DataList_ItemDataBound">
    <ItemTemplate>
        <uc:MyControl ID="id1" runat="server" />
    </ItemTemplate>
</asp:DataList>

次に、ページ/含まれるコントロールのコードビハインドで、ItemDataBoundイベントを追加できます。

    protected void DataList_ItemDataBound(object sender, DataListItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item
            || e.Item.ItemType == ListItemType.AlternatingItem)
        { 
            DataListItem item = e.Item;
            //List<string> or whatever your data source really is...
            List<string> dataItem = item.DataItem as List<string>;
            MyControl lit = (MyControl)item.FindControl("id1");
            lit.PropertyName = dataItem;
        }
    }

DataList.ItemDataBoundイベントの詳細-こちらを読む

ItemDataBoundデリゲートをASPXでインラインで宣言したくない場合は、コードビハインドで(おそらくページ読み込みイベントで)行うこともできます。

myDataList.ItemDataBound += DataList_ItemDataBound;

役立つこと

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top