2010-10-22 28 views
3

我试图将List<String>绑定到用户控件中的DropDownList。我认为我正在做正确的事情,但似乎在我的代码执行绑定被清除。这是审查的代码!为什么DropDownList数据绑定到列表<String>不起作用?

用户控制:

<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(); 
    } 
} 

这种方法应该如何工作?

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

回答

0

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

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

1

是,这种方法应该工作,这里就是为什么它目前不是,

  • DataBind做一个DropDownList需要DataSource。这就是为什么尝试#1不工作。
  • 如果您绑定到List<string>,则没有要绑定的明确键值对。这就是为什么当绑定到List<Person>(例如)时,您需要覆盖Person类中的.ToString()以提供键/值绑定,或手动设置DataTextField,DataValueField
  • ASP.NET没有办法为string找出键/值对。

想想你想要什么HTML。什么应该是一个简单的字符串的关键/价值?没有意义吧。因为你并不真正关心“钥匙”(只显示什么),所以我建议你绑定到Dictionary<TKey,TValue>而不是。

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

相关问题