我有一个ASP.NET Web表单DropDownList的这种意外行为。我将ListItems添加到下拉列表中,一切看起来都很好。除了ddl中的值(在我的情况下是Id)从未设置,它将被ListItem中的文本替换。
<asp:DropDownList ID="ddl1" runat="server">
</asp:DropDownList>
private void Populate()
{
List<ListItem> list = new List<ListItem>();
foreach (var item in GetItems())
{
list.Add(new ListItem(item.name, item.id.ToString()));
//in the drop down list the ListItem.Value is being replaced
//by ListItem.Text when it is added to the ddl
}
ddl1.DataSource = list;
ddl1.DataBind();
ddl1.Items.Add(new ListItem("Make a selection"));
}
private List<Stuff> GetItems()
{
List<Stuff> list = new List<Stuff>();
list.Add(new Stuff{ name = "bill", id = 1});
list.Add(new Stuff{ name = "james", id = 2});
return list;
}
private struct Stuff
{
public string name;
public int id;
}
任何想法,如果这是意味着发生?如果是如何在ddl中存储名称和ID?
答案 0 :(得分:4)
尝试设置DataTextField和DataValueField属性:
ddl1.DataTextField = "Text";
ddl1.DataValueField = "Value";
答案 1 :(得分:4)
在你的populate方法中,你是数据绑定,但没有指定哪个属性应该绑定到列表项列表中的哪个值。
为此,您需要设置DataTextField和DataValueField属性。
您可能会发现将Populate代码更改为以下内容更简单:
private void Populate()
{
foreach (var item in GetItems())
{
ddl1.Items.Add(new ListItem(item.name, item.id.ToString()));
}
ddl1.Items.Insert(0, new ListItem("Make a selection"));
}
甚至:
private void Populate()
{
GetItems().ForEach(x => dd1.Items.Add(new ListItem(x.name, x.id.ToString())));
ddl1.Items.Insert(0, new ListItem("Make a selection"));
}
即。只需将您的项目直接添加到DropDownList即可。
在原始示例中,要使用数据绑定,不需要创建ListItem列表。你可以直接对数据进行数据处理;在这种情况下,您的代码变为:
private void Populate()
{
dd1.DataTextField = "name";
dd1.DataValueField = "id"
dd1.DataSource = GetItems();
ddl1.Items.Insert(0, new ListItem("Make a selection"));
}
即。你可以直接将数据绑定到一个东西列表,只要你告诉DropDownList从哪里获取它的值。许多人更喜欢这个模型,因为SelectedItem然后是一个Stuff,而不是一个字符串,所以你有直接表示项目的对象。缺点是你的ViewState变大了; - )