C# 正在发送到禁用控件的事件

C# 正在发送到禁用控件的事件,c#,.net,C#,.net,我有个问题,想听听你的意见。我的GUI中有一个按钮,可以启动一个复杂的设置序列(连接到模拟到数字转换器,并从回声测深仪开始记录数据)。一旦完成设置,按钮将从开始变为停止,并具有预期的行为。我所经历的是,在长时间的操作过程中,如果用户再次单击按钮(即使它已被禁用),那么一旦按钮重新启用,事件仍会发送到按钮。我发现,要使其正常工作,唯一的方法是在再次启用按钮之前调用Application.DoEvents()。我真正想做的就是吞下为我的按钮指定的事件,因此DoEvents()似乎有点笨手笨脚。由于人

我有个问题,想听听你的意见。我的GUI中有一个按钮,可以启动一个复杂的设置序列(连接到模拟到数字转换器,并从回声测深仪开始记录数据)。一旦完成设置,按钮将从开始变为停止,并具有预期的行为。我所经历的是,在长时间的操作过程中,如果用户再次单击按钮(即使它已被禁用),那么一旦按钮重新启用,事件仍会发送到按钮。我发现,要使其正常工作,唯一的方法是在再次启用按钮之前调用Application.DoEvents()。我真正想做的就是吞下为我的按钮指定的事件,因此DoEvents()似乎有点笨手笨脚。由于人们似乎一致反对打电话给DoEvents(),我希望这里的聪明人能帮我想出一个替代方案。注意,我没有尝试我的演示代码,但它紧跟我的真实代码,除了非常长的方法

  • 有没有其他方法可以实现这一点
  • 从后台工作程序的完成部分调用DoEvents()是否安全(ish)

    公开课表格1:表格 {

    }

  • 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
        }
    }