Вертикальная полоса прокрутки DataGridView не обновляется должным образом (ошибка форм?) - PullRequest
17 голосов
/ 26 декабря 2011

Я столкнулся с ошибкой (я полагаю) в .NET 3.5.При добавлении строк в DataGridView с использованием Rows.Add (), когда DGV отключен, вертикальная полоса прокрутки не обновляется должным образом.Следовательно, после повторного включения DGV невозможно прокрутить полностью до нижней части DGV с помощью полосы прокрутки или колесика мыши (хотя навигация с помощью клавиш со стрелками все еще работает.)

Поэтому я ищуобходной путь.Есть ли способ заставить полосу прокрутки обновить свои границы или вы можете вручную ввести новое максимальное значение?Я бы предпочел не заполнять DGV.

*) На самом деле родительская форма отключена, но я предполагаю, что проблема в том, что она распространяется на элемент управления DGV.

Ответы [ 13 ]

20 голосов
/ 28 ноября 2013

Это также решило проблему для меня:

DataGridView.SuspendLayout();
DataGridView.ResumeLayout();

Его можно вызвать до повторного включения DGV.


UPDATE: Это также делает работу:

DataGridView.PerformLayout();
14 голосов
/ 25 января 2012

Я только что столкнулся с этой проблемой (моя форма была отключена при добавлении строк) и решил ее, установив свойство полосы прокрутки сетки на «Нет» перед добавлением строк, а затем установив его обратно на «Оба», как только все мои строки были добавлены.

2 голосов
/ 25 июня 2016

Моя проблема заключалась в том, что моя вертикальная полоса прокрутки исчезла полностью. Я ухватился за все вышеизложенные предложения и, наконец, обнаружил, что создание панели, содержащей DataGridView, более узкой, чем форма, решило проблему. В моем случае сработал на 16 пикселей уже.

1 голос
/ 30 июля 2015

Если ни одно из указанных решений не помогло вам, я столкнулся с аналогичной проблемой вертикальной полосы прокрутки в DataGridView.Но проблема в том, что всякий раз, когда количество строк выходит за пределы высоты сетки данных, вертикальная прокрутка создает испорченный пользовательский интерфейс.Вид строк, перекрывающих друг друга.

У меня был DataGridView с привязкой к данным.

Это список вещей, которые я пробовал, но не работал.

  1. Установите для свойства ScrollBars значение None, измените источник данных, а затем установите для свойства ScrollBars значение Both.
  2. Использование SuspendLayout, ResumeLayout и PerformLayout в различных комбинациях.
  3. Установка двойной буферизации для DataGridView с использованием метода расширения.

Наконец, установка AutoSizeRowsMode в DataGridViewAutoSizeRowsMode.AllCells исправила проблему для меня.

Если у вас есть похожая проблема с горизонтальной прокруткой,Я думаю, что игра с AutoSizeColumnsMode должна исправить проблему.

0 голосов
/ 27 февраля 2018

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

Я обнаружил, что нужно сделать правильное обновление простоавтоматическое включение / выключение при каждом видимом изменении:

public MyForm()
{
    InitializeComponent();

    // Automatic scroll to bottom (it might not work if you try to do it without this event)
    datagrid.RowsAdded += (sender, e) =>
    {
        datagrid.FirstDisplayedScrollingRowIndex = datagrid.RowCount - 1;
    };

    // WinForms bug fix: scrollbar update
    datagrid.VisibleChanged += (sender, e) =>
    {
        Enabled = false;
        Enabled = true;
    };
}
0 голосов
/ 20 мая 2017

Моим решением было отключить полосы прокрутки в его свойствах. Затем включите их из строки кода после инициализации окна. DataGridViewObj.ScrollBars = ScrollBars.Both

0 голосов
/ 17 февраля 2016

Я нашел ваше сообщение при поиске решения проблемы, с которой столкнулся. В Microsoft Surface (Win10) я столкнулся с невозможностью вертикальной прокрутки DataGridView до последней строки длинного списка с помощью сенсорного жеста (например, щелчка). Зачастую до последней строчки было невероятно сложно добраться. Решение было простым, но мне понадобилось время, чтобы разобраться. Я оставляю это здесь на случай, если это будет полезно.

// Override WndProc in your custom class inherited from DataGridView
protected override void WndProc(ref Message m)
{
  switch (m.Msg)
  {
    case 0x115:// WM_VSCROLL
      // The low-order word holds the command
      uint cmd = ((uint)m.WParam & (uint)0x0000FFFF);
      switch (cmd)
      {
        case 5: // SB_THUMBTRACK
          if (Rows.Count > 0)
          {
            // The high-order word holds the position
            uint pos = ((uint)m.WParam & (uint)0xFFFF0000) >> 16;

            // SAVE: This would give us the "true" ratio based on 100%
            // SAVE: double ratio = (double)pos / (double)(VerticalScrollBar.Maximum - VerticalScrollBar.LargeChange);
            // SAVE: Debug.WriteLine("Scroll Position: " + pos + "\t" + (ratio * 100.0).ToString("F2") + "%");

            // What we want is the ratio to the TOP of the thumb, BECAUSE
            // THIS GIVES US THE RATIO TO THE FIRST LINE INDEX
            double firstLineRatio = (double)pos / (double)(VerticalScrollBar.Maximum);
            // We want to make it so that it shows the full line 
            // even if we just barely meet the ratio
            double dFirstLine = firstLineRatio * Rows.Count;
            int iFirstLine = (int)(dFirstLine + 0.9999);
            // SAVE: Debug.WriteLine("Scroll Position: " + pos + "\t" + (ratio * 100.0).ToString("F2") + "%");
            FirstDisplayedScrollingRowIndex = iFirstLine;
            // We do this INSTEAD OF the default for this message, so RETURN
            return;
          }
          break;
      }
      break;
    default:
      break;
  }
  base.WndProc(ref m);
}
0 голосов
/ 31 января 2016

Последние две строки моего DataGridView всегда были скрыты на моих WinForms.Я мог прокручивать их, используя клавишу со стрелкой вниз на клавиатуре (но все еще не видел, в какой строке я был на самом деле).Колесо мыши и полоса прокрутки вниз не дойдут до них.Только с небольшим набором данных и максимизацией формы я смог увидеть последние две строки.

Вот как я решил проблему: я поместил DataGridView в Panel.BAM!

Это также исправило еще одну проблему с DataGridView, которая заключалась в том, что при изменении размера заголовков столбцов странные вертикальные линии появлялись на любом элементе управления UI ниже DataGridView.Это было очень некрасиво и непрофессионально.Но теперь это тоже исправлено.

0 голосов
/ 11 декабря 2015

Поскольку ползунок не был правильно настроен и занимал большую часть вертикальной полосы прокрутки, мое решение было -

DGV.height = DGV.Height + 1

DGV.Height = DGV.Height- 1

Тогда ползунок был правильно настроен

Но теперь я использую

DGV.PerformLayout

, что также решает проблему

0 голосов
/ 27 ноября 2014

Моя проблема возникла из-за вызова dgv.Add () в пользовательском потоке.После изменения его для вызова из потока пользовательского интерфейса полоса прокрутки отображалась и функционировала нормально:

        if (dataGridView1.InvokeRequired)
        {
            dataGridView1.Invoke((Action)(() => dataGridView1.Rows.Add(new String[] { abc, efg })));
        }
        else
        {
            dataGridView1.Rows.Add(new String[] { calPoint, logUrl });
        }
...