在我的窗口中,我有一个数据网格视图..我正在填充数据网格视图,如下所示:
Sub filldgv()
Try
Dim dt As New DataTable
dt.Columns.Add("Tbarcode", GetType(String))
dt.Columns.Add("PlateNo", GetType(String))
dt.Columns.Add("DelEcode", GetType(String))
dt.Columns.Add("KRRT", GetType(Integer))
dt.Columns.Add("DT", GetType(Integer))
DGVReleased.DataSource = dt
DGVReleased.Columns(0).Width = 120
DGVReleased.Columns(1).Width = 65
DGVReleased.Columns(2).Width = 65
DGVReleased.Columns(3).Width = 60
DGVReleased.Columns(4).Width = 60
' Task.Factory.StartNew(Sub() Populate(dt))
Dim bgw = New BackgroundWorker()
AddHandler bgw.DoWork, Sub() Populate(dt)
bgw.RunWorkerAsync()
Catch ex As Exception
End Try
End Sub
Sub Populate(ByVal dt As DataTable)
Try
Using reader As TextReader = File.OpenText("C:\Program Files\IBS\login.txt")
txtvalue = Integer.Parse(reader.ReadLine())
End Using
Glocid = txtvalue
Dim cmd = New SqlCommand("IBS_fetchreqVehicleinPodium")
cmd.CommandType = CommandType.StoredProcedure
cmd.Connection = con.connect
cmd.Parameters.Add("@locid", SqlDbType.Int).Value = Glocid
Dim dr = cmd.ExecuteReader
While dr.Read
DGVReleased.AutoGenerateColumns = True
Dim o = {dr("TBarcode").ToString(),
dr("PlateNo").ToString(),
dr("DelEcode").ToString(),
If(IsDBNull(dr("KRRT")), 0, dr("KRRT")),
If(IsDBNull(dr("DT")), 0, dr("DT"))}
dt.Rows.Add(o)
End While
dr.Close()
con.disconnect()
changecolor()
Catch ex As Exception
End Try
End Sub
我的表格中有按钮 然后我将在我的按钮点击事件中调用 filldgv 方法..当网格中的数据超过100时,我按下我的按钮,花费很长时间加载数据和应用程序挂起.. 。 我怎么能解决这个问题.. 任何帮助都非常有用吗?
答案 0 :(得分:2)
由于DataTable是DataGridView的源代码,因此每次添加一行时,它都会更新DataGridView控件,因此使用该线程的好处很少。
尝试添加BackgroundWorker的RunWorkerCompleted事件并在此时设置DataGridView的DataSource:
Dim dt As New DataTable
dt.Columns.Add("Tbarcode", GetType(String))
dt.Columns.Add("PlateNo", GetType(String))
dt.Columns.Add("DelEcode", GetType(String))
dt.Columns.Add("KRRT", GetType(Integer))
dt.Columns.Add("DT", GetType(Integer))
Dim bgw As New BackgroundWorker()
AddHandler bgw.DoWork, Sub() Populate(dt)
AddHandler bgw.RunWorkerCompleted, Sub()
DGVReleased.AutoGenerateColumns = True
DGVReleased.DataSource = dt
DGVReleased.Columns(0).Width = 120
DGVReleased.Columns(1).Width = 65
DGVReleased.Columns(2).Width = 65
DGVReleased.Columns(3).Width = 60
DGVReleased.Columns(4).Width = 60
End Sub
bgw.RunWorkerAsync()
您应该注意到我在Populate方法中从while ...循环移动了DGVReleased.AutoGenerateColumns = True
设置。后台线程不应该访问GUI控件。
我也会避免空的Try-Catch分支。默默地吃异常将隐藏代码中的任何错误,作为程序员,你想知道出了什么问题。