2010-06-25 89 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(: