テキストボックス内の1000に数えられるフォーム上にボタンがあり、それをクリアしたとします。WinFormで複数のボタンをクリックするのを避けることはできますか?
ボタンを5回(実行時に)すばやくクリックすると、Clickイベントハンドラが5回呼び出され、カウントが1000回に5回表示されます。
最初のクリックがカウントされている間に、そのボタンの他のクリックを無効にすることはできますか?
注:クリックハンドラの最初のステートメントでボタンを無効にしてから、最後に再度有効にしても機能しません。また、クリックイベントの購読/購読解除(= =の後に+ =を付ける)は機能しません。ここで
説明するためのサンプル:
private bool runningExclusiveProcess = false;
private void button1_Click(object sender, EventArgs e)
{
this.button1.Click -= new System.EventHandler(this.button1_Click);
if (!runningExclusiveProcess)
{
runningExclusiveProcess = true;
button1.Enabled = false;
textBox1.Clear();
for (int i = 0; i < 1000; i++)
{
textBox1.AppendText(i + Environment.NewLine);
}
runningExclusiveProcess = false;
button1.Enabled = true;
}
this.button1.Click += new System.EventHandler(this.button1_Click);
}
あなたはすべての作業をUIスレッドで行っています。ボタンをもう一度クリックする前に、常にそのメソッドの最後に到達します。コードはおそらくあなたが思うよりも実行に要する時間が大幅に短縮されます。 – xyz
1000へのカウントは、それまでの遅延ではありません。お使いのコンピュータのクリック数は1000回です。 (いくつかのSleep()やその他の長時間実行される関数呼び出しは、あなたが期待している動作を示すでしょう) –
@tzup UIスレッドがブロックされていても、私はそれを知らなかった。私の答えを削除します:) – xyz