2009-07-30 13 views
1

J'ai un DataList comme ci-dessous:Databinding une liste à un usercontrol dans un modèle d'objet dans codebehind

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

Le modèle d'objet est tout simplement un usercontrol enregistré, MyControl. DataSource pour DataList est un List<List<T>> et PublicProperty de MyControl est passé List<T> sur lequel il effectue ensuite sa propre liaison de données. Cela fonctionne très 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 pour définir la valeur PublicProperty dans le code derrière?

Répondre

3

Si la syntaxe de liaison de données en ligne ne vous convient pas, vous pouvez toujours vous connecter à l'événement ItemDatabound de la DataList. Ensuite, dans le code derrière votre contrôle 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 - Read Here

Si vous préférez ne pas déclarer votre ligne de délégué ItemDataBound dans le ASPX, vous pouvez aussi le faire dans le code derrière - probablement dans votre charge événement:

myDataList.ItemDataBound += DataList_ItemDataBound; 

Hope qui aide

+0

ont mis à jour mon code ... une erreur dans la logique ItemType –

+0

I w comme espérant quelque chose de moins verbeux ... myDataList.Controls [0] .Controls [1] .FindControl ("control") etc. Mais puisque c'est la seule réponse qui fonctionne, merci. – Nick

Questions connexes