【问题标题】:Drop Down List unexpected behaviour下拉列表意外行为
【发布时间】:2012-07-07 08:27:22
【问题描述】:

我在使用 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?

【问题讨论】:

  • 如果您想使用数据绑定,则无需创建 ListItems 的中间列表 - 您可以直接绑定到内容列表 - 我提供了一个示例。

标签: c# asp.net drop-down-menu webforms


【解决方案1】:

在您的填充方法中,您是数据绑定,但没有指定哪个属性应该绑定到列表项列表中的哪个值。

为此,您需要设置DataTextFieldDataValueField 属性。

您可能会发现将填充代码更改为以下内容更简单:

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 变得更大了 ;-)

【讨论】:

  • 啊,如果我这样做,我还需要调用 Databind() 吗?
  • 不 - 这不是必需的。由于您在本地采购列表,因此实际上不需要数据绑定。注意 使用 DataBinding 没有问题,但您可能希望在下拉列表中查看如何混合数据绑定和非数据绑定项目的答案:stackoverflow.com/questions/1997220/…
  • 谢谢,我直接用 .ForEach 插入 ddl,因为它感觉最干净。
【解决方案2】:

尝试设置DataTextFieldDataValueField 属性:

ddl1.DataTextField = "Text";
ddl1.DataValueField = "Value";

【讨论】:

  • 在我之前到达那里 :-) +1
  • 很好用,谢谢。我应该早点在这里问这个问题,而不是老老实实挠头。
  • @dash 是的,你提供了更长的答案(如果它更短,那么你会是第一个:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-25
  • 2012-02-19
  • 2014-06-10
  • 2014-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多