У меня есть сетка, которая настолько проста, насколько это возможно.Он отображает одноразовый результат поиска и не обновляет свой источник данных, пока кнопка поиска не будет нажата снова, поэтому я не думаю, что обновление данных вызывает проблему.
Например, мой поиск возвращает 30 строкрезультатов, и моя полноэкранная сетка данных может уместиться в 40 строк без прокрутки, мерцания нет.Затем я начал медленно уменьшать высоту окна.Как только высота вида сетки немного меньше высоты моих 30 строк, она начинает мерцать.Но если я еще больше уменьшу высоту окна, чтобы в виде сетки отображалось только 20 строк, полоса прокрутки отображается, как и ожидалось, и все снова в порядке.Даже прокрутка вверх или вниз не мерцает совсем.
Хотя я не думаю, что это связано с производительностью, я пробовал такие вещи, как приостановка размещения и двойная буферизация, которая не помогает, как ожидалось.
Я думаю, что это связано с автоматическим вычислением высоты строки, когда оно близко к граничному условию, но я не знаю, как это решить.Ниже приведены настройки автоматического размера строки, которые могут / не могут повлиять на нее.
dgv.DataSource = datatable;
dgv.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
dgv.Sort(dgv.Columns["Creation Date"], ListSortDirection.Ascending);
dgv.Columns["Creation Date"].SortMode = DataGridViewColumnSortMode.Automatic;
dgv.Columns["Name"].SortMode = DataGridViewColumnSortMode.Automatic;
dgv.Columns["Name"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
dgv.Columns["Name"].DefaultCellStyle.WrapMode = DataGridViewTriState.True;
dgv.Columns["Receipt No."].SortMode = DataGridViewColumnSortMode.Automatic;
dgv.Columns["Receipt No."].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
dgv.Columns["Receipt No."].DefaultCellStyle.WrapMode = DataGridViewTriState.True;
dgv.Columns["Remark"].DefaultCellStyle.WrapMode = DataGridViewTriState.True;
dgv.Columns["Remark"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
Это мой класс двойной буферизации на случай, если я испортил
public static class BufferedGridView
{
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);
}
}
Здесь я использовалэто, в форме, которая содержит вид сетки;
public ManagementPage()
{
InitializeComponent();
dgv.DoubleBuffered(true);
.......
}