2

I have done a simple windows form. My button is firing only on the second click. Why is that ?

private void button1_Click(object sender, EventArgs e)
{
    //button1.Enabled = false; will disable the button before the event is fired
    this.button1.Click += new System.EventHandler(this.dosomething);
}

private void dosomething(object sender, System.EventArgs e)
{
    listBox1.Items.Add("Initializing :" + cart + "...");
    this.button1.Click -= new System.EventHandler(this.dosomething);
}

Can some one explain this.

4

5 回答 5

10

这正是你告诉它要做的事情。

   this.button1.Click += new System.EventHandler(this.dosomething);

此行向 click 事件添加了一个处理程序,该处理程序将为所有未来的点击运行。

于 2013-07-05T14:35:20.067 回答
10

正如其他人所说,您仅在第一次单击时才连接事件。

将此行放在 form_load 事件中

this.button1.Click += new System.EventHandler(this.dosomething);
于 2013-07-05T14:36:54.217 回答
3

因为您在第一次点击时就将其连接起来:

this.button1.Click += new System.EventHandler(this.dosomething);

因此至少需要单击一下才能dosomething触发该方法。

这种方法的另一个问题是,如果抛出异常,您最终可能会多次挂接此事件处理程序。我知道您要在dosomething事件中删除它,但是在构造函数中连接这个事件真的会更好。

于 2013-07-05T14:35:19.437 回答
3

您要做的是在单击按钮后从按钮中删除绑定事件。您可以通过以下方式直接调用事件:

private void button1_Click(object sender, EventArgs e)
{
    dosomething(null, null)
}
于 2013-07-05T14:40:09.717 回答
0

如果您希望按钮只工作 1 次,您可以取消订阅点击事件。

private void button1_Click(object sender, EventArgs e)
{
    DoSomething();
    button1.Click -= button1_Click;
}
于 2013-07-05T14:46:31.350 回答