C# 正在发送到禁用控件的事件
我有个问题,想听听你的意见。我的GUI中有一个按钮,可以启动一个复杂的设置序列(连接到模拟到数字转换器,并从回声测深仪开始记录数据)。一旦完成设置,按钮将从开始变为停止,并具有预期的行为。我所经历的是,在长时间的操作过程中,如果用户再次单击按钮(即使它已被禁用),那么一旦按钮重新启用,事件仍会发送到按钮。我发现,要使其正常工作,唯一的方法是在再次启用按钮之前调用Application.DoEvents()。我真正想做的就是吞下为我的按钮指定的事件,因此DoEvents()似乎有点笨手笨脚。由于人们似乎一致反对打电话给DoEvents(),我希望这里的聪明人能帮我想出一个替代方案。注意,我没有尝试我的演示代码,但它紧跟我的真实代码,除了非常长的方法C# 正在发送到禁用控件的事件,c#,.net,C#,.net,我有个问题,想听听你的意见。我的GUI中有一个按钮,可以启动一个复杂的设置序列(连接到模拟到数字转换器,并从回声测深仪开始记录数据)。一旦完成设置,按钮将从开始变为停止,并具有预期的行为。我所经历的是,在长时间的操作过程中,如果用户再次单击按钮(即使它已被禁用),那么一旦按钮重新启用,事件仍会发送到按钮。我发现,要使其正常工作,唯一的方法是在再次启用按钮之前调用Application.DoEvents()。我真正想做的就是吞下为我的按钮指定的事件,因此DoEvents()似乎有点笨手笨脚。由于人
Application.DoEvents()
并不是很严厉,我也不认为程序员在所有情况下都一致反对DoEvents
DoEvents
名声不好,因为它传统上被用作对写得不好的代码的神奇修复。在你的情况下,这是正确和正常的方式来处理你的情况
在Windows中,您所描述的情况(当按钮重新启用时,单击已禁用的按钮)实际上是控件的正常预期行为。然而,从程序员的角度来看,这并不意味着它总是令人满意的行为,如果您的用户倾向于点击禁用的按钮,那么最简单的方法就是使用DoEvents,这只不过是一种方法,告诉表单继续并处理它已排队的任何事件。自豪地使用它 首先,我觉得
DoEvents()
一点都不坏,尤其是在gui方面,你无法想象它帮助了我多少次,如果你创建了进度条之类的东西,如果你想看到它更新,这几乎是强制性的,我想说的是,我真的不明白为什么它被认为是一个糟糕的命令。
不过在这个主题上,我通常在这种情况下不会禁用控件
我使用类似于下面的东西
public Class myForm :Form
{
private bool _working = false;
public myForm()
{
_working = true;
//code here
this.btnDoStuff.Click += new System.EventHandler(DoStuffClick);
_working = false;
}
private void DoStuffClick(object sender, EventArgs e)
{
if (_working) return;
_working = true;
DoStuff();
_working = false;
}
private void DoStuff()
{
//your code goes here
}
}
我发现,当涉及到允许用户一次只做一件事时,上面的内容对我很有帮助,如果我想允许用户做多件事(例如,在命令执行时,可以按其他按钮),我通常会将DoStuff()
代码放在不同的线程中执行
如果您在漫游,我使用额外的方法(DoStuff()
)来执行操作的原因是,有时我需要在一个方法中执行来自其他方法的代码,如果\u working
标志设置为true,我无法调用dostufflick(null,new EventArgs())
,因为它不会执行任何操作
我希望我能帮忙
p、 是的,我知道已经两年了,但我前几天才加入stackoverflow(:
public Class myForm :Form
{
private bool _working = false;
public myForm()
{
_working = true;
//code here
this.btnDoStuff.Click += new System.EventHandler(DoStuffClick);
_working = false;
}
private void DoStuffClick(object sender, EventArgs e)
{
if (_working) return;
_working = true;
DoStuff();
_working = false;
}
private void DoStuff()
{
//your code goes here
}
}