2010-08-19 7 views
2

J'ai un listview que je voudrais remplir avec des contrôles utilisateur auto-créés. Mais le problème est que les propriétés du contrôle utilisateur ne sont pas définies. Les commandes utilisateur sont affichées mais les valeurs de propriété que je saisis ne sont pas définies. Pourquoi donc?Ajout d'une liste de contrôles utilisateur Web créés à un listview dans codebehind échoue

Voici le code aspx.

<div id="productView" class="productsMain"> 
    <div id="groupHeader" class="productsGroupHeader"> 
     <asp:Label ID="lblGroupHeader" runat="server" Text="Gruppe" /> 
    </div> 
    <asp:ListView ID="pListView" runat="server"> 
     <LayoutTemplate> 
      <ul class="productListView" id="pList"> 
       <asp:PlaceHolder ID="itemPlaceHolder" runat="server"></asp:PlaceHolder> 
      </ul> 
     </LayoutTemplate> 
     <ItemTemplate> 
      <li> 
       <uc:Product ID="ucProduct" runat="server" /> 
      </li> 
     </ItemTemplate> 
     <EmptyDataTemplate> 
      <div> 
       Beklager - det er for tiden ingen varer i denne produktgruppen. 
      </div> 
     </EmptyDataTemplate> 
    </asp:ListView>  
</div> 

Et voici le code derrière

protected void Page_Load(object sender, EventArgs e) 
{ 
    Control product1 = LoadControl(@"~/UserControls/Product.ascx"); 
    ((UserControls_Product)product1).Test = 9999; 
    Control product2 = LoadControl(@"~/UserControls/Product.ascx"); 
    ((UserControls_Product)product2).Test = 8888; 

    List<UserControls_Product> l = new List<UserControls_Product>(); 
    l.Add((product1 as UserControls_Product)); 
    l.Add(product2 as UserControls_Product));  
    pListView.DataSource = l; 
    pListView.DataBind(); 
} 

Répondre

1

Je pense à nouveau la question ici et je pense que c'est tout à fait différente de la façon dont vous avez besoin de le manipuler.

Vous créez des contrôles et vous les envoyez dans le répéteur, mais le répéteur lui-même crée les mêmes contrôles dans chaque ligne. Ce que vous devez envoyer est seulement les paramètres.

Vous faites une liste avec int et vous envoyez à votre contrôle ces valeurs. Ensuite, c'est à vous de contrôler ce dont vous avez besoin. Par exemple.

protected void Page_Load(object sender, EventArgs e) 
{ 
    List<int> MyParam = new List<int>(); 

    MyParam.add(9999); 
    MyParam.add(8888); 

    pListView.DataSource = MyParam; 
    pListView.DataBind(); 
} 

public int GetTheProductID(object oItem) 
{ 
    return (int)oItem; 
} 

Et voici comment vous obtenez et envoyez vos paramètres à votre contrôle.

<ItemTemplate> 
    <li> 
     <uc:Product ID="ucProduct" runat="server" ProductID="<%#GetTheProductID(Container.DataItem)%>" /> 
    </li> 
</ItemTemplate> 

maintenant dans votre contrôle que vous avez un ProductID public que vous pouvez utiliser plus tard Page_Load()

Vous pouvez utiliser non seulement int, mais la classe ou struct à la liste d'envoyer beaucoup de données.

+0

J'ai essayé d'ajouter la liste à Page_Init et j'ai le DataBind dans Page_Load mais cela n'a pas aidé. D'autres réflexions sur ce problème? – seddler

+0

@seddler J'ai changé le chemin de la solution, cela fonctionne à coup sûr et c'est un meilleur et un bon. – Aristos

+0

Réservoirs beaucoup !!! Cela a sauvé ma journée. Votre solution a fonctionné parfaitement. – seddler