将新事件添加到按钮

时间:2011-07-19 08:55:48

标签: c# asp.net event-handling

protected void Page_Load(object sender, EventArgs e)
{
        Button a = new Button();
        a.Width = 100;
        a.Height = 100;
        a.Text = "one";
        a.Click += new EventHandler(test);
        form1.Controls.Add(a);        
}

protected void test(object sender, EventArgs e)
{
    Button b = new Button();
    b.Width = 100;
    b.Height = 100;
    b.Text = "two";
    b.Click += new EventHandler(test2);
    form1.Controls.Add(b );
    Response.Write("aaaaaaaaaaaaaaaaaa");
}


protected void test2(object sender, EventArgs e)
{
    Response.Write("bbbbbbbbbbbbbbb");
}

点击one时显示按钮two,但点击two按钮时未运行test2 ???? 点击two页面刷新时。

我想首先点击“一个”,然后“两个” 仅在单击按钮a后显示按钮

3 个答案:

答案 0 :(得分:3)

试试这个:

protected void Page_Init(object sender, EventArgs e)
{
    Button a = new Button();
    a.Width = 100;
    a.Height = 100;
    a.Text = "one";
    a.Click += new EventHandler(test);
    form1.Controls.Add(a);

    Button b = new Button();
    b.Visible = false;
    b.Width = 100;
    b.Height = 100;
    b.Text = "two";
    b.Click += new EventHandler(test2);
    form1.Controls.Add(b);
}

protected void test(object sender, EventArgs e)
{
    b.Visible = true;
    Response.Write("aaaaaaaaaaaaaaaaaa");
}


protected void test2(object sender, EventArgs e)
{
    Response.Write("bbbbbbbbbbbbbbb");
}

答案 1 :(得分:2)

您必须重新创建动态控件(例如新按钮b)并在每次回发时再次关联其事件处理程序 。因此,您需要将代码从test移至Page_Load。如果您只想在单击按钮a后显示按钮,请使按钮b不可见(简单解决方案)或在视图状态中存储一些布尔值,以触发创建b(更多复杂的解决方案)。

答案 2 :(得分:0)

每次访问(或刷新)ASP页面时,都会重新创建对象并运行Page_Load事件。这意味着当您点击第一个按钮时,将创建第二个按钮,并且该事件将在该页面对象的实例中订阅

下次点击按钮时,会创建一个新的页面对象,并且该页面对象中的事件从未被订阅过。

动态创建控件通常是一个坏主意,而是创建所有控件并隐藏那些您不想立即显示的控件。您还应该在页面加载中添加IsPostBack检查,以便区分首次初始化和在回发时重新创建对象。