2

我对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() 它没有帮助......也许我在这里做错了什么......任何帮助将不胜感激,谢谢。

4

1 回答 1

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);
    }
}
于 2013-06-07T16:13:21.680 回答