C#,如何提高DataGridView控件的显示效率?一次要管理100万条记录,如何才能不卡?不仅仅是虚拟模式的问题。

C#,如何提高DataGridView控件的显示效率?一次要管理100万条记录,如何才能不卡?不仅仅是虚拟模式的问题。

(1)采用virtualmode,不要使用datagridview1.datasource = dt

如何使用虚拟模式,参见https://blog.csdn.net/qq_30122639/article/details/53739607和https://bbs.csdn.net/topics/390948328?list=lz

分为两步:

1)将Accdb加载到datagridview的函数

public void LoadAccdb2Datagridview_Parent_VirtualMode_is_True(string accdbfilenameOpened_, string needTableName_, string resultTableName_, string password, bool IsShowAllGroundPtsDataOrOnlyCentralPts = false)
{
            System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
            watch.Start();  //开始监视代码运行时间;
            //需要测试的代码;
            this.datatable_1 = new System.Data.DataTable();
            this.datatable_2 = new System.Data.DataTable();
            this.datatable_1 = MdbProcess.LoadAccdbTable2DataTable(accdbfilenameOpened_, needTableName_, password);
            this.datatable_2 = MdbProcess.LoadAccdbTable2DataTable_filter(accdbfilenameOpened_, resultTableName_, password, IsShowAllGroundPtsDataOrOnlyCentralPts);
            watch.Stop();  //停止监视
            TimeSpan timespan = watch.Elapsed;  //获取当前实例测量得出的总时间
            System.Diagnostics.Debug.WriteLine("读取数据库执行时间: " + timespan.TotalMilliseconds + "毫秒," + timespan.TotalSeconds + "秒");  //总毫秒数

            //////////////////////////////////////////////////////////////////////////

            //   给dataGridView增加列;
            if (this.dataGridView1.Columns.Count == 0)
            {
                foreach (System.Data.DataColumn column in this.datatable_1.Columns)
                {
                    this.dataGridView1.Columns.Add(column.ColumnName, column.ColumnName);
                }
            }
            if (this.dataGridView2.Columns.Count == 0)
            {
                foreach (System.Data.DataColumn column in this.datatable_2.Columns)
                {
                    this.dataGridView2.Columns.Add(column.ColumnName, column.ColumnName);
                }
            }

//设置颜色

            this.dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = System.Drawing.Color.Beige;
            this.dataGridView2.AlternatingRowsDefaultCellStyle.BackColor = System.Drawing.Color.Beige;

//设置VirtualMode为true 
            if (this.dataGridView1.VirtualMode == false || this.dataGridView2.VirtualMode == false)
            {
                this.dataGridView1.VirtualMode = true;
                this.dataGridView2.VirtualMode = true;
            }

//根据datatable设置dataGridView的显示行数,注意,dataGridView的AllowUsertoAddRows要设置成False
            this.dataGridView1.RowCount = this.datatable_1.Rows.Count ;       // +1 ;
            this.dataGridView2.RowCount = this.datatable_2.Rows.Count ;       // +1 ;
}

2)dataGridView1_CellValueNeeded()函数

private void dataGridView1_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
        {
            int colCount = this.dataGridView1.ColumnCount;
            int colCount2 = this.dataGridView1.Columns.Count;

            if (e.RowIndex == this.dataGridView1.RowCount)
            {
                return;
            }
            else
            {
                //string colName = this.dataGridView1.Columns[e.ColumnIndex].Name;
                //e.Value = this.datatable_1.Rows[e.RowIndex][colName].ToString();
                 
                //或者
                e.Value = this.datatable_1.Rows[e.RowIndex][e.ColumnIndex].ToString();
            }

        }

 

(2)将datagridview1的AutoSizeColumnsMode和AutoSizeRowsMode属性都设置为None

C# 中的datagridview显示过慢的原因之一

Datagridview操作性能慢的问题

用datagridview绑定数据源,第一列是一个checkbox,用于标志是否选中。当光标点到这行时自动选中这个checkbox,并且提供全选与取消全选的功能,这本是一个很简单的功能,但出现的问题是,鼠标点中行时,自动勾选checkbox,给checkbox赋值的速度相当慢,全选和取消全选更不用说,几十行就慢得不行,更别说上百行上千行的数据,没半小时都别想循环完.

最后找出问题所在,Datagridview的AutoSizeColumnsMode!

不能把这个属性的值设置成Allcells****,否则将导致操作datagridview数据变得极慢.可以考虑换成displayedcells**,有相同的视觉效果,速度很快.

可惜不知道怎样调试到datagridview内部去,真想去看个究竟,这datagridview到底干了些啥事.

希望给搜索到这篇的朋友一个提醒.
--------------------- 
作者:三断笛 
来源:CSDN 
原文:https://blog.csdn.net/xxyj6450/article/details/9051011 
版权声明:本文为博主原创文章,转载请附上博文链接!

(3) 将RowHeadersWidthSizeMode和ColumnHeadersHeightSizeMode属性设为DisableResizing(用户不能使用鼠标调整列标头的宽度)/EnableResizing(用户可以使用鼠标调整列标头的宽度),如果要显示行号,可以将RowHeadersWidthSizeMode设置为AutoSizeToFirstHeader

https://blog.csdn.net/weixin_34116110/article/details/85448837

严重影响DataGridView性能的2个属性

C# DataGridView显示行号的三种方法

https://blog.csdn.net/chenpeng0118/article/details/7402199

 

你可能感兴趣的:(编程技巧)