我有一个datagridview,它填充了20,000行,而 是的,我需要一次显示所有这些行,因为如果我加载了它的一部分,那么报告根本就没用了
现在获取记录需要 1.5到2秒这是合理的,因为数量很大但是在获取记录之后我必须单独更改每行的颜色以满足特定情况,就像我的情况一样如果该记录有一列“ Iden = 0 ”,则将颜色更改为“浅灰色”,使用以下代码。
//Datagridview Has 20,000 Records in it
for (int i = 0; i < dgvItem.Rows.Count; i++)
{
if (dgvItem.Rows[i].Cells["Iden"].EdittedFormattedValue.ToString() == "0")
{
dgvItem.Rows[i].DefaultCellStyle.BackColor = Color.LightGrey;
}
}
但使用上面的代码需要大约10-12秒。现在有什么方法可以优化它吗?
我尝试使用“ SuspendLayout ”和“ ResumeLayout ”,但这没用。
答案 0 :(得分:2)
尝试向您的数据网格添加如下事件:
private void dgvItem_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
if (dgvItem.Rows[e.RowIndex].Cells["Iden"].EditedFormattedValue.ToString() == "0")
{
dgvItem.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.LightGray;
}
}
滚动数据网格时有一些闪烁,但我相信它足够快。
答案 1 :(得分:0)
在这样的情况下,我通过暂停(然后恢复)绘图获得了一些性能改进。它需要API调用:
#region Suspend / resume drawing
/// <summary>
/// Method to stop drawing of the control (useful when doing data dumps etc)
/// </summary>
public void SuspendDrawing()
{
NativeMethods.SendMessage(this.Handle, NativeMethods.WM_SETREDRAW, (IntPtr)0, (IntPtr)0);
}
/// <summary>
/// Method to restart drawing of the control if it has been stopped.
/// </summary>
public void ResumeDrawing()
{
NativeMethods.SendMessage(this.Handle, NativeMethods.WM_SETREDRAW, (IntPtr)1, (IntPtr)0);
this.Refresh();
}
#endregion
原生方法:
internal static class NativeMethods
{
//Codes for suspending painting (for fast loading)
[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
public static uint WM_SETREDRAW = 11;
}