2010-10-22 48 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>而不是。

要麼讓你的方法返回,要麼遍歷列表並用索引將它們添加到字典中。