我刚刚遇到过这种奇怪的事情,我期望以不同的(合乎逻辑的)方式工作,但事实并非如此。这是一个错误还是一个“功能”?
所以有一个DropDownList,我在Listbehind中使用ListItem列表填充。根据智能感知提供的文档,每个新的ListItem都有2个参数对应于它的文本和值:
List<ListItem> users = new List<ListItem>();
foreach (SubscriptionUser su in subscriptionDetails.UserList)
{
users.Add(new ListItem(su.FirstName + " " + su.LastName, su.EmailAddress));
}
ddlPrimaryContact.DataSource = users;
ddlPrimaryContact.DataBind();
现在,有人可以解释为什么数据绑定DropDownList将Text和Value设置为完全相同(ListItem文本)而不是使用ListItem.Text作为Text和ListItem.Value作为值吗?
ARGH!! http://www.freeimagehosting.net/uploads/fe65d0e7d5.jpg
或者我做错了什么?
答案 0 :(得分:58)
您在数据绑定(对任何事物)时需要设置DropDownList的DataTextField和DataValueField。在您的情况下,您应该使用以下代码
List<ListItem> users = new List<ListItem>();
foreach (SubscriptionUser su in subscriptionDetails.UserList)
{
users.Add(new ListItem(su.FirstName + " " + su.LastName, su.EmailAddress));
}
ddlPrimaryContact.DataTextField = "Text";
ddlPrimaryContact.DataValueField = "Value";
ddlPrimaryContact.DataSource = users;
ddlPrimaryContact.DataBind();
答案 1 :(得分:9)
您应该将下拉列表绑定为:
ddlPrimaryContact.DataSource = users;
ddlPrimaryContact.DataTextField = "Value";
ddlPrimaryContact.DataValueField = "Text";
ddlPrimaryContact.DataBind();
如果你问为什么,据我所知,数据绑定控件通过为数据源集合中的每个项调用 ToString 方法来获取文本和值(如果它们不像上面那样提供)。因此,集合中的每个ListItem都通过ToString方法返回它的Text属性。
答案 2 :(得分:5)
或者,你也可以用这种方式绑定它。 (假设您可以向SubscriptionUser添加一个名为FullName的readOnly属性(返回su.FirstName +“”+ su.LastName)
ddlPrimaryContact.DataSource = subscriptionDetails.UserList;
ddlPrimaryContact.DataBind();
然后,在你的ASPX页面中输入:
<asp:DropDownList id="ddlPrimaryContact" runat="server" DataTextField="FullName" DataValueField="EmailAddress" />
答案 3 :(得分:5)
您也可以直接将listitem添加到下拉列表中。
List<ListItem> users = new List<ListItem>();
for (int count = 0; count < 10; count++)
{
ListItem li = new ListItem("List " + count.ToString(), count.ToString());
ddl.Items.Add(li);
}
答案 4 :(得分:5)
有一种方法可以将ListItem项添加到DropDownList,并使.NET自动将ListItem的Text与DropDownList的Text匹配,并且值与Value相同:
List<ListItem> users = new List<ListItem>();
// fill in list
ddlUsers.Items.AddRange(users.ToArray());