2016-10-20 127 views
0

我正在創建一個程序,其中數據正在填充到列表框中。當我點擊一個複選框來循環時,它應該從一開始就循環。當我點擊複選框時,它不檢查,並且由於無限循環,它也阻止我點擊其他任何東西。有沒有人知道這個解決方案?使用複選框循環

private void checkBox1_CheckedChanged(object sender, EventArgs e) 
{ 
    while(checkBox1.Checked == true) 
    { 
     Play(); 
    } 
} 
+0

WinForms? ASP.NET?還有別的嗎? – Tim

+0

我認爲你需要使用if塊而不是while塊。我猜你的循環是在Play()方法中。 – Jayee

+0

對不起,Winforms。 –

回答

0

您可能需要播放以在後臺線程上執行,或者您需要脈衝窗口消息泵,以便讓UI時間對輸入做出反應。這是後者:

private void checkBox1_CheckedChanged(object sender, EventArgs e) 
{ 
    while(checkBox1.Checked == true) 
    { 
     Play(); 
     Application.DoEvents(); 
    } 
} 

DoEvents使窗口處理當前在消息隊列中的任何消息(例如UI輸入)。沒有它,windows消息就不會被處理,因爲Play在UI線程上,並且消息泵永遠沒有機會運行,所以即使你瘋狂地點擊複選框,窗口也沒有機會告訴你的應用程序。

有很多方法可以在後臺線程上播放。這些例子比DoEvents的消息泵方法更有意義。

裸記住,多線程更多的是一種先進的辦法,可能難以正確實現,雖然是值得理解。

0

我做了基於任務並行庫(TPL)的實現。 TPL現在是Microsoft推薦的事實上的多線程範例。特別是TPL最擅長在後臺進行其他工作時保持UI的響應。這裏是相同的代碼片段:

private void checkBox1_CheckedChanged(object sender, EventArgs e) 
    { 
     if (checkBox1.Checked == true) 
     { 
      //iterate list box items on a thread-pool thread using TPL 
      Task.Run(() => Play()); 
     } 
    } 

    private void Play() 
    { 
     //listBox1 is the name of the list box control in my windows forms application 
     foreach (var listboxItem in listBox1.Items) 
     { 
      //check if the checkbox is currently in checked state 
      if(checkBox1.Checked) 
      { 
       //Checkbox is checked so process the listbox item 
       Console.WriteLine(listboxItem.ToString()); 
       //do other required stuff 
      } 
      else 
      break;  
     } 

    }