2009-08-06 6 views
2

テキストボックス内の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); 
} 
+0

あなたはすべての作業をUIスレッドで行っています。ボタンをもう一度クリックする前に、常にそのメソッドの最後に到達します。コードはおそらくあなたが思うよりも実行に要する時間が大幅に短縮されます。 – xyz

+0

1000へのカウントは、それまでの遅延ではありません。お使いのコンピュータのクリック数は1000回です。 (いくつかのSleep()やその他の長時間実行される関数呼び出しは、あなたが期待している動作を示すでしょう) –

+0

@tzup UIスレッドがブロックされていても、私はそれを知らなかった。私の答えを削除します:) – xyz

答えて

2

最初のクリックした後だけで無効ボタン、チェックマークのボタンを再度有効にし、自身を行うダメ

+0

これは機能します!なぜか少し説明するケア? – tzup

0
private bool HasBeenClicked = false; 

private void button1_Click(object sender, EventArgs e) 
    { 
     if(HasBeenClicked) 
      Application.DoEvents(); 
     else { 
      HasBeenClicked = true; 
      // Perform some actions here... 
      } 
    } 

を無効になる秒タイマーを実行しますそれ。 :O)

ここ
2

コードスニペット:

公共部分クラスをForm1:フォーム { 公共int型のカウント{取得します。セット; }

public Form1() 
    { 
     InitializeComponent(); 

     this.Count = 0; 
    } 

    private void GOBtn_Click(object sender, EventArgs e) 
    { 
     this.GOBtn.Enabled = false; 

     this.Increment(); 

     this.GOBtn.Enabled = true; 
    } 

    public void Increment() 
    { 
     this.Count++; 
     this.CountTxtBox.Text = this.Count.ToString(); 
     this.CountTxtBox.Refresh(); 

     Thread.Sleep(5000); //long process 

    } 
} 
関連する問題