Как предотвратить мерцание 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);
наслаждаться.
Все, что вам нужно, это использовать DoubleBuffered
DataGridview
подкласс:
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
Это сработало отлично.