2009-09-16 4 views
1

Ceci est une suite de Populating DropDownList inside Repeater not working. J'ajoute une liste déroulante à l'intérieur d'un répéteur. Maintenant, je dois définir la valeur sélectionnée, mais plus facile à dire qu'à faire ...Impossible de définir SelectedValue pour DropDownList

Voici mon code:

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"); 
      DataRowView drw = (DataRowView)e.Item.DataItem; 

      for (int i = 1; i < 6; i++) 
      { 
       ddl.Items.Add(new ListItem(i.ToString(), i.ToString())); 
      } 
      ddl.DataBind(); // <- Not sure if this is needed here. 
      ddl.SelectedValue = drw.Row["lvl"].ToString(); 
     } 
    } 

drw.Row [ "lvl"] ToString() est une valeur de. 1 -5.

J'ai essayé de définir SelectedValue et SelectedIndex.

J'ai aussi essayé

ddl.SelectedValue = Convert.ToString(ddl.Items.FindByText(drw.Row["lvl"].ToString()).Value) ; 

Je suis à court d'idées.

Répondre

7

Whoa vous faites de cette façon plus compliquée qu'elle doit être. Ne faites pas cela sur ItemDataBound, faites-le sur la propriété DataBinding des contrôles.

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 < 6; i++) 
    { 
     ddl.Items.Add(new ListItem(i.ToString(), i.ToString())); 
    } 

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

Vous devriez essayer de faire votre databinding au niveau de contrôle au lieu de chercher des choses et ayant votre grille doit savoir ce qu'elle contient. Chaque contrôle peut prendre soin de lui-même;)

Je ne suis pas d'accord avec cette réponse donnée dans votre précédente question liée, pour utiliser l'événement ItemBound. Cet événement doit être utilisé au niveau de l'élément lorsque quelque chose doit affecter plus d'un contrôle.

Editer: J'ai également ajouté cette information à votre autre question, donc si elle se trouve dans le futur, d'autres n'utilisent pas l'événement ItemBound à cette fin.

+0

Yup, ça a bien marché :) – Steven

0

J'ai eu des problèmes avec ça par le passé. Je crois que la façon dont j'ai abordé cela était de trouver l'élément dans la liste déroulante et de définir la propriété sélectionnée sur true.

EDIT: Voici deux exemples - je préfère moi-même syntaxe FindByValue ...

YourDDL.ClearSelection(); 
foreach (ListItem item in YourDDL.Items) 
{ 
    if (item.Value == YourString) 
    { 
     item.Selected = true; 
     break; 
    } 
} 


YourDDL.Items.FindByValue("1").Selected = true; 
Questions connexes