2009-08-06 98 views
2

假設您在文本框中的表單上有一個計數爲1000的按鈕,然後清除它。是否有可能避免Winform上的多個按鈕點擊?

如果我快速點擊按鈕五次(在運行時),Click事件處理程序將被調用5次,我會看到計數1000 1000次。

當第一次點擊正在計數時,是否可以禁用該按鈕上的其他點擊?

注意:禁用單擊處理程序的第一個語句中的按鈕,然後在最後重新啓用不起作用。此外,取消訂閱/訂閱點擊事件( - =後跟+ =)不起作用。

這裏的樣本來說明:

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 2009-08-06 10:14:09

+0

計數到1000不是它曾經的延遲。您的電腦點擊次數達到1000次。 (幾個Sleep()或其他更長時間的運行函數調用會顯示您期望的行爲) – 2009-08-06 10:18:40

+0

@tzup即使UI線程被阻塞,您仍然在等待排隊的點擊。我不知道。將刪除我的答案:) – xyz 2009-08-06 10:34:33

回答

2

只是禁用按鈕初始點擊後,運行一個定時器第二個將在蜱重新啓用按鈕,並禁用本身

+0

這個工程!小心解釋一下爲什麼? – tzup 2009-08-06 13:26:47

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類:表格{ 公共 詮釋計數{獲得;組; }

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 

    } 
}