[英]C# Win. Form - Optimizing code to change color of 20,000 individual row
我有一個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 ”,但這是沒有用的。
嘗試將如下所示的事件添加到您的數據網格:
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;
}
}
滾動數據網格時,它有些閃爍,但我相信它足夠快。
在這種情況下,我通過暫停(然后恢復)繪圖進行了一些性能改進。 但是,它需要一個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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.