制作button.click事件会做两件事

时间:2014-12-06 02:01:32

标签: vb.net winforms

我正在开发一个简单的VB.NET程序(只使用winforms),并且在UI管理方面非常糟糕。我想要一个启动进程的按钮,然后使用相同的按钮停止进程。

我正在考虑让主窗体启动一个计数器,Click事件迭代计数器。然后它做了一个简单的检查,如果计数器是偶数,它将做事情A和奇数做事情B.

除了使用两个按钮或停止/启动单选按钮外,还有更好的方法吗?

3 个答案:

答案 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