web-dev-qa-db-ger.com

Wie kann ich eine Liste <> von Objekten an eine DropDownList binden und das SelectedItem basierend auf einer Eigenschaft im Objekt festlegen?

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.

11
user135799

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" />
19
Charlie Kilian

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();
4
Tim Hobbs

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());
2
faester

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.

0

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;
            }
        }
    }
0
goalie7960