DataGridView мерцает ТОЛЬКО тогда, когда строки занимают примерно одну страницу - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть сетка, которая настолько проста, насколько это возможно.Он отображает одноразовый результат поиска и не обновляет свой источник данных, пока кнопка поиска не будет нажата снова, поэтому я не думаю, что обновление данных вызывает проблему.

Например, мой поиск возвращает 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);
    .......
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...