2011-01-12 65 views
0

我在ASP.net中創建了一個自定義控件,其中包含一個AutoDownBack設置爲true的DropDownList。我還爲控件附加了一個事件SelectedIndexChanged,但我發現該事件未被觸發。正常的asp.net DropDownList與AutoPostBack設置爲true將觸發事件。我在VS2010中使用.net 3.5版本。AutoPostBack不能用於自定義控件

這裏是我的代碼: ServerControl1.cs

[ToolboxData("<{0}:ServerControl2 runat=server></{0}:ServerControl2>")] 
public class ServerControl1 : WebControl 
{ 
    protected DropDownList drplist; 
    protected TextBox tb; 

    protected override void RenderContents(HtmlTextWriter output) 
    { 
     drplist.RenderControl(output); 
     tb.RenderControl(output); 

    } 

    protected override void CreateChildControls() 
    { 
     base.CreateChildControls(); 
     drplist = new DropDownList() { AutoPostBack = true }; 
     drplist.Items.Add("a"); 
     drplist.Items.Add("b"); 
     drplist.Items.Add("c"); 
     drplist.Items.Add("d"); 
     drplist.SelectedIndexChanged += new EventHandler(drplist_SelectedIndexChanged); 
     tb = new TextBox(); 
    } 

    void drplist_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     tb.Text = "even fired";   
    } 
} 

ServerControl1Test:

protected void Page_Load(object sender, EventArgs e) 
    { 
     ServerControl1 ServerControl1 = new ServerControl1(); 
     this.Controls.Add(ServerControl1); 
    } 

誰能告訴我我在這裏失蹤?

回答

2

首先,您需要將自定義控件作爲頁面樹的一部分。在這種情況下,ASP.NET將能夠找到它們幷包含所有必需的腳本(如果有的話)。您無需覆蓋RenderContents。只需將您的下拉列表以及文本框添加到Controls集合。

其次,請閱讀API referenceCreateChildControls。頁面底部有評論指出:

請勿覆蓋CreateChildControls

您將遇到一個受傷的世界, 特別是當涉及到訂閱子控件事件! 相反,請創建一個名爲CreateCustomChildControls的私有方法 。 在那裏構建控制樹。只需 覆蓋OnInit並在那裏致電 CreateCustomChildControls從 。

所以你的情況的代碼如下所示:

[ToolboxData("<{0}:ServerControl2 runat=server></{0}:ServerControl2>")] 
public class ServerControl1 : WebControl 
{ 
    protected DropDownList drplist; 
    protected TextBox tb; 

    protected override void OnInit(EventArgs e) 
    { 
     base.OnInit(e); 

     CreateCustomChildControls(); 
    } 

    private void CreateCustomChildControls() 
    { 
      drplist = new DropDownList() { AutoPostBack = true }; 

      drplist.Items.Add("a"); 
      drplist.Items.Add("b"); 
      drplist.Items.Add("c"); 
      drplist.Items.Add("d"); 

      drplist.SelectedIndexChanged += new EventHandler(drplist_SelectedIndexChanged); 

      tb = new TextBox(); 

      base.Controls.Add(drplist); 
      base.Controls.Add(tb); 
    } 

    void drplist_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     tb.Text = "even fired"; 
    } 
}