2014-12-06 49 views
0

我工作的一個簡單的VB.NET程序(只是用的WinForms)和我在UI管理真的很可怕。我想要一個按鈕來啓動一個進程,然後讓這個按鈕停止進程。製作button.click事件做兩個不同的東西

我在想具有主要形式啓動計數器,Click事件迭代計數器。然後執行一個簡單的檢查,如果計數器即使它會做的事情A和使用兩個按鈕奇做的事情B.

有沒有更好的辦法,撤銷或停止/啓動單選按鈕?

+1

您可以使用按鈕的文本來切換它的功能。當他們點擊按鈕檢查文本 - 如果它=「開始」,然後將其更改爲「停止」,否則將其更改回來,而當你在這個if/else代碼中,你在哪個階段。 – OneFineDay 2014-12-06 02:10:04

+0

Duh。我忘記了對象的每個屬性都是可測試的。這比啓動一個我可能不會再使用的計數器更有意義。 – 2014-12-06 02:14:00

+0

你也可以使用一個RadioButton,其外觀設置爲Button,它可以更像UI所做的切換 – Plutonix 2014-12-06 13:55:05

回答

3

我已經完成了確切的事情兩種方式之一。您可以使用靜態變量或切換按鈕的文本。

因爲你的按鈕有兩個功能,良好的設計需要您來指示給用戶。以下代碼假定按鈕的文本在設計模式中設置爲「開始」,啓動和停止您的進程的代碼位於子進程進程和進程結束進程中。

Public Sub Button1_Click(ByVal Sender as Object, ByVal e as System.EventArgs) 
    If Button1.Text ="Start" Then 
      StartProcess() 
      Button1.Text="End" 
    Else 
      EndProcess() 
      Button1.Text="Start" 
    End IF 
End Sub 

EDIT

上述溶液是細用於通過少量的開發者開發的單語言應用。

支持多國語言,開發人員通常從支持文件或數據庫分配所有的文本文字。在較大的開發商店中,對於多個程序員,使用流控制控件的顯示功能可能會導致混淆和迴歸錯誤。在這些cass中,上述技術不起作用。

相反,您可以使用該按鈕,其中包含對象的Tag屬性。我通常會使用布爾值,但是我使用了一個字符串,以便更清楚地瞭解發生了什麼。

Public Sub New() 
    'Initialize the Tag 
    Button1.Tag="Start" 
End Sub 
    Public Sub Button1_Click(ByVal Sender as Object, ByVal e as System.EventArgs) 
     If Button1.Tag.ToString="Start" Then 
       StartProcess() 
       Button1.Tag="End" 
     Else 
       EndProcess() 
       Button1.Tag="Start" 
     End IF 
    End Sub 
+0

這是一個很好的工作解決方案,但是在開發中可能會出現一些場景,工作。例如,本地化 - 如果語言改變,'Button1.Text'將不起作用。或者我可以想象,當另一個開發人員希望在設計器中將「Button1.Text」更改爲「完成」而不檢查代碼時。 – Fabio 2014-12-08 14:43:38

+0

一致認爲它不是每個實例中的完美解決方案。 – 2014-12-08 16:10:09

3

這是僞代碼中的示例。我不保證方法和事件的名稱完全匹配真實姓名。但是這應該爲您提供一種可以用於響應式表單的設計。

可以說,您的流程是在單獨的步驟上運行的,使用BackgroundWorker。 你設置你的工人,並開始處理

Class MyForm 

    private _isRunning as boolean 
    private _bgWorker as BackgroundWorker 

    sub buton_click() 
     If Not _isRunning Then 
      _isRunning = true; 
      StartProcess() 
     Else 
      StopProcess() 
     End if 
    end sub 

    sub StartProcess() 
     ' Setup your worker 
     ' Wire DoWork 
     ' Wire on Progress 
     ' wire on End 
     _bgWorker.RunWorkerAsync() 
    End sub   

    sub StopProcess() 
     if _isRunning andAlso _bgWorker.IsBusy then 
      ' Send signal to worker to end processed 
      _bgWorker.CancelAsync() 
     end if 
    end sub 

    sub DoWork() 
     worker.ReportProgress(data) ' report progress with status like <Started> 
     ' periodically check if process canceled 
     if worker.canceled then 
      worker.ReportProgress(data) ' report progress with status like <Cancelling> 
      return 
     end if 

     ' Do your process and report more progress here with status like <In Progress> 
     ' and again periodically check if process canceled 
     if worker.canceled then 
      worker.ReportProgress(data) ' report progress with status like <Cancelling> 
      return 
     end if 

     worker.ReportProgress(data) ' report progress with status like <Ending> 

    end sub 

    sub ReportProgress(data) 
     if data = <some process state, like "Started"> then 
      btnProcess.Text = "End Process" 
     end if 


    End sub 

    sub ReportEndOfProcess 
     btnProcess.Text = "Start Process" 
     _isRunning = false 
    end sub 

End Class 

Here you can pinpoint the names of methods and events 你需要替換用實際名稱標識符,並創建狀態數據對象,將攜帶的信息從後臺線程UI線程,也一個Enum Status可以是您的自定義狀態對象的一部分。這應該工作,一旦翻譯成真正的代碼

+0

很好的使用後臺進程。如果用戶將要使用該軟件做其他事情,這是一個很好的功能。但是,這不會增加編寫線程安全代碼的負擔,例如一個線程(當前的前臺線程)不會踩到或破壞後臺線程? – 2014-12-06 22:11:01

+0

@AndrewNeely Microsoft文檔回答說:'您必須小心,不要操作DoWork事件處理程序中的任何用戶界面對象。相反,通過ProgressChanged和RunWorkerCompleted事件與用戶界面進行通信。換句話說,如果使用提供的事件,則不需要編寫任何特殊代碼。 – 2014-12-06 23:17:57

1

只是想表明另一種方法完成這個任務 使用.Tag財產爲自己的目的 如果.Tag是Nothing(默認情況下,設計師),然後開始處理
如果不是沒有 - >停止過程

Public Sub Button1_Click(ByVal Sender as Object, ByVal e as System.EventArgs) 
    If Me.Button1.Tag Is Nothing Then 
     StartProcess() 
     Me.Button1.Tag = New Object() 
     Me.Button1.Text = "End" 
    Else 
     EndProcess() 
     Me.Button1.Tag = Nothing 
     Me.Button1.Text = "Start" 
    End 
End Sub 
相關問題