How to prevent DataGridView from flickering when s

2020-01-27 06:36发布

I am using windows forms C#.

Screen Shot

As shown in the screen shot, I have a Form which has a user control, a tab control and a DataGridView (30 rows and 17 columns). I read data from SQL Server to fill the DataGrdiView.

The issue:

When I scroll horizontally the DataGridView flickers a lot. However scrolling vertically works perfect with no flickering.

I had a look here, here, here and here but none of them related to my issue.

Anyone knows any solution to prevent DataGridView from flickering when scrolling horizontally.

3条回答
够拽才男人
2楼-- · 2020-01-27 07:27

In case anybody wanted to see this in Visual Basic.

Public Class DBDataGridView
    Inherits DataGridView

    Public Sub New()
        MyBase.New()
        DoubleBuffered = True
    End Sub

End Class

This worked great.

查看更多
太酷不给撩
3楼-- · 2020-01-27 07:35

use this class

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

and enter this code.

this.dataGridView1.DoubleBuffered(true);

enjoy.

查看更多
闹够了就滚
4楼-- · 2020-01-27 07:38

All you need is to use a DoubleBuffered DataGridview subclass:

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

It is also possible to inject double-buffering into a normal out-of-the-box control, but I prefer to have a class of my own as this is extensible in other ways as well..

I have expanded the class by a public property to allow turning DoubleBuffering on and off..:

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

    public DBDataGridView()
    {
        DoubleBuffered = true;
    }
}

..and tested it with a load of 200 columns and 2000 rows. The difference is obvious; while vertical scrolling did work without horizontal scrolling needs DoubleBuffering..

enter image description here

Note that the Form also has a DoubleBuffering property, but that will not propagate to any embedded controls!

Or you can use a function like this

查看更多
登录 后发表回答