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

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

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

Если у человека есть 3 свойства...

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

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

Ответ 1

Попробуйте следующее:

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" />

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

Таким образом, что-то вроде этого должно работать на вас:

        //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, а также проверяете, есть ли у списка уже элементы или нет.