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

Posted

技术标签:

【中文标题】将 ListItem 的 ASP.NET 列表数据绑定到 DropDownList 问题【英文标题】:Databind ASP.NET List of ListItem to DropDownList issue 【发布时间】:2010-11-18 22:21:42 【问题描述】:

我刚刚遇到这个奇怪的事情,我希望以不同的(逻辑)方式工作,但事实并非如此。是错误还是“功能”?

所以我在代码隐藏中填充了一个 DropDownList,其中包含一个 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 作为 Value?

ARGH!! http://www.freeimagehosting.net/uploads/fe65d0e7d5.jpg

还是我做错了什么?

【问题讨论】:

既然您已经在循环构建列表,为什么不直接将每个列表项添加到下拉列表中? 【参考方案1】:

有一种方法可以将 ListItem 项添加到 DropDownList 并让 .NET 自动将 ListItem 的文本与 DropDownList 的文本匹配,对于值也是如此:

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

【讨论】:

【参考方案2】:

您也可以直接将 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);
        

【讨论】:

【参考方案3】:

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

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

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

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

【讨论】:

这是一个相当干净的方法,它更直观且可维护。我最终使用了这个方法,因为它遵循了每个下拉列表项的现有类对象的结构。【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于将 ListItem 的 ASP.NET 列表数据绑定到 DropDownList 问题的主要内容,如果未能解决你的问题,请参考以下文章

如何将属性添加到输入标签 asp.net 内的 RadioButtonList 项

如何隐藏单选按钮列表中的单选按钮之一?

WCF 服务将数据填充到 ASP.net 下拉列表(学习 WCF 服务)

ASP.NET SignalR - 无法将存储在数据库中的消息列表发送给用户

ASP.Net错误列表将截断字符串或二进制数据是怎么造成的?

如何将此表中的数据作为列表提交到asp.net mvc中的操作? [关闭]