2009-07-29 5 views
1

Ich habe ein verschachteltes Repeater-Steuerelement, das eine Liste von Daten anzeigt, in meinem Fall ist es eine FAQ-Liste ist. hier ist der Teil Design:änderte Wert von Databound-Steuerung innerhalb Wiederholer in C#

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

Der Repeater, dass ich interessiert bin in der zweiten Repeater, listItems. In meinem Code-Behind kann ich listItems nicht direkt aufrufen und die Steuerelemente darin sehen. Ich versuchte, die Kontrolle innerhalb von list.DataBinding zu greifen (vielleicht brauche ich ein anderes Ereignis benutzen?) Methode:

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

aber dies kommt als null. Kann mir jemand einige Hinweise geben, was ich tun muss, um Zugang zum listItems Repeater und seinen Kindersteuerungen zu bekommen?

Danke!

Antwort

3
lists 

zu jedem RepeaterItem gehört zu ändern, nicht direkt an den Repeater selbst.

Versuchen: -

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

      } 
     } 
    } 
} 

Und Sie sollten :)

Edited gut DavidP ist hilfreich Verfeinerung zu integrieren.

+0

Danke, funktioniert super: D – Anders

+0

Keine Probs. Die ASP.NET-Steuerhierarchie ist schön, sobald Sie es kennen lernen :) –

1

Sie müssen diese Zeile

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

Danke dafür, ich habe es komplett vergessen haha. Sobald ich diesen oRepeater bekomme, wie bekomme ich das Kontrollliteral? – Anders

+0

glaube, ich habe Sie in meiner Antwort bedeckt bekam jetzt, Sir :) –

+0

Anders Sie das Attribut hinzufügen können OnItemDataBinding = „listItems_ItemDataBound“ der listitems-Repeater-Tag. Sie müssen nicht alle Items durchlaufen. –

0

Sie sind nah dran! In Ihrem Event-Handler überprüfen Sie die RepeaterItemEventArgs nach welcher Art von Zeile Sie handeln. Ihr Child Repeater ist nur in (Alt) Item-Zeilen verfügbar, nicht in Kopf- oder Fußzeilen. Meine Vermutung ist, dass es auf dem Header explodiert.

Verwandte Themen