【问题标题】:How to update progressbar when retrieve data from database to datagridview VB.NET将数据从数据库检索到 datagridview VB.NET 时如何更新进度条
【发布时间】:2016-03-16 02:20:33
【问题描述】:

我有 VB.net 代码将数据从 SQL 服务器(存储过程)检索到 Datagridview (dgMC)。 一切正常,但progressbar1 没有更新。我想progressbar1 以百分比显示更新,以便用户知道数据检索的状态。数据在1000K左右。

  Friend Delegate Sub SetDataSourceDelegate(table As DataTable)
    Private Sub setDataSource(table As DataTable)
        ' Invoke method if required:
        If Me.InvokeRequired Then
            Me.Invoke(New SetDataSourceDelegate(AddressOf setDataSource), table)
        Else
            dgMC.DataSource = table
            ProgressBar1.Visible = False
        End If
    End Sub
    Private Sub loadTable()
        Dim cnn As SqlConnection = GetConnection()
        Dim cmdSearch As New SqlCommand("MC_Display", cnn)
        cmdSearch.CommandType = CommandType.StoredProcedure
        Try
            cnn.Open()
            Dim readerSearch = cmdSearch.ExecuteReader
            If readerSearch.HasRows Then
                Dim dt = New DataTable()
                dt.Load(readerSearch)
                setDataSource(dt)
            Else
                Me.Cursor = Cursors.Default
                MsgBox("No Data Found.", MsgBoxStyle.Exclamation)
                dgMC.DataSource = Nothing
            End If
            readerSearch.Close()
        Catch ex As Exception
            Throw ex
        Finally
            cnn.Close()
        End Try
    End Sub

    Private Sub btnGoMC_Click(sender As Object, e As EventArgs) Handles btnGoMC.Click
        ProgressBar1.Visible = True
        ProgressBar1.Style = ProgressBarStyle.Marquee
        Dim thread As New System.Threading.Thread(New System.Threading.ThreadStart(AddressOf loadTable))
        thread.Start()
    End Sub

【问题讨论】:

    标签: vb.net datagridview progress-bar


    【解决方案1】:

    要准确了解检索数据的数量,您必须使用数据的 count(*) 创建一个查询。

    然后,当您检索数据时,您必须知道正在检索哪一行,因为您必须计算百分比。

    最后,你刷新你的progressBar:

    Dim percentage As Double = (currentRow / totalRows) * 100
    ProgressBar.Value = Int32.Parse(Math.Truncate(percentage).ToString())
    

    希望对你有帮助

    【讨论】:

      【解决方案2】:

      由于您没有执行任何可量化的操作(您正在对数据库发出 sql 查询,阻止该线程的处理,直到数据库为您提供您请求的数据)您将无法更新任何有意义的进度条。在这种情况下,选框卷轴通常就足够了。此外,您在 UI 线程上有进度条,因此它可以响应并启动一个新线程以防止 UI 线程被阻塞。此时您无法轻松访问 UI 线程上的进度条。

      不过还有一些其他想法...如果您可以访问任务并行库,我建议您使用它而不是创建原始线程并启动流程执行。您可以在 TPL 中使用一种称为 Task 的类型,它是 Thread 的抽象,并负责处理在此特定应用程序/场景中您可能不需要关心的一些细节。它还通过 .NET 4.5 中的 Async/Await 范例产生强大的异步编程。一位名叫 Stephen Cleary 的人在这个范式方面拥有丰富的专业知识,他有一个出色的博客系列:Stephen Cleary Async/Await

      一个简短的例子:

      Private Sub btnGoMC_Click(sender As Object, e As EventArgs) Handles btnGoMC.Click ProgressBar1.Visible = True ProgressBar1.Style = ProgressBarStyle.Marquee Dim thread As New System.Threading.Thread(New System.Threading.ThreadStart(AddressOf loadTable)) thread.Start() End Sub

      可以变成:

      `Private Async Sub btnGoMC_Click(sender As Object, e As EventArgs) Handles btnGoMC.Click
          ProgressBar1.Visible = True
          ProgressBar1.Style = ProgressBarStyle.Marquee
          Await Task.Run(Sub() loadTable)
      End Sub`
      

      【讨论】:

      • 我试过了,但得到消息:'Run' 不是'Task' 的成员。
      • 改成 .NET 4.5 后没问题,但progressbar1 仍然没有更新,UI 似乎没有响应。
      • 您查看过我发布的介绍如何使用 await/async 的链接吗?
      • 是的,我已经复习过,但我不明白。
      • 您是否将事件处理子 (btnGoMC_Click) 标记为异步?如果您将其标记为异步然后等待 Task.Run(Sub() loadTable),您的 UI 线程将保持畅通,因此您的进度条将继续运行(显示选取框滚动)。
      猜你喜欢
      • 2017-01-28
      • 1970-01-01
      • 1970-01-01
      • 2012-07-07
      • 2015-05-20
      • 1970-01-01
      • 2016-10-21
      • 2019-05-10
      • 1970-01-01
      相关资源
      最近更新 更多