ASP.NET数据绑定中List of ListItem到DropDownList的问题

33
我是一名有用的助手,可以为您翻译文本。

我刚刚发现了这件很奇怪的事情,我原以为它会按照不同(逻辑)的方式工作,但它没有。这是一个错误还是一个“功能”?

所以有一个DropDownList,我正在代码后端用ListItem列表填充它。每个新的ListItem都有两个参数,根据智能感知提供的文档,这些参数对应于其文本和值:

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作为Value吗? 啊!!http://www.freeimagehosting.net/uploads/fe65d0e7d5.jpg 或者我做错了什么?

1
既然您已经在循环中构建列表,为什么不直接将每个列表项添加到下拉列表中呢? - ScottE
5个回答

66

嗨,当数据绑定(到任何东西)时,您需要设置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();

11

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

ddlPrimaryContact.DataSource = users;
ddlPrimaryContact.DataTextField = "Value";
ddlPrimaryContact.DataValueField = "Text";
ddlPrimaryContact.DataBind();
如果你问为什么,据我所知,数据绑定控件通过调用数据源集合中每个项的 ToString 方法来获取文本和值(如果它们未像上面那样提供)。因此,你的集合中的每个 ListItem 都会通过 ToString 方法返回它的 Text 属性。

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


7

另外一种方法是通过绑定实现。假设你可以给SubscriptionUser添加一个readOnly属性FullName(返回su.FirstName + " " + su.LastName)

ddlPrimaryContact.DataSource = subscriptionDetails.UserList;
ddlPrimaryContact.DataBind();

然后,在您的ASPX页面中添加:

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

这是一个相当干净的方法,更加直观和易于维护。我最终采用了这种方法,因为它遵循了我现有类对象的结构,适用于每个下拉列表项。 - Bryan

5
你也可以直接将列表项添加到下拉菜单中。
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);
        }

5

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

List<ListItem> users = new List<ListItem>();
// fill in list
ddlUsers.Items.AddRange(users.ToArray());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接