【问题标题】:Progress Bar with process带有进程的进度条
【发布时间】:2023-03-03 06:46:23
【问题描述】:

当我单击命令按钮时,需要几秒钟才能完成可能使最终用户认为程序滞后的过程,然后我想到了进度条。那么如何在进程运行时使进度条工作,以便用户不会认为程序滞后,我是 vb.net 的新手,我现在研究了一段时间,但仍然无法了解它是如何工作的也不知道如何开始。

提前感谢您的帮助

这是我的命令按钮进程。

        Private Sub LoginBTN_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LoginBTN.Click
    Using ClientDashboardx As New ClientDashboard
        Try

            cn = New ADODB.Connection
            conDB()
            cn.Open()

            rs = New ADODB.Recordset
            rs.Open("SELECT * FROM tb_registration", cn, 0, 3)

            If txtuserid.Text = "" Or txtuserpass.Text = "" Then
                MsgBox("Value Null")
                Exit Sub
            Else
                Do While Not rs.EOF
                    Dim strLogin = txtin.Text
                    Dim strLogout = txtout.Text
                    If rs("st_acc_number").Value = txtuserid.Text And rs("st_password").Value = txtuserpass.Text And rs("st_log").Value = strLogin Then
                        MsgBox("Account in use")
                        Exit Sub
                    ElseIf rs("st_acc_number").Value = txtuserid.Text And rs("st_password").Value = txtuserpass.Text And rs("st_log").Value = strLogout Then
                        Dim strID = rs("st_acc_number").Value
                        Dim strUserName = rs("st_fname").Value & " " & rs("st_lname").Value
                        Dim strTotalTime = rs("st_totaltimeleft").Value
                        rs.Close()
                        SaveAccNumber.Text = strID
                        SaveUserName.Text = strUserName
                        SaveTotalTime.Text = strTotalTime

                        cn.BeginTrans()
                        cn.Execute("UPDATE tb_registration SET st_log='in' where st_acc_number='" & SaveAccNumber.Text & "'")
                        cn.CommitTrans()
                        cn.Close()

                        ClientDashboardx.id_lbl.Text = SaveAccNumber.Text
                        ClientDashboardx.iduser_lbl.Text = SaveUserName.Text
                        ClientDashboardx.UserTotalTime.Text = SaveTotalTime.Text
                        ClientDashboardx.AutoUpdate_Button.Enabled = True
                        Me.Hide()
                        ClientDashboardx.ShowDialog()
                        Me.Show()
                        Exit Sub
                    Else
                        rs.MoveNext()
                    End If
                Loop
                MsgBox("User/Pass Mismatch")
                Exit Sub
            End If
        Catch ex As Exception
            MsgBox("Server Offline", MsgBoxStyle.Critical, "")
        End Try
    End Using
End Sub

【问题讨论】:

    标签: vb.net progress-bar


    【解决方案1】:

    您应该在单独的线程或background worker 中执行长时间运行的进程。

    这里是如何使用后台工作者:

    将 BackgroundWorker 和 ProgressBar 添加到您的表单

    添加一个私有变量来保存你的结果

    Private _success As Boolean
    

    添加代码以显示 ProgressBar 并在 Form_Load 中启动工作器

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        _success = False
        ProgressBar1.Style = ProgressBarStyle.Marquee
        ProgressBar1.Visible = True
        BackgroundWorker1.RunWorkerAsync()
    End Sub
    

    在此处执行您的长期操作

    Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        'perform your db access here and set the result in _success
    End Sub
    

    当工人完成隐藏进度条并根据结果执行一些操作

    Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
        ProgressBar1.Visible = False
        If _success Then
            Me.Hide()
            ClientDashboardx.ShowDialog()
            Me.Show()
        Else
            MsgBox("User/Pass Mismatch")
        End If
    End Sub
    

    【讨论】:

    • 非常感谢,这是一个直接的指导。这将节省我很多时间。干杯
    • 我遇到了一个错误,这里 SaveAccNumber.Text = strID SaveUserName.Text = strUserName SaveTotalTime.Text = strTotalTime 这是错误“跨线程操作无效:从线程访问的控件'客户端'除了创建它的线程。”我该怎么办?这是我第一次看到这样的错误。
    • 您不能在后台工作人员中设置 TextBoxes 的 Text 值而不使用委托,因为它在不同的线程上运行(因此出现错误)。在变量中设置值,然后使用这些变量填充 RunWorkerCompleted 事件中的文本框。
    • 我已经搜索了这个错误。我发现了这个。 System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = False 这是一个好代码吗?似乎工作,但 BackgroundWorker1_RunWorkerCompleted 似乎没有工作。所以我把 me.hide() clientdashboardx.showdialog() me.show 放在 DoWork 中。它工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多