为什么这个DropDownList数据绑定到List <string>不起作用?</string>

时间:2010-10-22 00:42:53

标签: asp.net data-binding user-controls drop-down-menu

我正在尝试将List<String>绑定到用户控件中的DropDownList。我认为我正在做正确的事情,但似乎在我的代码执行后绑定被清除。这是审查的代码!

用户控制:

<asp:DropDownList ID="subjectNameDropDown" runat="server"/>
<asp:DropDownList ID="yearLevelDropDown" runat="server"/>

自动生成的设计代码隐藏:

public partial class NewSiteMetadataUserControl {
    protected global::System.Web.UI.WebControls.DropDownList subjectNameDropDown;
    protected global::System.Web.UI.WebControls.DropDownList yearLevelDropDown;
}

代码隐藏:

public partial class NewSiteMetadataUserControl : UserControl
{
    protected override void CreateChildControls()
    {
        subjectNameDropDown = new DropDownList();
        yearLevelDropDown = new DropDownList();
    }

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        EnsureChildControls();

        // Attempt 1
        List<String> subjectNames = GetSubjectValues();
        foreach (var subjectName in subjectNames)
            subjectNameDropDown.Items.Add(subjectName);
        subjectNameDropDown.DataBind();

        // Attempt 2
        List<String> yearLevels = GetYearLevelValues();
        yearLevelDropDown.DataSource = yearLevels;
        yearLevelDropDown.DataBind();
    }
}

这种方法应该有效吗?

如果应该,如何调试代码执行后会发生什么?

2 个答案:

答案 0 :(得分:1)

是的,这种方法应该有效,这就是为什么它目前不是,

  • 使用DataBind完成的DropDownList需要DataSource。这就是尝试#1无效的原因。
  • 如果您绑定到List<string>,则没有明确的键/值对要绑定。这就是为什么当绑定到List<Person>(例如)时,您需要覆盖.ToString()类中的Person以提供键/值绑定,或者手动设置DataTextField },DataValueField
  • ASP.NET无法计算string的键/值对。

考虑您想要的 HTML 。什么应该是简单字符串的键/值?没有意义吗。

由于您并不真正关心“密钥”(仅显示内容),我建议您绑定到Dictionary<TKey,TValue>

让你的方法返回,或者遍历列表并将它们添加到带索引的字典中。

答案 1 :(得分:0)

这里的问题是CreateChildControls。在我试图完成这项工作的某个地方,我添加了这个初始化控件的方法。这不是必需的,实际上导致数据绑定被消除,因为OnLoad之后框架会自动调用它。

解决方案是删除此方法并调用EnsureChildControls