我正在开发一个简单的VB.NET程序(只使用winforms),并且在UI管理方面非常糟糕。我想要一个启动进程的按钮,然后使用相同的按钮停止进程。
我正在考虑让主窗体启动一个计数器,Click
事件迭代计数器。然后它做了一个简单的检查,如果计数器是偶数,它将做事情A和奇数做事情B.
除了使用两个按钮或停止/启动单选按钮外,还有更好的方法吗?
答案 0 :(得分:3)
我已经完成了两种方式之一。您可以使用静态变量或切换按钮的文本。
由于您的按钮有两个功能,良好的设计要求您向用户指示。以下代码假定Button的文本在设计模式下设置为“Start”,启动和停止进程的代码在Subs StartProcess和EndProcess中。
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
修改强>
上述解决方案适用于少数开发人员开发的单语言应用程序。
为了支持多种语言,开发人员通常会从支持文件或数据库中分配所有文本文本。在具有多个程序员的大型开发商店中,使用控件的显示功能进行流量控制可能会导致混淆和回归错误。在那些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
答案 1 :(得分: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
可以是自定义状态对象的一部分。一旦翻译成真实的代码,这应该工作
答案 2 :(得分:1)
只想为此任务展示另一种方法
使用.Tag
属性用于您自己的目的
如果.Tag
为Nothing(默认情况下为设计器),则启动流程
如果不是没有 - &gt;停止过程
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