AutoPostBack不适用于自定义控件

时间:2011-01-12 05:39:40

标签: asp.net custom-controls autopostback

我在ASP.net中创建了一个自定义控件,其中包含一个将AutoPostBack设置为true的DropDownList。我还为控件附加了一个事件SelectedIndexChanged。但是我发现事件没有被触发。将AutoPostBack设置为true的普通asp.net DropDownList触发事件。我在VS2010中使用.net 3.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);
    }

谁能告诉我在这里缺少什么?

1 个答案:

答案 0 :(得分:2)

首先,您需要将自定义控件作为页面树的一部分。在这种情况下,ASP.NET将能够找到它们并包含所有必需的脚本(如果有的话)。您无需覆盖RenderContents。只需将下拉列表和文本框添加到Controls集合。

其次,请阅读CreateChildControls的{​​{3}}。页面底部有评论说明:

  

请勿覆盖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";
    }
}