web-dev-qa-db-fra.com

Comment puis-je DataBind une liste <> d'objets à une DropDownList et définir le SelectedItem basé sur une propriété dans l'objet?

Comment puis-je DataBind un List<> des objets à une DropDownList et définir le SelectedItem basé sur une propriété dans l'objet?

Par exemple, disons que j'ai un List<Person>

Où la personne a 3 propriétés ...

Person .Name (string)
       .Id  (int)
       .Selected (bool)

Je veux que le premier avec Selected == true soit le SelectedItem dans la liste.

11
user135799

Essaye ça:

List<Person> list = new List<Person>();
// populate the list somehow

if ( !IsPostBack )
{
    DropDownList ddl = new DropDownList();
    ddl.DataTextField = "Name";
    ddl.DataValueField = "Id";
    ddl.DataSource = list;
    ddl.DataBind();

    ddl.SelectedValue = list.Find( o => o.Selected == true ).Id.ToString();
}

Si vous ne pouvez pas garantir qu'il y aura toujours au moins un élément sélectionné, vous devrez le gérer séparément en vérifiant la valeur de retour de l'appel list.Find() pour vous assurer qu'il ne s'agit pas de la variable null.

En outre, DropDownList ddl = new DropDownList (); inutile si le formulaire Web a déjà déclaré:

<asp:DropDownList ID="ddl" runat="server" />
19
Charlie Kilian

Je crois que cela fonctionnera:

List<Person> people = GetDataFromSomewhere();
DropDownList ddl = new DropDownList();
ddl.DataTextField = "Name";
ddl.DataValueField = "Id";
ddl.DataSource = people;
ddl.DataBind();
ddl.SelectedValue = (from p in people
                     where p.Selected == true
                     select p.Id).FirstOrDefault().ToString();
4
Tim Hobbs

Si la partie 'Sélectionné' est impérative, vous pouvez également utiliser la liaison suivante: 

        List<Person> ps = new List<Person>();
        DropDownList dl = new DropDownList();
        dl.Items
           .AddRange(ps
            .Select(p => new ListItem() {
               Text = p.Name
               , Value = p.ID
               , Selected = p.Selected }).ToArray());
2
faester

J'avais la même question tout à l'heure, mais je me suis rendu compte que l'écriture du code pour ajouter manuellement les éléments de ma liste était plus courte ou aussi longue que les autres solutions décrites.

Ainsi, quelque chose comme ceci devrait fonctionner pour vous:

        //bind persons
        foreach(Person p in personList)
        {
            ListItem item = new ListItem(p.Name, p.Id.ToString());
            item.Selected = p.Selected;
            DropDownListPerson.Items.Add(item);
        }

Assurez-vous simplement de vérifier IsPostBack ainsi que de vérifier si la liste contient déjà des éléments ou non.

0
Rowan Jugernauth

Je ferais quelque chose comme ça après avoir été lié à la liste.

    private void SetSelected(int id)
    {
        foreach (ListItem li in list.Items)
        {
            li.Selected = false;
            if (li.Value == id.ToString())
            {
                li.Selected = true;
            }
        }
    }
0
goalie7960