我有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
答案 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`