使用sql reader应用程序填充数据网格视图变慢

时间:2014-04-09 05:49:53

标签: vb.net winforms datagridview

我有一个Windows窗体...我正在尝试使用sql datareader填充我的数据网格视图,
当点击按钮我尝试填充我的数据网格视图..
我写了一个用于填充网格视图的函数..

Sub filldgv()
DGVReleased.Rows.Clear()
Dim carid As String
            Dim VehicleNo As String
            Dim DriverID As String
            Dim krrt As Integer
            Dim Dt As Integer
 Dim cmd As New SqlCommand("IBS_fetchresleaseVehicle", con.connect)
            cmd.CommandType = CommandType.StoredProcedure
            cmd.Parameters.Add("@locid", SqlDbType.Int).Value = Glocid
dr = cmd.ExecuteReader
            While dr.Read
                If dr("TBarcode") Is DBNull.Value Then
                    carid = ""
                Else
                    carid = dr("TBarcode")
                End If
                If dr("PlateNo") Is DBNull.Value Then
                    VehicleNo = ""
                Else
                    VehicleNo = dr("PlateNo")
                End If
                If dr("DelEcode") Is DBNull.Value Then
                    DriverID = ""
                Else
                    DriverID = dr("DelEcode")
                End If
                If dr("KRRT") Is DBNull.Value Then
                Else
                    krrt = dr("KRRT")
                End If
                If dr("DT") Is DBNull.Value Then
                Else
                    Dt = dr("DT")
                End If
                Dim row0 As String() = {carid, VehicleNo, DriverID, krrt, Dt}
                DGVReleased.Rows.Insert(0, row0)
            End While
            dr.Close()
            con.disconnect()
End Sub

然后我在我的按钮点击事件中调用此功能。首先从网格视图中删除所有记录然后我正在填充..而更多记录到数据网格视图我的系统正在挂起..有没有办法到这样做非常简单..任何帮助都非常明显..

1 个答案:

答案 0 :(得分:0)

  1. 使用DataGridView.Rows.AddRange。收集List(Of DataGridViewRow)中的数据,然后才将循环添加到DataGridView:

    Sub filldgv()
        Dim ListRows As New List(Of DataGridViewRow)()
        Dim cmd = New SqlCommand("IBS_fetchresleaseVehicle")
    
        cmd.CommandType = CommandType.StoredProcedure
        cmd.Connection = con.connect
        cmd.Parameters.Add("@locid", SqlDbType.Int).Value = Glocid
    
    
        Dim dr = cmd.ExecuteReader
        Dim ListRows As New List(Of DataGridViewRow)()
    
        While dr.Read
            Dim DgvRow = New DataGridViewRow
    
            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")) }
    
            DgvRow.CreateCells(o)
            ListRows.Add(DgvRow)
        End While
    
        dr.Close()
        con.disconnect()
    
    
        Dim SavedBool = DGVReleased.AllowUserToAddRows
        DGVReleased.AllowUserToAddRows = False
    
        DGVReleased.Rows.AddRange(ListRows.ToArray())
    
        DGVReleased.AllowUserToAddRows = SavedBool
    End Sub
    
  2. 使用DataTable& DataBinding,然后在Background-Thread中填充DataTable:

    Sub filldgv()
        Dim dt As New DataTable
        dt.Columns.Add("", GetType(String))
        dt.Columns.Add("", GetType(String))
        dt.Columns.Add("", GetType(String))
        dt.Columns.Add("", GetType(Integer))
        dt.Columns.Add("", GetType(Integer))
    
        DGVReleased.DataSource = dt
        Task.Factory.StartNew(Sub() Populate(dt))
        ''you can replace last line with this:
        'Dim bgw = New BackgroundWorker()
        'AddHandler bgw.DoWork, Sub() Populate(dt)
        'bgw.RunWorkerAsync()
    End Sub
    
    Sub Populate(dt As DataTable)
        Dim cmd = New SqlCommand("IBS_fetchresleaseVehicle")
    
        cmd.CommandType = CommandType.StoredProcedure
        cmd.Connection = con.connect
        cmd.Parameters.Add("@locid", SqlDbType.Int).Value = Glocid
    
        Dim dr = cmd.ExecuteReader
        While dr.Read
            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()
    End Sub
    

  3. 提示

    而不是if条件,您可以稍后使用If Operator

    所以相反:

    If IsDBNull(dr("TBarcode") Then
        carid = 0
    Else
        carid = dr("TBarcode")
    End If
    

    写:

    carid = If(IsDBNull(dr("TBarcode")), 0, dr("TBarcode"))
    

    感谢@SSS:对于字符串字段,您可以简单地:

    carid = dr("TBarcode").ToString()