我正在尝试将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();
}
}
这种方法应该有效吗?
如果应该,如何调试代码执行后会发生什么?
答案 0 :(得分:1)
是的,这种方法应该有效,这就是为什么它目前不是,
DataBind
完成的DropDownList需要DataSource
。这就是尝试#1无效的原因。List<string>
,则没有明确的键/值对要绑定。这就是为什么当绑定到List<Person>
(例如)时,您需要覆盖.ToString()
类中的Person
以提供键/值绑定,或者手动设置DataTextField
},DataValueField
。string
的键/值对。考虑您想要的 HTML 。什么应该是简单字符串的键/值?没有意义吗。
由于您并不真正关心“密钥”(仅显示内容),我建议您绑定到Dictionary<TKey,TValue>
。
让你的方法返回,或者遍历列表并将它们添加到带索引的字典中。
答案 1 :(得分:0)
这里的问题是CreateChildControls
。在我试图完成这项工作的某个地方,我添加了这个初始化控件的方法。这不是必需的,实际上导致数据绑定被消除,因为OnLoad
之后框架会自动调用它。
解决方案是删除此方法并调用EnsureChildControls
。