Как я могу привязать объект Data List> List к DropDownList и установить SelectedItem на основе свойства объекта? - PullRequest
12 голосов
/ 06 мая 2011

Как мне связать DataBind List<> объектов с DropDownList и установить SelectedItem на основе свойства объекта?

Например, скажем, у меня есть List<Person>

Где Person имеет 3 свойства ...

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

Я хочу, чтобы первое с Selected == true было SelectedItem в списке.

Ответы [ 5 ]

20 голосов
/ 06 мая 2011

Попробуйте это:

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

Если вы не можете гарантировать, что всегда будет хотя бы один выбранный элемент, вам нужно будет обработать это отдельно, проверив возвращаемое значение из вызова list.Find(), чтобы убедиться, что оно не null.

Также, DropDownList ddl = new DropDownList (); не требуется, если веб-форма уже объявила:

<asp:DropDownList ID="ddl" runat="server" />
4 голосов
/ 06 мая 2011

Я считаю, что это будет работать:

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();
2 голосов
/ 06 мая 2011

Если часть «Выбранная» является обязательной, вы также можете связать ее с помощью следующего:

1 голос
/ 04 марта 2017

У меня был тот же вопрос только сейчас, но я понял, что написание кода для ручного добавления элементов из моего Списка было короче или дольше, чем другие решения, описанные.Вы:

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

Просто убедитесь, что проверили IsPostBack, а также проверили, есть ли в списке элементы или нет.

0 голосов
/ 06 мая 2011

Я бы сделал что-то подобное после привязки к списку.

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