如何在从数据库检索数据到datagridview VB.NET时更新进度条

时间:2016-03-16 02:20:34

标签: vb.net datagridview progress-bar

我有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

2 个答案:

答案 0 :(得分:1)

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

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

最后,你刷新progressBar:

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

我希望它可以帮到你

答案 1 :(得分:0)

由于您没有执行可量化的任何内容(您正在针对数据库发出sql查询,阻止对该线程的处理,直到数据库为您提供所请求的数据),否则您不会能够用任何有意义的东西更新进度条。在这种情况下,Marquee滚动通常就足够了。此外,您在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`