将ListItem的ASP.NET列表数据绑定到DropDownList问题

将ListItem的ASP.NET列表数据绑定到DropDownList问题,asp.net,data-binding,list,drop-down-menu,listitem,Asp.net,Data Binding,List,Drop Down Menu,Listitem,我刚刚遇到了一件奇怪的事情,我原本希望以一种不同的(逻辑的)方式工作,但事实并非如此。它是一个bug还是一个“特性” 这里有一个下拉列表,我在codebehind中填充了一个ListItem列表。根据intellisense提供的文档,每个新ListItem获得2个参数,这些参数对应于其文本和值: List<ListItem> users = new List<ListItem>(); foreach (SubscriptionUser su in subscriptio

我刚刚遇到了一件奇怪的事情,我原本希望以一种不同的(逻辑的)方式工作,但事实并非如此。它是一个bug还是一个“特性”

这里有一个下拉列表,我在codebehind中填充了一个ListItem列表。根据intellisense提供的文档,每个新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();
列表用户=新列表();
foreach(subscriptionDetails.UserList中的SubscriptionUser su)
{
添加(新列表项(su.FirstName+“”+su.LastName,su.EmailAddress));
}
ddlPrimaryContact.DataSource=用户;
ddlPrimaryContact.DataBind();
现在,有人能解释一下为什么数据绑定DropDownList将文本和值设置为完全相同(ListItem文本),而不是使用ListItem.Text作为文本,使用ListItem.Value作为值吗

还是我做错了什么?

嗨,当数据绑定(到任何内容)时,您需要设置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();
列表用户=新列表();
foreach(subscriptionDetails.UserList中的SubscriptionUser su)
{
添加(新列表项(su.FirstName+“”+su.LastName,su.EmailAddress));
}
ddlPrimaryContact.DataTextField=“Text”;
ddlPrimaryContact.DataValueField=“Value”;
ddlPrimaryContact.DataSource=用户;
ddlPrimaryContact.DataBind();

您应该将下拉列表绑定为:

ddlPrimaryContact.DataSource = users;
ddlPrimaryContact.DataTextField = "Value";
ddlPrimaryContact.DataValueField = "Text";
ddlPrimaryContact.DataBind();

如果您问为什么,据我所知,数据绑定控件通过调用数据源集合中每个项的ToString方法来获取文本和值(如果它们没有像上面那样提供)。因此,集合中的每个ListItem都通过ToString方法返回其文本属性。

或者,您可以通过这种方式绑定它。(假设您可以向名为FullName(返回su.FirstName+“”+su.LastName)的SubscriptionUser添加只读属性)

然后,在您的ASPX页面中放入:

<asp:DropDownList id="ddlPrimaryContact" runat="server" DataTextField="FullName" DataValueField="EmailAddress" />

您也可以直接将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);
        }
列表用户=新列表();
对于(int count=0;count<10;count++)
{
ListItem li=new ListItem(“列表”+count.ToString(),count.ToString());
ddl.Items.Add(li);
}

有一种方法可以将ListItem项目添加到DropDownList,并使.NET自动将ListItem的文本与DropDownList的文本匹配,其值也相同:

List<ListItem> users = new List<ListItem>();
// fill in list
ddlUsers.Items.AddRange(users.ToArray());
列表用户=新列表();
//填表
ddlUsers.Items.AddRange(users.ToArray());

既然您已经在循环构建列表,为什么不直接将每个列表项添加到dropdownlist中呢?这是一个非常干净的方法,更直观,更易于维护。我最终使用了这个方法,因为它遵循了我现有的类对象对每个dropdownlist项的结构。
List<ListItem> users = new List<ListItem>();
// fill in list
ddlUsers.Items.AddRange(users.ToArray());