- ベストアンサー
ボタンクリックイベント重複防止について
- C#2005で開発をしており、ボタンクリックイベントの重複を防止する方法について質問があります。
- ボタンクリックイベントを使用している際に、同じボタンをクリックすると複数のイベントが発生してしまいます。どのように防止すればよいでしょうか?
- 現在のコードでは、ボタンクリック中にフラグを立てて重複を防いでいますが、他の方法で防止することは可能でしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
基本は ・Enabledをfalseに設定することでそれ以降のクリック自体を無効化する ・処理終了後にEnabledをtrueに設定して,クリックを有効にする で対応します。 ただし,短い処理の場合はこれで対応できないこともあるので,500ms以内の連続クリックは無効にする,といった処理が必要になるでしょう。 で,今回に関しては, private void bShtter1_Click(object sender, EventArgs e) { bShtter1.Enabled = false; try { aaaaa(); } catch ( bShtter1.Enabled = true; throw; } } /* aaaaaはそのまま */ private int bbbbb() { try { /* 既存の処理内容 */ } finally { if (InvokeRequired) { Invoke((Action<object>)delegate (object dummy) { bShtter1.Enabled = true; }, null); else { bShtter1.Enabled = true; } } } といった処理になるかと思います。 ただ,本当にThreadオブジェクトが必要ですか,という話は出てきます。 System.ComponentModel.BackgroundWorker (.NET Framework 2.0-)を使えば, private void bShtter1_Click(object sender, EventArgs e) { bShtter1.Enabled = false; backgroundWorker1.RunWorkAsync(); } private void backgroundWorker1_DoWork (object sender, DoWorkEventArgs e) { // 元のbbbbbの内容をそのまま } private void backgroundWorker1_RunWorkerCompleted(Object sender, RunWorkerCompletedEventArgs e) { bShtter1.Enabled = true; } のように,Invoke使ったり細々した処理が消えます。 また,デリゲートのBeginInvokeによる非同期処理(スレッドプール利用)も存在するため (.NET Framework 1.0-), Threadクラスを直接使うメリットは.NET Framework 1.0の頃からほぼ無いです。 # .NET Framework 4ではSystem.Threading.TaskやPLINQを使うことも。
その他の回答 (2)
- hemohemo0825
- ベストアンサー率13% (79/593)
C#は触ったこと無いですが、ボタンクリックのタイミングでフラグを立てて、フラグが立っているときに、ボタンをクリックしてもはねれば良いだけでは?
- Wr5
- ベストアンサー率53% (2173/4061)
C#は触ったことありませんが… 処理自体はワーカースレッドでやっているようなのでUIが止まる。ということはなさそうですね。 ということで、2回目(というか複数回)押されたくないのであれば… ボタンクリックでコールされたときに、そのボタンを無効化してしまえばよいかと。 ワーカースレッドの処理が終わった後、ボタンを有効化する。 というのが一般的ですかね。
お礼
御回答ありがとうございます。またご返答おそくなりまして申し訳ございません。 対処として、 ・Enabledをfalseに設定することでそれ以降のクリック自体を無効化する ・処理終了後にEnabledをtrueに設定して,クリックを有効にする に加え、 Doevnetsを入れて対応いたしました。 本来なら、ご教示いただいたとおりbackgroundWorkerを使用して行いたかったのですが、時間的に厳しく、さしあたり上記で動作したもので対応しました。 今後の処理向上として、後日backgroundWorkerを使用して、コーディングを行いたいと思います。 ご教示誠にありがとうございました。 以上です。