Liaison de données d'une liste à un contrôle utilisateur dans un modèle d'élément dans le code derrière
-
05-07-2019 - |
Question
J'ai un DataList comme ci-dessous:
<asp:DataList runat="server" ID="myDataList">
<ItemTemplate>
<uc:MyControl ID="id1" runat="server" PublicProperty='<%# Container.DataItem %>' />
</ItemTemplate>
</asp:DataList>
Le modèle d'élément est simplement un contrôle utilisateur enregistré, MyControl. La source de données pour la liste de données est List<List<T>>
et PublicProperty de MyControl est transmis List<T>
sur lequel il effectue ensuite sa propre liaison de données. Cela fonctionne bien, mais j'ai une aversion générale pour la liaison de données dans la page aspx / c. Quel est le moyen le plus efficace de définir la valeur PublicProperty dans le code derrière?
La solution
Si la syntaxe de liaison de données en ligne ne vous convient pas - vous pouvez toujours vous connecter à l'événement ItemDatabound de DataList.
<asp:DataList runat="server" ID="myDataList"
OnItemDataBound="DataList_ItemDataBound">
<ItemTemplate>
<uc:MyControl ID="id1" runat="server" />
</ItemTemplate>
</asp:DataList>
Ensuite, dans le code situé derrière votre contrôle de page / contenant, vous pouvez ajouter votre événement 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;
}
}
Pour plus d'informations sur l'événement DataList.ItemDataBound - à lire ici
Si vous préférez ne pas déclarer votre délégué ItemDataBound en ligne dans ASPX, vous pouvez également le faire dans le code suivant - probablement dans votre événement Page Load:
myDataList.ItemDataBound += DataList_ItemDataBound;
L’espoir que cela aide