2009-07-29 6 views
1

J'ai un contrôle répéteur imbriqué qui affiche une liste de données, dans mon cas c'est une liste de FAQ. voici la partie de conception:Modifier la valeur du contrôle de la base de données dans les répéteurs en 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> 

Le répéteur que je suis intéressé est le deuxième répéteur, listItems. Dans mon code-behind, je ne peux pas appeler directement listItems et voir les contrôles à l'intérieur de celui-ci. J'ai essayé de prendre le contrôle à l'intérieur de list.DataBinding (peut-être que je dois utiliser un autre événement?) Méthode:

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

mais ce qui se présente comme null. Quelqu'un peut-il me donner quelques conseils/conseils sur ce que je dois faire pour avoir accès au répéteur listItems et à ses commandes pour enfants?

Merci!

Répondre

3
lists 

appartient à chaque RepeaterItem, pas directement au répéteur 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 :)

modifié pour incorporer le raffinement utile de DavidP.

+0

Merci, fonctionne bien: D – Anders

+0

Pas de problèmes. La hiérarchie des contrôles ASP .NET est belle une fois que vous le connaissez :) –

1

Vous devez changer cette ligne à

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

Merci pour cela, j'ai complètement oublié haha. Donc, une fois que je reçois ce oRepeater, comment puis-je obtenir le littéral de contrôle? – Anders

+0

Pensez que je vous ai couvert dans ma réponse maintenant, monsieur :) –

+0

Vous pouvez ajouter l'attribut OnItemDataBinding = "listItems_ItemDataBound" à la balise de répétition listItems. Vous n'avez pas besoin de parcourir tous ses éléments. –

0

Vous êtes proche! À l'intérieur de votre gestionnaire d'événements, vérifiez RepeaterItemEventArgs pour savoir quel type de ligne vous utilisez. Votre répéteur enfant ne sera disponible que sur les lignes (Alt), pas les en-têtes ou les pieds de page. Je suppose que c'est exploser sur l'en-tête.

Questions connexes