2011-01-12 11 views
0

AutoPostBackをtrueに設定したDropDownListを含むASP.netでカスタムコントロールを作成しました。私はまた、イベントのSelectedIndexChangedコントロールを添付しました。しかし、私はイベントが発生しないことがわかります。 AutoPostBackがtrueに設定された通常のasp.net DropDownListがイベントを発生させます。 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コレクションに追加するだけです。

CreateChildControlsAPI referenceをお読みください。ページ下部に次のようなコメントがあります。

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"; 
    } 
}