2016-10-20 103 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;  
     } 

    }