オブジェクトのList<>
をDropDownListにDataBindし、オブジェクトのプロパティに基づいてSelectedItemを設定するにはどうすればよいですか?
たとえば、List<Person>
があるとします
Personに3つのプロパティがある場合...
Person .Name (string)
.Id (int)
.Selected (bool)
Selected == trueの最初のものをリストのSelectedItemにしたい。
これを試して:
_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();
}
_
選択されたアイテムが常に少なくとも1つあることを保証できない場合は、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;
}
}
}