コードビハインドでアイテムテンプレート内のユーザーコントロールにリストをデータバインドする
-
05-07-2019 - |
質問
以下のような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;
役立つこと
所属していません StackOverflow