使用大量数据填充DataGridView时性能缓慢

28

我正在使用一个 BindingSource 控件 (参考链接) 来填充我的 DataGridView 控件。约有1000多条记录在其中进行填充,我正在使用线程来完成这个过程。在这种情况下,DataGridView 的性能非常慢。

我尝试将 DoubleBuffered 属性设置为 true,RowHeadersWidthSizeMode 禁用,AutoSizeColumnsMode 设置为 none。但还是出现了同样的行为。

我该如何提高表格的性能?


考虑使用分页/筛选器来处理数据。 - Renatas M.
我经常遇到同样的问题;我也有几千条记录在一个列表中,必须使用分页来处理这些记录 - 这解决了问题,但同时也带来了新的问题! - Argeman
在SO上最常见的重复问题之一 - nawfal
没错,我也觉得用户会如何处理成千上万行的数据。但是这是我的客户目前的要求,所以我必须想方设法实现它 :) - VJOY
这个对我解决了同样的问题: https://dev59.com/LXA65IYBdhLWcg3w4C6j#37735997 - user2525774
15个回答

0

我认为你需要考虑在虚拟模式下使用数据网格。基本上,你需要预先设置网格的范围,然后根据需要覆盖"OnCellValueNeeded"。

你会发现(特别是对于只有1000行左右的情况),你的网格填充变得非常快。

祝你好运!


0

我曾经遇到过同样的问题,但是我通过设置解决了它。

AutoSizeRowsMode to DisplayedCellsExceptHeaders

并对列设置相同的内容


0
我发现最好的方法就是在加载之前将 DataGridView 的可见属性设置为 false,加载完成后再设置为 true。
    DataGridView1.Visible = False
    
    'fill your data here

    DataGridView1.Visible = True

0

在排除故障一段时间后,我发现速度主要问题仍然来自于将dataGridView从非UI线程更改。下面的代码已经完全解决了从dataTable数据源缓慢填充datagridview的问题。

dataGridView1.Invoke(new MethodInvoker(() =>
                dataGridView1.DataSource = table)
                        );

-1
        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 毫秒


1
这是一个带有C#标签的问题。 - Theodor Zoulias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接