2009-09-16 9 views
4

J'essaie de remplir une liste déroulante à l'intérieur d'un répéteur, mais je ne réussis pas très bien. J'utilise probablement le mauvais EventArgs e.Remplir DropDownList dans Repeater ne fonctionne pas

Voici mon code ASPX:

 <asp:Repeater runat="server" id="criteriaScore"> 
      <HeaderTemplate> 
       <ul>   
       <li class="header"><span class="item">Kriterie</span><span class="value">Poeng</span><span class="description">Beskrivelse</span></li> 
      </HeaderTemplate> 
      <ItemTemplate> 
       <li> 
        <span class="item"> <%# Eval("criteria") %>:</span> 
        <asp:DropDownList id="ddlRating" runat="server" autopostback="true" enableviewstate="false"></asp:DropDownList> 
        <span class="value score<%# Eval("lvl") %>" title="<%# Eval("description") %>"> </span> 
       </li> 
      </ItemTemplate> 
      <FooterTemplate> 
       </ul> 
      </FooterTemplate> 
     </asp:Repeater> 

Et le code derrière:

protected void criteriaScore_ItemDataBound(object sender, DataListCommandEventArgs e) 
    { 
     DropDownList ddl = (DropDownList)e.Item.FindControl("ddlRating"); 

     for(int i=1; i > 5; i++) 
     { 
      ddl.Items.Add(new ListItem(i.ToString(), i.ToString())); 
     } 
    } 

Quelqu'un peut-il s'il vous plaît me guider sur le droit chemin? :)

+0

Vous devez déboguer l'application, en particulier sur la ligne Items.Add pour vous assurer que cela se produit. –

+0

Je ne suis pas capable d'obtenir le débogage de travailler avec Visual Web Developer 2008 :( – Steven

Répondre

21

Depsite les autres réponses à cette question, l'événement ItemDataBound ne doit pas être utilisé pour lier des données de contrôle, faites cela au niveau du contrôle.

Dans votre dropdownlist définir l'événement DataBinding:

<asp:DropDownList runat="server" ID="ddlYourDDL" OnDataBinding="ddlYourDDL_DataBinding"> 

mettre en œuvre ensuite l'événement OnDataBinding:

protected void ddlYourDDL_DataBinding(object sender, System.EventArgs e) 
{ 
    DropDownList ddl = (DropDownList)(sender); 
    for (int i = 1; i < 5; i++) 
    { 
     ddl.Items.Add(new ListItem(i.ToString(), i.ToString())); 
    } 

    // Now that the items are all there, set the selected property 
    ddl.SelectedValue = Eval("selectedfieldname").ToString(); 
} 

Vous devriez essayer de faire tous votre databinding au niveau de contrôle au lieu de rechercher choses et avoir votre grille doivent savoir ce qu'il contient. Chaque contrôle peut prendre soin de lui-même;) De cette façon, il est beaucoup plus facile d'ajouter et de supprimer des contrôles à votre modèle et de garder ces changements isolés.

+0

Merci. La réponse ci-dessus fonctionne, mais puisque c'est une meilleure pratique, je vais aller pour cette solution :) – Steven

+1

+1 simple belle réponse –

+2

+1 bonne pratique –

0
criteriaScore_ItemDataBound private void

(source objet, RepeaterCommandEventArgs e)

6
for(int i=1;i > 5;i++) 

devriez lire ...

for(int i=1;i < 5 ;i++) 
+0

+1, d'ailleurs il est normalement considéré comme une bonne pratique pour commencer à itérer avec 'i = 0' – Juri

1

Dans le .aspx Page:

<asp:Repeater runat="server" id="criteriaScore" 
       OnItemDataBound="criteriaScore_ItemDataBound"> 

Dans le Code-Behin d:

protected void criteriaScore_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 

    // This event is raised for the header, the footer, separators, and items. 

    // Execute the following logic for Items and Alternating Items. 
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == 
     ListItemType.AlternatingItem) 
    { 
     DropDownList ddl = (DropDownList)e.Item.FindControl("ddlRating"); 

     for(int i=0; i < 5; i++) 
     { 
      ddl.Items.Add(new ListItem(i.ToString(), i.ToString())); 
     } 
    } 
} 
+0

Merci, cela a fait l'affaire :) – Steven

0

Quelle que soit la façon dont la méthode est mise en œuvre (il y a quelques façons), l'événement ItemDataBound n'est pas attaché au répéteur dans le balisage.

0

Change: for (int i = 1; i> 5; i ++) Pour: for (int i = 1; i < 5; i ++)

Ou:

using System.Linq; 

    ddl.DataSource = Enumerable.Range(1, 5); 
    ddl.DataBind(); 
    ddl.SelectedValue = yourValue