VB 中的 DataGridView 卡顿
Stuttering DataGridView in VB
我有一个 DataGridView 绑定到具有数百行的数据table,该数据库是一个写入 txt 文件的简单平面文件数据库。每当我滚动到底部时,DGV 就会开始卡顿。我正在考虑解决方案,但找不到编码方法
这是我提出的解决方案:
- 使用分页减少呈现的行数。这是 similar solution 但他们使用的是 sql
- 使用我从未接触过的doublebuffer。我试过 DGV.doublebuffer = true 但它说 DGV 受保护
非常感谢对我的问题的任何帮助或澄清
编辑:这是 GIF 我的 DGV 是如何结结巴巴的
数据table被命名为Tbl_Sample
下面是我如何将数据行插入数据 table。它使用 Flatfile 数据库(.txt 文件)上的 System.IO
获取数据,拆分每一行然后将其作为行 InputTbl
发送到
Public Sub Update_Table(InputTbl As DataTable, InputFile As String)
InputTbl.Rows.Clear()
Dim lines() As String
Dim vals() As String
lines = File.ReadAllLines(InputFile)
For i = 0 To lines.Length - 1
vals = lines(i).ToString().Split("|")
Dim row(vals.Length - 1) As String
For j = 0 To vals.Length - 1
row(j) = vals(j).Trim()
Next j
InputTbl.Rows.Add(row)
Next i
End Sub
我通过 DGV.DataSource = Tbl_Sample
将 table 设置为 DGV 的数据源
数据table 创建为关注
Public Sub Sample_Table()
'Method For creating database file
Create_DBFile("Sample.db")
Try
Tbl_Sample.Columns.Add("ID", Type.GetType("System.Int32"))
Tbl_Sample.Columns.Add("Name", Type.GetType("System.String"))
Tbl_Sample.Columns.Add("Username", Type.GetType("System.String"))
Tbl_Sample.Columns.Add("Account_Type", Type.GetType("System.String"))
Tbl_Sample.Columns.Add("Date", Type.GetType("System.String"))
Tbl_Sample.Columns.Add("Time", Type.GetType("System.String"))
Catch ex As Exception
End Try
Update_Table(Tbl_Sample, "Sample.db") 'populate table
End Sub
我创建列的方式不是最好的。我只是从我的旧程序中复制的
解决方案linkhere
Imports System.Reflection
Public Sub EnableDoubleBuffered(ByVal dgv As DataGridView)
Dim dgvType As Type = dgv.[GetType]()
Dim pi As PropertyInfo = dgvType.GetProperty("DoubleBuffered", _
BindingFlags.Instance Or BindingFlags.NonPublic)
pi.SetValue(dgv, True, Nothing)
End Sub
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
EnableDoubleBuffered(MyDataGridView, True)
End Sub
我有一个 DataGridView 绑定到具有数百行的数据table,该数据库是一个写入 txt 文件的简单平面文件数据库。每当我滚动到底部时,DGV 就会开始卡顿。我正在考虑解决方案,但找不到编码方法
这是我提出的解决方案:
- 使用分页减少呈现的行数。这是 similar solution 但他们使用的是 sql
- 使用我从未接触过的doublebuffer。我试过 DGV.doublebuffer = true 但它说 DGV 受保护
非常感谢对我的问题的任何帮助或澄清
编辑:这是 GIF 我的 DGV 是如何结结巴巴的
数据table被命名为Tbl_Sample
下面是我如何将数据行插入数据 table。它使用 Flatfile 数据库(.txt 文件)上的 System.IO
获取数据,拆分每一行然后将其作为行 InputTbl
发送到
Public Sub Update_Table(InputTbl As DataTable, InputFile As String)
InputTbl.Rows.Clear()
Dim lines() As String
Dim vals() As String
lines = File.ReadAllLines(InputFile)
For i = 0 To lines.Length - 1
vals = lines(i).ToString().Split("|")
Dim row(vals.Length - 1) As String
For j = 0 To vals.Length - 1
row(j) = vals(j).Trim()
Next j
InputTbl.Rows.Add(row)
Next i
End Sub
我通过 DGV.DataSource = Tbl_Sample
数据table 创建为关注
Public Sub Sample_Table()
'Method For creating database file
Create_DBFile("Sample.db")
Try
Tbl_Sample.Columns.Add("ID", Type.GetType("System.Int32"))
Tbl_Sample.Columns.Add("Name", Type.GetType("System.String"))
Tbl_Sample.Columns.Add("Username", Type.GetType("System.String"))
Tbl_Sample.Columns.Add("Account_Type", Type.GetType("System.String"))
Tbl_Sample.Columns.Add("Date", Type.GetType("System.String"))
Tbl_Sample.Columns.Add("Time", Type.GetType("System.String"))
Catch ex As Exception
End Try
Update_Table(Tbl_Sample, "Sample.db") 'populate table
End Sub
我创建列的方式不是最好的。我只是从我的旧程序中复制的
解决方案linkhere
Imports System.Reflection
Public Sub EnableDoubleBuffered(ByVal dgv As DataGridView)
Dim dgvType As Type = dgv.[GetType]()
Dim pi As PropertyInfo = dgvType.GetProperty("DoubleBuffered", _
BindingFlags.Instance Or BindingFlags.NonPublic)
pi.SetValue(dgv, True, Nothing)
End Sub
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
EnableDoubleBuffered(MyDataGridView, True)
End Sub