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.
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" />
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();
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());
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.
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;
}
}
}