填充数据网格视图需要很长时间,系统会挂起

时间:2014-04-09 15:29:41

标签: vb.net winforms datagridview

在我的窗口中,我有一个数据网格视图..我正在填充数据网格视图,如下所示:

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时,我按下我的按钮,花费很长时间加载数据和应用程序挂起.. 。 我怎么能解决这个问题.. 任何帮助都非常有用吗?

1 个答案:

答案 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分支。默默地吃异常将隐藏代码中的任何错误,作为程序员,你想知道出了什么问题。