如何在动态按钮上创建动态按钮点击事件?

46
我正在动态创建一个页面上的按钮。现在我想使用该按钮的点击事件。 在C# ASP.NET中如何实现?
6个回答

62
Button button = new Button();
button.Click += (s,e) => { your code; };
//button.Click += new EventHandler(button_Click);
container.Controls.Add(button);

//protected void button_Click (object sender, EventArgs e) { }

3
你必须在OnInit方法中创建按钮,否则事件处理程序将无法工作。 - Egor4eg
2
首先感谢您。在这里,您编写了button.Click += (s,e) => { your code; }; s = object sender,e = event argument对吧?但是即使这样,按钮点击事件仍然没有触发...您能解释一下它的工作原理吗? - AB Vyas
1
@amitvyas:这是同样代码的更短、但更复杂的版本。不使用显式事件处理程序声明,而是使用隐式的lambda表达式和匿名方法:{这是带有2个参数声明的匿名方法} - abatishchev
这对我也没用;事件处理程序从未触发。这可能是因为每次接收请求时都会为按钮创建一个新的事件处理程序。 - Sam
2
动态生成的事件必须在!IsPostBack之外的Page_Load/Page_Init事件中注册。 - nativegrip
显示剩余2条评论

43

对于新手来说更简单的方法:

Button button = new Button();
button.Click += new EventHandler(button_Click);

protected void button_Click (object sender, EventArgs e)
{
    Button button = sender as Button;
    // identify which button was clicked and perform necessary actions
}

8
非新手版是什么? - Mike
@MichaelMello:非新手可能会使用Lambda表达式。"button.click += (sender, e) => { // 在这里执行某些操作 }" :) - A9S6
我可以同时传递其他参数吗?例如 button.Click += new EventHandler(button_Click("Test")); - user736893
1
没事了,这个可以用:button.Click += (se, ev) => button_Click(se, ev, qo); - user736893

13

创建按钮时,只需将事件处理程序添加到按钮上即可。

 button.Click += new EventHandler(this.button_Click);

void button_Click(object sender, System.EventArgs e)
{
//your stuff...
}

11

做起来要容易得多:

Button button = new Button();
button.Click += delegate
{
   // Your code
};

对我来说,那个完美地运作。谢谢。 - Mark

1
您可以简单地创建按钮,例如:

Button button = new Button();
button.Click += new EventHandler(button_Click);

protected void button_Click (object sender, EventArgs e)
{
    Button button = sender as Button;
    // identify which button was clicked and perform necessary actions
}

但是事件可能不会触发,因为元素必须在每次回发时重新创建,否则您将失去事件处理程序。
我尝试了这个解决方案,验证ViewState是否已经生成并在每次回发时重新创建元素,
例如,假设您在单击事件上创建了按钮:
    protected void Button_Click(object sender, EventArgs e)
    {
       if (Convert.ToString(ViewState["Generated"]) != "true")
        {
            CreateDynamicElements();
        }
    
    }

在回发(postback)时,例如在页面加载时,您应该这样做:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (Convert.ToString(ViewState["Generated"]) == "true") {
            CreateDynamicElements();
        }
    }

在CreateDynamicElements()函数中,您可以放置所有需要的元素,例如您的按钮。
这对我非常有效。
public void CreateDynamicElements(){

    Button button = new Button();
    button.Click += new EventHandler(button_Click);

}

0
假设您有25个对象,并希望一个进程处理任何一个对象的单击事件。您可以编写25个委托或使用循环来处理单击事件。
public form1()
{
    foreach (Panel pl  in Container.Components)
    {
        pl.Click += Panel_Click;
    }
}

private void Panel_Click(object sender, EventArgs e)
{
    // Process the panel clicks here
    int index = Panels.FindIndex(a => a == sender);
    ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接