2010-06-25 78 views
1

我有一个问题,我想要一些建议。我的GUI中有一个按钮,用于启动复杂的设置序列(连接到模拟数字转换器并开始记录来自回声测深仪的数据)。完成设置后,该按钮将从开始变为停止,并具有预期的行为。我所经历的是,在漫长的操作过程中,如果用户再次点击按钮(即使它被禁用),事件仍然会在重新启用后发送到按钮。我发现正确工作的唯一方法是在再次启用按钮之前调用Application.DoEvents()。我真正想要做的就是吞下发往我按钮的事件,所以DoEvents()看起来有点沉重。由于人们似乎一致反对调用DoEvents(),我希望这里的聪明人能够帮助我提出一种替代解决方案。注意我没有尝试过我的演示代码,但它紧随我真实的代码,除了真正的长方法。发送给禁用控件的事件

  1. 有没有其他的方法可以做到这一点?
  2. 它是安全的(ISH)来调用从后台工作的完成部分的DoEvents()?

    公共Form1类:表格{

    BackgroundWorker worker; 
    Button startButton; 
    bool state; 
    
    public Form1() { 
        state = false; 
        BackgroundWorker worker = new BackgroundWorker(); 
        worker.DoWork += new DoWorkEventHandler(StartSequence); 
        worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(ToggleButton); 
        startButton = new Button(); 
        startButton.Text = "START"; 
        startButton.Click += new System.EventHandler(StartClicked); 
        this.Controls.Add(startButton); 
    } 
    
    private void StartClicked(object sender, EventArgs e) { 
        startButton.Enabled = false; 
        worker.RunWorkerAsync(!state); 
    } 
    
    private void StartSequence(object sender, DoWorkEventArgs e) { 
        bool onState = (bool) e.Argument; 
        if (onState) { 
         RunReallyLongStartupSequence(); 
        } 
        else { 
         RunReallyLongStopSequence(); 
        } 
        state = onState; 
    } 
    
    private void ToggleButton(object sender, RunWorkerCompletedEventArgs e) { 
        startButton.Text = state ? "STOP" : "START"; 
    
        // THIS IS WHAT I AM WORRIED ABOUT! 
        Application.DoEvents(); 
        startButton.Enabled = true; 
    } 
    

    }

回答

0

Application.DoEvents()不重手,我不认为程序员一致反对DoEvents在所有案例。 DoEvents的声誉很差,因为它传统上被用作编写糟糕代码的魔法破解修复程序。就你而言,这是处理你的情况的正确和正常的方式。

在Windows中,你描述(其中应用上禁用的按钮点击重新启用时,按钮)的情况实际上是正常的,对于控制预期的行为。但是,这并不意味着它总是从程序员的角度来看可取行为,如果有,它们很容易马上点击上禁用按钮的用户,那么最简单的方法是使用的DoEvents,这只不过是一个方法更告诉表单继续并处理它排队的任何事件。自豪地使用它!

0

首先,我根本找不到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())执行行动的原因是,有时我需要执行代码F ORM的一个方法之外的方法,如果_working标志被设置为true,我不能叫DoStuffClick(null , new EventArgs())因为它不会做任何事情

我希望我帮助

附:是的,我知道它已经两年了,但我只有在前一天加入了stackoverflow(: