为什么将DropDownList数据绑定到List<String>不起作用?

3

我正在尝试将一个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个回答

1

是的,这种方法应该可行,以下是为什么它目前不起作用的原因:

  • 使用 DataBind 完成的 DropDownList 需要一个 DataSource。这就是为什么尝试 #1 不起作用的原因。
  • 如果你绑定到一个 List<string>,那么就没有明确的键/值对可以绑定。这就是为什么当绑定到一个 List<Person>(例如)时,你需要在 Person 类中重写 .ToString() 来提供键/值绑定,或手动设置 DataTextFieldDataValueField
  • 对于一个 string,ASP.NET 没有办法找出一个键/值对。

考虑一下你想要的 HTML。对于一个简单的字符串,应该是什么键/值呢?这没有意义。

既然你并不真正关心“键”(只关心显示的内容),我建议你绑定到一个 Dictionary<TKey,TValue>

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


0
这里的问题在于CreateChildControls。在我尝试让它工作的过程中,我添加了这个初始化控件的方法。这是不必要的,实际上会导致数据绑定被清除,因为它在OnLoad之后由框架自动调用。
解决方案是删除这个方法和对EnsureChildControls的调用。

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