Pergunta

Eu tenho um controle de repetidora aninhada que exibe uma lista de dados, no meu caso, é uma lista de perguntas frequentes. aqui é a parte de design:

<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>

O repetidor que eu estou interessado em é o segundo repetidor, listItems. No meu código-behind, eu não posso chamar diretamente listItems e ver os controles dentro dele. Tentei agarrar o interior controle de list.DataBinding (talvez eu preciso usar um evento diferente?) Método:

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

mas isso surge como null. Alguém pode me dar algumas dicas / dicas do que eu preciso fazer para ter acesso ao repetidor listItems e é controles crianças?

Obrigado!

Foi útil?

Solução

lists

pertence a cada RepeaterItem, não diretamente ao próprio Repeater.

Tente: -

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!";

          }
       }
    }
}

E você deve ser bom:)

Editado incorporar refinamento útil do DavidP.

Outras dicas

Você precisa mudar essa linha para

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

Você está perto! Dentro de seu manipulador de eventos verificar as RepeaterItemEventArgs para que tipo de linha que você está lidando. Sua repetidora criança só estará disponível em linhas (Alt) Item, não cabeçalhos e rodapés. Meu palpite é que ele está explodindo no cabeçalho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top