【问题标题】:ASP.NET CompositeControl: Firing 2 (or more) events after postbackASP.NET CompositeControl:回发后触发 2 个(或更多)事件
【发布时间】:2013-06-08 00:13:21
【问题描述】:

我对 asp.net CompositeControls 很陌生...我有一个任务需要我在加载时添加一个 1 按钮,然后当用户单击它时,会添加另一个按钮,然后单击第二个按钮显示一个标签。

问题是点击第二个按钮后,页面回发完毕,整个页面回到初始状态,没有显示任何标签。所以第一个按钮点击会触发,但第二个事件不会。我什至创建了一个断点来检查,它没有访问“btn_submit2_Click”

test1Composite.cs:

using System;
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace test1File
{
    [DefaultProperty("Text")]
    [ToolboxData("<{0}:test1 runat=server></{0}:test1>")]

    public class test1 : CompositeControl 
    {
        protected Button btn_submit1;
        protected Button btn_submit2;

        [Bindable(true)]
        [Category("Appearance")]
        [DefaultValue("")]
        [Localizable(true)]
        protected override void CreateChildControls()
        {
            btn_submit1 = new Button();
            btn_submit1.Text = "Click me!";
            btn_submit1.Click +=new EventHandler(btn_submit1_Click);
            this.Controls.Add(btn_submit1);
            this.ChildControlsCreated = true;
        }
        protected void btn_submit1_Click(object sender, EventArgs e)
        {
            btn_submit2 = new Button();
            btn_submit2.Text = "Click me!";
            btn_submit2.Click += new EventHandler(btn_submit2_Click);
            this.Controls.Add(btn_submit2);
        }
        protected void btn_submit2_Click(object sender, EventArgs e)
        {
            Label lbl_done = new Label();
            lbl_done.Text = "Thank you :)";
            this.Controls.Add(lbl_done);
        }
    }
}

默认.cs:

using System;

namespace test1File
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            test1 pl = new test1();
            form1.Controls.Add(pl);
        }
    }
}

我在网上搜索并发现“可能”我需要覆盖 OnInit 但如果我放 CreateChildControls() 它没有帮助......也许我在这里做错了什么......任何帮助将不胜感激,谢谢。

【问题讨论】:

    标签: c# asp.net composite-controls


    【解决方案1】:

    您需要跟踪 btn_submit2 是否已创建。

    如果它是由 btn_submit1_Click 创建的,您需要在 CreateChildControls 事件中重新加载它。

    否则,btn_submit2 变为 null,并且无法触发 btn_submit2_Click 事件。

    在以下代码中,它使用 ViewState 跟踪 btn_submit2

    public class test1 : CompositeControl
    {
        protected Button btn_submit1;
        protected Button btn_submit2;
    
        private bool Submit2Created
        {
            get { return (bool) (ViewState["Submit2Created"] ?? false); }
            set { ViewState["Submit2Created"] = value; }
        }
    
        [Bindable(true)]
        [Category("Appearance")]
        [DefaultValue("")]
        [Localizable(true)]
        protected override void CreateChildControls()
        {
            btn_submit1 = new Button();
            btn_submit1.Text = "Click me1!";
            btn_submit1.Click += btn_submit1_Click;
            this.Controls.Add(btn_submit1);
    
            // Button 2 is created previously, 
            // so we need to load it back.
            if (Submit2Created)
            {
                AddSubmit2();
            }
    
            this.ChildControlsCreated = true;
        }
    
        protected void btn_submit1_Click(object sender, EventArgs e)
        {
            if (!Submit2Created)
            {
                AddSubmit2();
                Submit2Created = true;
            }
        }
    
        protected void btn_submit2_Click(object sender, EventArgs e)
        {
            Label lbl_done = new Label();
            lbl_done.Text = "Thank you :)";
            this.Controls.Add(lbl_done);
        }
    
        private void AddSubmit2()
        {
            var btn_submit2 = new Button();
            btn_submit2.Text = "Click me2!";
            btn_submit2.Click += btn_submit2_Click;
            this.Controls.Add(btn_submit2);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多