2010-04-18 54 views
0

我有一個相當大的應用程序,它有幾百個DDL和Yes/No ListItems。爲了節省一些時間,我創建了一個擴展標準DDL的自定義控件。擴展一個DropDownList控件

這一切似乎工作正常,但我在代碼中分配SelectedValue屬性時出現一些問題,其中所選值似乎對控件沒有影響。我想知道是否應該在Init或PagePreLoad中添加我的項目?我應該在添加列表項之前還是之後調用base.OnInit?這主要是有效的,但不是100%。 (V3.5)

public class YesNoDropDownList : DropDownList 
{ 
    protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 

     if (!Page.IsPostBack) 
     { 
      base.Items.Add(new ListItem("Yes", "YES")); 
      base.Items.Add(new ListItem("No", "NO")); 
     } 
    } 
} 

我認爲這個問題是,如果我加載初始化時listItems,即建立之前視圖狀態和listItems中丟失的回傳。如果我在OnLoad中加載它們,那是在應用了SelectedValue之後,並且如果我設置了SelectedValue,則選擇將丟失。我的解決方案是連接OnInit覆蓋中的Page InitComplete事件。這工作,但我不知道這是最好的解決方案。

因此,無論是Page_InitComplete詳細如下或OnInit,但我必須每次加載項目。思考?

protected override void OnInit(EventArgs e) 
{ 
    this.Page.InitComplete += new EventHandler(Page_InitComplete); 

    base.OnInit(e); 
} 

private void Page_InitComplete(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     base.Items.Add(new ListItem("Yes", "YES")); 
     base.Items.Add(new ListItem("No", "NO")); 
    } 
} 
+2

你怎麼不只是使用複選框的經過驗證的方法,而不是下拉列表? – soniiic 2010-04-18 00:03:36

+0

您可以將代碼粘貼到指定SelectedValue的位置嗎? – 2010-04-18 00:14:14

+0

我很想使用複選框,但這是對現有應用程序的重寫,他們使用DDL。有一些位置存在第三個未選定狀態(空)。 – andleer 2010-04-18 00:25:12

回答

0

我建議增加在OnInit的,而不是預先加載的項目,你的控制開始它的生命與國家和諸如此類的東西設置正確的方式。文檔的相關位(重點介紹)

在所有控件初始化並且已經應用​​任何皮膚設置後引發。個別控件的Init事件發生在頁面的Init事件之前。
使用此事件來讀取或初始化控件屬性。

ViewState的跟蹤也被開啓between Init and PreLoad所以它會更好,如果控制了所有的前創建它的選項。

爲的SelectedValue的代碼是(謝謝反射鏡):

set 
    { 
     if (this.Items.Count != 0) 
     { 
      if ((value == null) || (base.DesignMode && (value.Length == 0))) 
      { 
       this.ClearSelection(); 
       return; 
      } 
      ListItem item = this.Items.FindByValue(value); 
      if ((((this.Page != null) && this.Page.IsPostBack) && this._stateLoaded) && (item == null)) 
      { 
       throw new ArgumentOutOfRangeException("value", SR.GetString("ListControl_SelectionOutOfRange", new object[] { this.ID, "SelectedValue" })); 
      } 
      if (item != null) 
      { 
       this.ClearSelection(); 
       item.Selected = true; 
      } 
     } 
     this.cachedSelectedValue = value; 
    } 

如果您嘗試設置的SelectedValue填充的項目列表之前,它基本上是一個無操作。