我工作的一個簡單的VB.NET程序(只是用的WinForms)和我在UI管理真的很可怕。我想要一個按鈕來啓動一個進程,然後讓這個按鈕停止進程。製作button.click事件做兩個不同的東西
我在想具有主要形式啓動計數器,Click
事件迭代計數器。然後執行一個簡單的檢查,如果計數器即使它會做的事情A和使用兩個按鈕奇做的事情B.
有沒有更好的辦法,撤銷或停止/啓動單選按鈕?
我工作的一個簡單的VB.NET程序(只是用的WinForms)和我在UI管理真的很可怕。我想要一個按鈕來啓動一個進程,然後讓這個按鈕停止進程。製作button.click事件做兩個不同的東西
我在想具有主要形式啓動計數器,Click
事件迭代計數器。然後執行一個簡單的檢查,如果計數器即使它會做的事情A和使用兩個按鈕奇做的事情B.
有沒有更好的辦法,撤銷或停止/啓動單選按鈕?
我已經完成了確切的事情兩種方式之一。您可以使用靜態變量或切換按鈕的文本。
因爲你的按鈕有兩個功能,良好的設計需要您來指示給用戶。以下代碼假定按鈕的文本在設計模式中設置爲「開始」,啓動和停止您的進程的代碼位於子進程進程和進程結束進程中。
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
這是一個很好的工作解決方案,但是在開發中可能會出現一些場景,工作。例如,本地化 - 如果語言改變,'Button1.Text'將不起作用。或者我可以想象,當另一個開發人員希望在設計器中將「Button1.Text」更改爲「完成」而不檢查代碼時。 – Fabio 2014-12-08 14:43:38
一致認爲它不是每個實例中的完美解決方案。 – 2014-12-08 16:10:09
這是僞代碼中的示例。我不保證方法和事件的名稱完全匹配真實姓名。但是這應該爲您提供一種可以用於響應式表單的設計。
可以說,您的流程是在單獨的步驟上運行的,使用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
可以是您的自定義狀態對象的一部分。這應該工作,一旦翻譯成真正的代碼
很好的使用後臺進程。如果用戶將要使用該軟件做其他事情,這是一個很好的功能。但是,這不會增加編寫線程安全代碼的負擔,例如一個線程(當前的前臺線程)不會踩到或破壞後臺線程? – 2014-12-06 22:11:01
@AndrewNeely Microsoft文檔回答說:'您必須小心,不要操作DoWork事件處理程序中的任何用戶界面對象。相反,通過ProgressChanged和RunWorkerCompleted事件與用戶界面進行通信。換句話說,如果使用提供的事件,則不需要編寫任何特殊代碼。 – 2014-12-06 23:17:57
只是想表明另一種方法完成這個任務 使用.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
您可以使用按鈕的文本來切換它的功能。當他們點擊按鈕檢查文本 - 如果它=「開始」,然後將其更改爲「停止」,否則將其更改回來,而當你在這個if/else代碼中,你在哪個階段。 – OneFineDay 2014-12-06 02:10:04
Duh。我忘記了對象的每個屬性都是可測試的。這比啓動一個我可能不會再使用的計數器更有意義。 – 2014-12-06 02:14:00
你也可以使用一個RadioButton,其外觀設置爲Button,它可以更像UI所做的切換 – Plutonix 2014-12-06 13:55:05