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