Wie kann ich einen List<>
von Objekten an eine DropDownList binden und das SelectedItem basierend auf einer Eigenschaft im Objekt festlegen?
Angenommen, ich habe einen List<Person>
Wo Person 3 Eigenschaften hat ...
Person .Name (string)
.Id (int)
.Selected (bool)
Ich möchte, dass das erste mit Selected == true das SelectedItem in der Liste ist.
Versuche dies:
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();
}
Wenn Sie nicht garantieren können, dass immer mindestens ein Element ausgewählt ist, sollten Sie dies gesondert behandeln, indem Sie den Rückgabewert des Aufrufs list.Find()
überprüfen, um sicherzustellen, dass es sich nicht um null
handelt.
Außerdem DropDownList ddl = new DropDownList (); nicht erforderlich, wenn das Webformular bereits erklärt hat:
<asp:DropDownList ID="ddl" runat="server" />
Ich glaube, das wird funktionieren:
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();
Wenn der 'Ausgewählte' Teil zwingend erforderlich ist, können Sie auch Folgendes binden:
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());
Ich hatte gerade die gleiche Frage, aber ich fand heraus, dass das Schreiben des Codes zum manuellen Hinzufügen der Elemente aus meiner Liste kürzer war oder so lang wie bei anderen beschriebenen Lösungen.
So etwas sollte für Sie funktionieren:
//bind persons
foreach(Person p in personList)
{
ListItem item = new ListItem(p.Name, p.Id.ToString());
item.Selected = p.Selected;
DropDownListPerson.Items.Add(item);
}
Stellen Sie sicher, dass Sie IsPostBack überprüfen und prüfen, ob die Liste bereits Elemente enthält oder nicht.
Ich würde so etwas tun, nachdem ich mich an die Liste gebunden habe.
private void SetSelected(int id)
{
foreach (ListItem li in list.Items)
{
li.Selected = false;
if (li.Value == id.ToString())
{
li.Selected = true;
}
}
}