簡體   English   中英

C#Win。 表單-優化代碼以更改20,000個單獨行的顏色

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM