2017-01-27 228 views
2

我正在使用Windows窗體C#。如何防止DataGridView在水平滾動時閃爍?

​​

如屏幕截圖所示,我有具有用戶控制,標籤控制和一個DataGridView(30行和17列)表單。我從SQL Server讀取數據以填充DataGrdiView。

問題:

當我水平滾動的DataGridView閃爍了很多。然而,垂直滾動工作完美無閃爍。

我當時一看herehereherehere但沒有人與我的問題。

任何人都知道任何解決方案,以防止DataGridView水平滾動時閃爍。

+1

您是否嘗試啓用窗體中的雙緩衝? – Carles

+0

我認爲它是因爲事件,你使用網格事件嗎? –

+0

@汽車。沒有。你能告訴我怎麼做,我是新來的C# – Sam

回答

6

所有你需要的是使用DoubleBufferedDataGridview

class DBDataGridView : DataGridView 
{ 
    public DBDataGridView() { DoubleBuffered = true; } 
} 

也可以注入雙緩衝到正常出的現成的控制,但我更喜歡有一類我自己,因爲這是在其他方面也擴展..

我已經通過一個公共屬性擴展類,允許開啓和關閉DoubleBuffering ..:

public class DBDataGridView : DataGridView 
{ 
    public new bool DoubleBuffered 
    { 
     get { return base.DoubleBuffered; } 
     set { base.DoubleBuffered = value; } 
    } 

    public DBDataGridView() 
    { 
     DoubleBuffered = true; 
    } 
} 

..並用200列2000行加載測試它。差異是顯而易見的;而垂直滾動做工作,而水平滾動需要DoubleBuffering ..

enter image description here

注意窗體也有一個DoubleBuffering財產,但將不傳播任何嵌入式控制!

+0

還有別的辦法嗎?我正在尋找類似'dgv.DoubleBuffered = true;'的東西。 –

+0

我已經更新了答案,以包含一個'新的DoubleBuffered'屬性。 – TaW

1

使用這個類

public static class ExtensionMethods 
{ 
    public static void DoubleBuffered(this DataGridView dgv, bool setting) 
    { 
     Type dgvType = dgv.GetType(); 
     PropertyInfo pi = dgvType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic); 
     pi.SetValue(dgv, setting, null); 
    } 
} 

,並輸入驗證碼。

this.dataGridView1.DoubleBuffered(true); 

享受。