2012-02-07 46 views
2

我的小窗口窗体应用程序有两个单选按钮,最初都没有被检查。在检查其中一个之前,应该禁用“Go”按钮。我可以使用WinForms Form中的计时器组件来检查单选按钮的状态并启用/禁用按钮吗?

我发现了一个非常简单的方法来获得这个,但我不知道如果我设置自己随机崩溃。

我加了一个定时器组件,启用,并在Tick事件:

private void timer1_Tick(object sender, EventArgs e) 
{ 
    bool canGo = (_usRadioButton.Checked || _intlRadioButton.Checked); 
    if (_goButton.Enabled != canGo) 
    { 
     _goButton.Enabled = canGo; 
    } 
} 

我知道有其他方法可以做到这一点,我只是好奇,如果这种方式是有效的,或者如果我当定时器同时触发窗体更新其中一个复选框的Checked属性时,m是否会有最终用户抛出异常?

回答

2

如果我正确地理解了你,你已经了解了CheckedChanged事件,并且只询问你的代码中的冲突。所以:

据我所知,这不是多线程,并没有危险。 Tick事件实际上不会在计算机更新Checked状态的同时触发。

如果放在Form.Load和Timer.Tick痕迹:

private void Form_Load(object sender, EventArgs e) 
{ 
    Console.WriteLine("Form_Load/Thread.CurrentThread.ManagedThreadId=" + Thread.CurrentThread.ManagedThreadId); 
} 

private void timer1_Tick(object sender, EventArgs e) 
{ 
    Console.WriteLine("timer1_Tick/Thread.CurrentThread.ManagedThreadId=" + Thread.CurrentThread.ManagedThreadId); 
} 

结果表明:

Form_Load/Thread.CurrentThread.ManagedThreadId=9 
timer1_Tick/Thread.CurrentThread.ManagedThreadId=9 
+0

好吧,你是说Tick事件在窗体的线程上,这可能是我应该问的问题(我在想它)。 – 2012-02-07 16:29:33

+0

是的。但那只是“据我所知”。也许你最好等待[Skeet](http://stackoverflow.com/users/22656/jon-skeet)或[Hans](http://stackoverflow.com/users/17034/hans-passant)到肯定地回答。 – ispiro 2012-02-07 16:33:44

+0

勇敢的+1 :) – 2012-02-07 16:34:19

2

更好的解决方案是订阅单选按钮的CheckedChanged事件,然后启用该事件处理程序中的“Go”按钮。

这将解决您在使用此方法时遇到的任何计时问题。

+0

感谢你让我意识到这是相同的代码的方式 - 但是,这样做你是否同意更少的“去耦合”?我可能是错误的... – 2012-02-07 16:25:52

+0

@加布里埃尔 - 我认为这两种方法中的“耦合性”是相同的。您需要读取单选按钮的值以设置按钮的启用状态。 – ChrisF 2012-02-07 16:29:45

+0

对我来说这是一个很好的视角,因为我甚至都没有考虑过Checked属性 - 我关于两个单选按钮的CheckChanged事件的订阅比定时器的Tick事件更差,并结合定时器与形式没有直接关系...也许我的缺点是关于事件作为“耦合”因素。 – 2012-02-07 16:33:26

1

我不确定它是否安全,但您也可以订阅CheckedChanged事件并使用该处理程序代码来启用Go按钮。这将为您节省一个计时器,该计时器必须无限期运行。

+0

Ahh..too又慢了...... – 2012-02-07 16:26:11

相关问题