我可以使用WinForms Form中的计时器组件来检查单选按钮的状态并启用/禁用按钮吗?
我的小窗口窗体应用程序有两个单选按钮,最初都没有被检查。在检查其中一个之前,应该禁用“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是否会有最终用户抛出异常?
如果我正确地理解了你,你已经了解了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
更好的解决方案是订阅单选按钮的CheckedChanged事件,然后启用该事件处理程序中的“Go”按钮。
这将解决您在使用此方法时遇到的任何计时问题。
感谢你让我意识到这是相同的代码的方式 - 但是,这样做你是否同意更少的“去耦合”?我可能是错误的... – 2012-02-07 16:25:52
@加布里埃尔 - 我认为这两种方法中的“耦合性”是相同的。您需要读取单选按钮的值以设置按钮的启用状态。 – ChrisF 2012-02-07 16:29:45
对我来说这是一个很好的视角,因为我甚至都没有考虑过Checked属性 - 我关于两个单选按钮的CheckChanged事件的订阅比定时器的Tick事件更差,并结合定时器与形式没有直接关系...也许我的缺点是关于事件作为“耦合”因素。 – 2012-02-07 16:33:26
我不确定它是否安全,但您也可以订阅CheckedChanged事件并使用该处理程序代码来启用Go按钮。这将为您节省一个计时器,该计时器必须无限期运行。
Ahh..too又慢了...... – 2012-02-07 16:26:11
好吧,你是说Tick事件在窗体的线程上,这可能是我应该问的问题(我在想它)。 – 2012-02-07 16:29:33
是的。但那只是“据我所知”。也许你最好等待[Skeet](http://stackoverflow.com/users/22656/jon-skeet)或[Hans](http://stackoverflow.com/users/17034/hans-passant)到肯定地回答。 – ispiro 2012-02-07 16:33:44
勇敢的+1 :) – 2012-02-07 16:34:19