我正在使用一个 BindingSource
控件 (参考链接) 来填充我的 DataGridView
控件。约有1000多条记录在其中进行填充,我正在使用线程来完成这个过程。在这种情况下,DataGridView
的性能非常慢。
我尝试将 DoubleBuffered
属性设置为 true,RowHeadersWidthSizeMode
禁用,AutoSizeColumnsMode
设置为 none。但还是出现了同样的行为。
我该如何提高表格的性能?
我正在使用一个 BindingSource
控件 (参考链接) 来填充我的 DataGridView
控件。约有1000多条记录在其中进行填充,我正在使用线程来完成这个过程。在这种情况下,DataGridView
的性能非常慢。
我尝试将 DoubleBuffered
属性设置为 true,RowHeadersWidthSizeMode
禁用,AutoSizeColumnsMode
设置为 none。但还是出现了同样的行为。
我该如何提高表格的性能?
我认为你需要考虑在虚拟模式下使用数据网格。基本上,你需要预先设置网格的范围,然后根据需要覆盖"OnCellValueNeeded"。
你会发现(特别是对于只有1000行左右的情况),你的网格填充变得非常快。
祝你好运!
我曾经遇到过同样的问题,但是我通过设置解决了它。
AutoSizeRowsMode to DisplayedCellsExceptHeaders
并对列设置相同的内容
DataGridView1.Visible = False
'fill your data here
DataGridView1.Visible = True
在排除故障一段时间后,我发现速度主要问题仍然来自于将dataGridView从非UI线程更改。下面的代码已经完全解决了从dataTable数据源缓慢填充datagridview的问题。
dataGridView1.Invoke(new MethodInvoker(() =>
dataGridView1.DataSource = table)
);
Dim asrm = DataGridView1.AutoSizeRowsMode
Dim ascm = DataGridView1.AutoSizeColumnsMode
Dim chhs = DataGridView1.ColumnHeadersHeightSizeMode
DataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None
DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None
DataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing
DataGridView1.SuspendLayout()
bs.SuspendBinding()
DataGridView1.DataSource = Nothing
For Each t As obj In lt_list
bs.Add(t)
Next
DataGridView1.DataSource = bs
DataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders
DataGridView1.AutoSizeColumnsMode = ascm
DataGridView1.ColumnHeadersHeightSizeMode = chhs
bs.ResumeBinding()
DataGridView1.ResumeLayout()
16000 项, 使用 .DataSource <> Nothing 只需 16 秒, 使用 .DataSource = Nothing 只需 300 毫秒