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