2

私は単純なウィンドウフォームを作成しました。私のボタンは 2 回目のクリックでのみ起動します。何故ですか ?

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);
}

誰かがこれを説明できますか。

4

5 に答える 5

10

それはまさにあなたがそうするように言ったことです。

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

この行は、今後のすべてのクリックに対して実行されるクリック イベントにハンドラーを追加します。

于 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したがって、メソッドを起動するには、少なくとも 1 回のクリックが必要です。

このアプローチのもう 1 つの問題は、例外がスローされた場合に、このイベント ハンドラーを複数回フックすることになる可能性があることです。イベントでそれを削除していることは知っていますが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 に答える