2008-12-23 6 views
0

Ceci est lié à mon earlier question, mais j'ai pensé que je le simplifierais et que j'en ferais un défi. Étant donné le code ci-dessous, pouvez-vous modifier la valeur de "ChangeThisLabel" du code derrière?Modifier les éléments dans le LayoutTemplate d'un ListView imbriqué

<asp:ListView ID="OuterListView" runat="server"> 
    <LayoutTemplate> 
     <asp:PlaceHolder ID="itemPlaceHolder" runat="server" /> 
    </LayoutTemplate> 
    <ItemTemplate> 
     <%#Eval("outer_value")%> <br/> 
     <asp:ListView ID="InnerListView" runat="server" DataSource='<%#Eval("inner") %>'> 
      <LayoutTemplate> 
       <asp:Label ID="ChangeThisLabel" runat="server" /> 
       <asp:PlaceHolder ID="itemPlaceHolder" runat="server" /> 
      </LayoutTemplate> 
      <ItemTemplate> 
       <%#Eval("inner_value")%> <br/> 
      </ItemTemplate> 
     </asp:ListView> 
    </ItemTemplate> 
</asp:ListView> 

Je suggère d'essayer vous-même avant de soumettre une réponse, comme je l'ai reçu beaucoup de suggestions dans mon précédent post qui fonctionnent bien pour un seul ListView, mais tomber en allant contre le ListView imbriquée.

Répondre

3

comme il a été mentionné dans l'autre réponse. dans le code derrière, la charge, vous pouvez le faire:

`OuterListView.FindControl("InnerListView").FindControl("ChangeThisLabel") 

jeté alors comme une étiquette et changer le texte. De toute évidence, vous devez itérer ce code dans une boucle pour que vous le fassiez pour chaque étiquette de la liste interne de chaque vue de liste externe.

Et concernant les réponses à votre autre question, vous n'étiez pas certain que vous vouliez y accéder à partir du code derrière. Aussi, vous pourriez vouloir poster ce que vous avez essayé, afin que les gens sachent que vous avez essayé différentes méthodes.

bonne chance!

modifier: au sujet de votre commentaire:

À moins que je me manque quelque chose, cela ne fonctionnera pas, parce que "ChangeThisLabel" devient "ctl00_ctl00_BodyContentPlaceHolder_ReportContentPlaceHolder _OuterListView_ctrl0_InnerListView_ChangeThisLabel" quand il est rendu par la ListView intérieure

vous avez raison, mais lorsque vous utilisez FindControl (id), il utilisera l'ID côté serveur pour rechercher le contrôle. Si vous faites: InnerListView.FindControl ("ChangeThisLabel") alors il trouvera le bon label indépendamment de l'ID côté client assigné à ce contrôle.

+0

Merci de m'indiquer dans la bonne direction. Mon problème était que j'essayais de trouver InnerListView en faisant OutListView.FindControl ("InnerListView"), en oubliant que InnerListView vivait sur chaque ligne (item) dans OuterListView, donc en boucle à travers la collection d'éléments m'a obtenu là. – gfrizzle

+0

pas de problème. bonne chance! – Victor

1

Dans votre gestionnaire d'événements DataBound (ou quelque chose comme ça), utilisez FindControl("ChangeThisLabel") pour obtenir une référence à l'étiquette. Bien sûr, vous devriez lancer le cast à Label avant d'utiliser la référence.

Vous pouvez écrire votre propre méthode FindControl que vous appellerez récursivement pour trouver le contrôle au niveau n.

+0

À moins que quelque chose ne me manque, cela ne fonctionnera pas, car "ChangeThisLabel" devient "ctl00_ctl00_BodyContentPlaceHolder_ReportContentPlaceHolder_OuterListView_ctrl0_InnerListView_ChangeThisLabel" lorsqu'il est rendu par le ListView interne. – gfrizzle

+0

Mon mauvais - je ne passais pas par la collection d'articles pour trouver l'InnerListView, ce qui explique pourquoi je n'avais pas de chance. – gfrizzle

Questions connexes