【问题标题】:create checkbox checking sequence创建复选框检查序列
【发布时间】:2012-05-04 02:04:25
【问题描述】:

您好,我正在尝试对一些复选框进行编程,以编程方式以特定顺序选中和取消选中。我知道这听起来很愚蠢,但这与我已经编写了检查事件的一些 LED 控件相对应。

我想选中一个复选框来启动这个序列,取消选中它来停止它。目前,我的 D2 复选框的选中和取消选中正常,但do while 循环冻结了表单,因此我实际上无法取消选中循环框。我可能也不应该使用Thread.Sleep。任何建议表示赞赏。

private void cycleCheckBox_CheckedChanged(object sender, EventArgs e)
        {
            do
            {
                D2.Checked = true;
                Thread.Sleep(1000);
                D2.Checked = false;
                Thread.Sleep(1000);    

            } while (cycleCheckBox.Checked);
        }

【问题讨论】:

  • 尝试使用不同的技术来退出循环,在循环中放置一个计数器并在 10 后退出。我相信这是在 UI 线程中执行的,因此当您调用 sleep 时,UI 很可能会休眠,从而很难退出循环。您可能必须将循环中的逻辑移动到另一个线程中。

标签: c# loops checkbox sequence


【解决方案1】:

Thread.Sleep 方法将在 UI 线程上运行,如果直接在选中的事件中调用,这就是 UI 冻结的原因。将工作推送到System.Windows.Forms.Timer(假设这是一个 WinForms 应用程序):

实现一个以用户定义的时间间隔引发事件的计时器。 此计时器已针对在 Windows 窗体应用程序中的使用进行了优化,并且必须 在窗口中使用。

基于您的问题的示例:

Timer _timer;

private void cycleCheckBox_CheckedChanged(object sender, EventArgs e)
{
    if(_timer == null )
    {
        _timer = new Timer();
        _timer.Interval = 1000; // 1 second
        _timer.Tick += DoTimerWork;
    }

    if(cycleCheckBox.Checked)
    {
        _timer.Start();
    }
    else
    {
        _timer.Stop();
    }
}

private void DoTimerWork(object obj, EventArgs args) 
{
    D2.Checked = !D2.Checked;
}

【讨论】:

  • 对计时器赞不绝口!我有一种预感,这最终会是更好的选择。谢谢。
【解决方案2】:

我不知道这是否对你有用,但我会做的是在 1000 毫秒时拖入一个计时器控件,并使用一种方法来确定当前应该通过使用循环到 0 的整数来检查哪个复选框一个特定的点,并在每个滴答声中递增。

【讨论】:

    猜你喜欢
    • 2018-03-06
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多