2017-08-08 51 views
0

我有一個datagridview填充20000行和是的,我需要所有的一次顯示,因爲如果我加載它的一部分,那麼報告是沒有用的在所有的C#Win。形式 - 優化代碼,以改變20000個單獨的行的顏色

現在越來越記錄約需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

我不確定,但可能是你可以嘗試改變RowPostPaint/RowPrePaint事件中的行的顏色 – VDN

+0

@VDN你似乎錯過了這一點。 「dgvItem.Rows [i] .DefaultCellStyle.BackColor = Color.LightGrey;」這句話是花費時間來執行20K次,這就是爲什麼我要求替代品。 –

+0

我的理解正確,我認爲使用RowPostPaint應該工作得很快。據我所知,事件RowPostPaint被調用只對當前在屏幕上可見的行,所以它不會執行20K – VDN

回答

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; 
    } 
} 

它有一些閃爍,同時滾動數據網格,但我相信它足夠快。

+0

工作像一個魅力,感謝隊友的人。 –

+1

爲防止閃爍使DGV Doublebuffered! – TaW

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; 
    } 
+0

感謝您的答案,但我已經嘗試過這種解決方案,並且在應用您的代碼之後,它比以前多花費「0.025秒」。 –