Как я могу привязать объект Data List> List к DropDownList и установить SelectedItem на основе свойства объекта?

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

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

Где человек имеет 3 свойства...

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

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

5 ответов

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

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

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

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

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

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

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

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

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

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

    private void SetSelected(int id)
    {
        foreach (ListItem li in list.Items)
        {
            li.Selected = false;
            if (li.Value == id.ToString())
            {
                li.Selected = true;
            }
        }
    }
Другие вопросы по тегам