代码之家  ›  专栏  ›  技术社区  ›  Alex Angas Colin

为什么此DropDownList数据绑定到列表<string>不起作用?

  •  3
  • Alex Angas Colin  · 技术社区  · 14 年前

    我想绑一个 List<String> 到A 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 回复  |  直到 14 年前
        1
  •  1
  •   RPM1984    14 年前

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

    • 一个下拉列表 DataBind 需要一个 DataSource . 这就是为什么尝试1不起作用的原因。
    • 如果你绑定到 List<string> ,没有要绑定到的清晰的键/值对。这就是为什么当绑定到 List<Person> (例如),您需要重写 .ToString() Person 类以提供键/值绑定,或手动设置 DataTextField , DataValueField .
    • ASP.NET无法为 string .

    考虑 什么HTML 你想要。简单字符串的键/值应该是什么?这没道理。

    由于您不太关心“密钥”(只关心显示的内容),我建议您绑定到 Dictionary<TKey,TValue> 相反。

    要么让您的方法返回这个值,要么遍历列表并用索引将它们添加到字典中。

        2
  •  0
  •   Alex Angas Colin    14 年前

    这里的问题是 CreateChildControls . 在我尝试完成这项工作的过程中,我添加了一个初始化控件的方法。这是不必要的,实际上导致了数据绑定被清除,因为在 OnLoad .

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