DataGridView加载速度非常慢.如何优化在DataGridView中添加行
本文关键字:DataGridView 优化 添加行 何优化 速度 加载 非常 | 更新日期: 2023-09-27 18:21:37
数据网格视图加载速度非常慢。如何优化它
数据网格视图有4-5000行
我必须根据几个参数动态生成一个数据网格视图。(数据库数据,列数)
我必须从数据库中的表(id,name,contact)垂直生成这样的datagridview。。
第1列
id
名称
联系
现在,列1旁边可以有任意数量的空列。
目前我正在采用这种方法。
- 首先添加所有空列
- 然后在每个for循环迭代中添加三行,每行一行(id、name、contact)
-
我从数据库中获取数据,并将其作为
List <string[]>
传递给GenerateRows
函数。private void GenerateColumns(int colLen) { dataGridViewGenerate.Rows.Clear(); dataGridViewGenerate.Columns.Clear(); DataGridViewColumn col0 = new DataGridViewTextBoxColumn(); col0.HeaderText = "Employee No. & Name"; dataGridViewGenerate.Columns.Add(col0); for (int i = 0; i < colLen; i++) { DataGridViewColumn col = new DataGridViewTextBoxColumn { HeaderText = (_sTime.AddDays(i)).Day.ToString(CultureInfo.InvariantCulture) + " " + (_sTime.AddDays(i)).ToString("ddd") }; dataGridViewGenerate.Columns.Add(col); } private void GenerateRows(List<string[]> empList) { int len = empList.Count; for (int a = 0; a < len; a++) { string[] arr = empList[a]; //row 1 var row1 = new DataGridViewRow(); row1.Cells.Add(new DataGridViewTextBoxCell { Value = arr[0] }); dataGridViewGenerate.Rows.Add(row1); //row 2 var row2 = new DataGridViewRow(); row2.Cells.Add(new DataGridViewTextBoxCell { Value = arr[1] }); dataGridViewGenerate.Rows.Add(row2); //row3 var row3 = new DataGridViewRow(); row3.Cells.Add(new DataGridViewTextBoxCell { Value = arr[2] }); dataGridViewGenerate.Rows.Add(row3); } }
我想用sql做一个过程,创建一个表并用数据填充它。然后将数据源分配给datagridview
我所做的不是一行一行地添加到DataGridView
中。我刚刚从数据中创建了一个DataTable
,并将其作为DataSource
分配给DataGridView
。
CCD_ 7的加载性能显著提高。
问题是,每当您向Datagridview添加一行时,它都会重新绘制,如果您不介意使用P/Invoke,您可以尝试此解决方案//暂停油漆
SendMessage(Datagridview.Handle, WM_SETREDRAW, false, 0);
//您在此处添加行的循环
然后调用以下方法恢复绘制
SendMessage(Datagridview.Handle, WM_SETREDRAW, true, 0);
p/Invoke声明应该类似于这个
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, Int32 wMsg, bool wParam, Int32 lParam);
private const int WM_SETREDRAW = 0x000B;
调用Rows.Add()是很昂贵的。这是一个快速而肮脏的改变来绕过这一点。
private void GenerateRows(List<string[]> empList)
{
List<DataGridViewRow> rows = new List<DataGridViewRow>();
int len = empList.Count;
for (int a = 0; a < len; a++)
{
string[] arr = empList[a];
//row 1
var row1 = new DataGridViewRow();
row1.Cells.Add(new DataGridViewTextBoxCell{Value = arr[0]});
/* CHANGED to add to List */
rows.Add(row1);
//row 2
var row2 = new DataGridViewRow();
row2.Cells.Add(new DataGridViewTextBoxCell{Value = arr[1]});
/* CHANGED to add to List */
rows.Add(row2);
//row3
var row3 = new DataGridViewRow();
row3.Cells.Add(new DataGridViewTextBoxCell{Value = arr[2]});
/* CHANGED to add to List */
rows.Add(row3);
}
/* ADDED all rows at once for performance */
dataGridViewGenerate.Rows.AddRange(rows.ToArray());
}