Как предотвратить мерцание DataGridView при горизонтальной прокрутке?

Я использую формы Windows C#.

Скриншот

Как показано на снимке экрана, у меня есть форма, которая имеет пользовательский элемент управления, элемент управления вкладками и DataGridView (30 строк и 17 столбцов). Я читаю данные из SQL Server, чтобы заполнить DataGrdiView.

Проблема:

Когда я прокручиваю горизонтально DataGridView много мерцает Однако вертикальная прокрутка работает идеально, без мерцания.

Я посмотрел здесь, здесь, здесь и здесь, но никто из них не имел отношения к моей проблеме.

Кто-нибудь знает любое решение, чтобы предотвратить DataGridView от мерцания при горизонтальной прокрутке.

2 ответа

Использовать этот класс

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

наслаждаться.

Все, что вам нужно, это использовать 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..

Обратите внимание, что форма также имеет DoubleBuffering свойство, но это не будет распространяться на какие-либо встроенные элементы управления!

В функции FormLoad просто введите эту строку кода.

yourDataGridView.GetType().GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(yourDataGridView, true, null);

и импортируйте BindingFlags, написав строку ниже сверху.

using System.Reflection;

В случае, если кто-то хотел увидеть это в Visual Basic.

Public Class DBDataGridView
    Inherits DataGridView

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

End Class

Это сработало отлично.

Другие вопросы по тегам