Question

J'ai un contrôle de répéteur imbriqué qui affiche une liste de données, dans mon cas c'est une liste de FAQ. voici la partie conception:

<asp:Repeater ID="lists" runat="server">
    <ItemTemplate>
        <h2 class="sf_listTitle"><asp:Literal ID="listTitle" runat="server"></asp:Literal></h2>

        <p class="sf_controlListItems">
            <a id="expandAll" runat="server">
                <asp:Literal ID="Literal1" runat="server" Text="<%$Resources:ExpandAll %>"></asp:Literal>
            </a>
            <a id="collapseAll" runat="server" style="display:none;">
                <asp:Literal ID="Literal2" runat="server" Text="<%$Resources:CollapseAll %>"></asp:Literal>
            </a>
        </p>

        <ul class="sf_expandableList" id="expandableList" runat="server">
            <asp:Repeater ID="listItems" runat="server">
                <HeaderTemplate>
                </HeaderTemplate>
                <ItemTemplate>
                    <li>
                        <h1 id="headlineContainer" runat="server" class="sf_listItemTitle">
                            <a id="headline" runat="server" title="<%$Resources:ClickToExpand %>"></a>
                        </h1>
                        <div id="contentContainer" runat="server" class="sf_listItemBody" style="display:none;">
                            <asp:Literal ID="content" runat="server"></asp:Literal>
                        </div>
                    </li>
                </ItemTemplate>
                <FooterTemplate>
                </FooterTemplate>
            </asp:Repeater>
        </ul>
    </ItemTemplate>
</asp:Repeater>

Le répéteur qui m'intéresse est le deuxième répéteur, listItems . Dans mon code-behind, je ne peux pas appeler directement listItems et voir les contrôles qu'il contient. J'ai essayé de récupérer le contrôle à l'intérieur de la méthode list.DataBinding (peut-être dois-je utiliser un autre événement?):

void lists_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    var oRepeater = (Repeater) lists.FindControl("listItems");
}

mais cela se présente sous la forme null . Quelqu'un peut-il me donner des indications / conseils sur ce que je dois faire pour accéder au répéteur listItems et à ses contrôles enfants?

Merci!

Était-ce utile?

La solution

lists

appartient à chaque RepeaterItem et non directement au Repeater lui-même.

Essayez: -

void lists_ItemDataBound(object sender, RepeaterItemEventArgs e)
{


    if ( e.Item.ItemType == ListItemType.AlternatingItem 
        || e.Item.ItemType == ListItemType.Item )
    {
       Repeater oRepeater = (Repeater)e.Item.FindControl("listItems");

       // And to get the stuff inside.
       foreach ( RepeaterItem myItem in oRepeater.Items )
       {
          if ( myItem.Item.ItemType == ListItemType.AlternatingItem 
              || myItem.Item.ItemType == ListItemType.Item )  
          {
             Literal myContent = (Literal)myItem.FindControl("content");

             // Do Something Good!
             myContent.Text = "Huzzah!";

          }
       }
    }
}

Et vous devriez être bon:)

Édité pour intégrer le raffinement utile de DavidP.

Autres conseils

Vous devez modifier cette ligne en

var oRepeater = (Repeater) e.Item.FindControl("listItems");

Vous êtes proches! Dans votre gestionnaire d'événements, recherchez dans RepeaterItemEventArgs le type de ligne que vous utilisez. Votre répéteur enfant ne sera disponible que sur les lignes (Alt) Item, et non sur les en-têtes ou les pieds de page. Je suppose que cela explose sur l'en-tête.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top