0

AutoPostBackがtrueに設定されたDropDownListを含むカスタムコントロールをASP.netで作成しました。コントロールのイベントSelectedIndexChangedも添付しましたが、イベントが発生していないことがわかりました。AutoPostBackがtrueに設定されている通常のasp.netDropDownListは、イベントを発生させます。VS2010で.net3.5バージョンを使用しています。

これが私のコードです: 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);
    }

誰かが私がここで何が欠けているのか教えてもらえますか?

4

1 に答える 1

2

まず、カスタム コントロールをページ ツリーの一部にする必要があります。この場合、ASP.NET はそれらを見つけて、必要なすべてのスクリプト (存在する場合) を含めることができます。オーバーライドする必要はありませんRenderContents。ドロップダウン リストとテキスト ボックスをControlsコレクションに追加するだけです。

次に、 のAPI リファレンスをお読みくださいCreateChildControls。ページの下部に次のようなコメントがあります。

オーバーライドしないでください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";
    }
}
于 2011-01-12T07:09:26.367 に答える