创建 button.click 事件执行两种不同的操作



我正在开发一个简单的 VB.NET 程序(仅使用winforms(,并且在UI管理方面非常糟糕。我希望有一个按钮来启动一个进程,然后让同一个按钮停止进程。

我正在考虑让主窗体启动一个计数器,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

编辑

上述解决方案适用于由少数开发人员开发的单语言应用程序。

为了支持多种语言,开发人员通常会分配支持文件或数据库中的所有文本文本。 在具有多个程序员的大型开发车间中,使用控件的显示功能进行流控制可能会导致混淆和回归错误。 在这些卡司中,上述技术是行不通的。

相反,您可以使用按钮的 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
这是

伪代码中的示例。我不保证方法和事件的名称与真实名称完全匹配。但这应该为您提供可用于响应式表单的设计。

比方说,您的进程在单独的胎面上运行,使用 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 

在这里,您可以精确定位方法和事件的名称您必须将标识符替换为真实名称并创建状态数据对象,它将从后台线程传递到 UI 线程的信息,以及可以成为自定义状态对象一部分的Enum Status。一旦转换为真实代码,这应该可以工作

只是想展示此任务的另一种方法将.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

最新更新