在我的winforms应用程序中,如果所有列都是文本框列,我的数据网格视图需要 0.8秒才能填充+/- 5000rows。
其中一列是整数列,因此我决定将该列更改为ImageColumn,并在网格的Cell_formatting事件中,使用以下代码确定要显示的相应图像:
private void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) {
if (dgv.Columns[e.ColumnIndex] is DataGridViewImageColumn && e.ColumnIndex == 1) {
int cellVal = (int)e.Value;
switch (cellVal) {
case 1:
e.Value = Properties.Resources.Pending;
dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].ToolTipText = "Item pending attention";
break;
case 2:
e.Value = Properties.Resources.Tick
dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].ToolTipText = "File is available";
break;
default:
break;
}
}
}
有效。但是,datagridview现在需要几乎 5秒来填充自己!!和排序列只是变得太耗时。 5秒现在可能看起来不是很多,但是在大约2个月的时间内行数会增加到大约30,000 !!
有没有更有效的方法来处理这种情况?
谢谢你!
答案 0 :(得分:1)
这可能没有任何帮助,但您可以先尝试进行e.ColumnIndex == 1
比较。从&&&是一个短路运算符,您不会为每列评估dgv.Columns[e.ColumnIndex] is DataGridViewImageColumn
。
编辑:我真的会使用Visual Studio Profiler或其他一些表演工具来查找瓶颈。
答案 1 :(得分:1)
您是否检查过瓶颈不在读取和(可能)调整图像大小?
如果您以32x32像素(例如)显示图像,但它们存储为128x128像素(比方说),则每次显示图像时都会调整大小。
答案 2 :(得分:1)
如果需要考虑表现,您可以考虑using the DataGridView in virtual mode。