【问题标题】:AutoPostBack not working for custom controlAutoPostBack 不适用于自定义控件
【发布时间】:2011-01-12 05:39:39
【问题描述】:

我在 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);
    }

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

【问题讨论】:

    标签: asp.net custom-controls autopostback


    【解决方案1】:

    首先,您需要自定义控件成为页面树的一部分。在这种情况下,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";
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-12-08
      • 1970-01-01
      • 2012-10-11
      • 2014-02-28
      • 2013-03-23
      • 2013-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多