DataGridView: полоса прокрутки не обновляется - PullRequest
2 голосов
/ 13 мая 2010

Я работаю (исправляю ошибки) над проектом, который был написан в VS 2005. В форме есть один элемент управления DataGridView. Когда он загружается впервые, сетка данных элемента управления заполняется строками данных из коллекции вручную или в кодах. На самом деле, есть метод PopulateDataGrid (), который выполняет эту работу.

В форме есть еще один элемент управления. Когда элемент управления изменяется, сначала будет очищена сетка данных, а затем строки снова заполнены с помощью PopulateDataGrid (). Проблема в том, что при обновлении сетки вертикальная полоса прокрутки не сбрасывается правильно. Я думал, что так и должно быть. Поскольку полоса прокрутки не сбрасывается, когда я пытался нажать на сетку и двигаться вниз, я получил исключение: {«Значение« 222 »недопустимо для« Значение ».« Значение »должно быть между« минимальным »и« максимальным » '. \ r \ nПараметр имени: значение "}:

 at System.Windows.Forms.ScrollBar.set_Value(Int32 value)
 at System.Windows.Forms.DataGridView.ScrollRows(Int32 rowCount, Int32 deltaY, ScrollEventType scrollEventType)
 at System.Windows.Forms.DataGridView.ScrollRowsByCount(Int32 rows, ScrollEventType scrollEventType)
 at System.Windows.Forms.DataGridView.ScrollRowIntoView(Int32 columnIndex, Int32 rowIndex, Boolean committed, Boolean forCurrentCellChange)
 at System.Windows.Forms.DataGridView.ScrollIntoView(Int32 columnIndex, Int32 rowIndex, Boolean forCurrentCellChange)
 at System.Windows.Forms.DataGridView.ProcessDownKeyInternal(Keys keyData, Boolean& moved)
 at System.Windows.Forms.DataGridView.ProcessDataGridViewKey(KeyEventArgs e)
 at System.Windows.Forms.DataGridView.OnKeyDown(KeyEventArgs e)
 at System.Windows.Forms.Control.ProcessKeyEventArgs(Message& m)
 ...

Все настройки для управления сеткой являются значениями по умолчанию. Например, ScrollBars - Оба. Ниже приводится единственное связанное место для установки свойства автоматического размера строки:

poDataGridView.AutoSizeRowsMode =
            DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders;

Я не уверен, есть ли какое-либо свойство, которое я должен установить в конструкторе?

Ответы [ 3 ]

4 голосов
/ 13 мая 2010

Мне кажется, я решил проблему. Я должен установить полосы прокрутки элемента управления до обновления ни одного до обновления и вернуться к обоим в моем вызове метода обновления:

 private void PopulateDataGrid() {
    dataGrid.Rows.Clear();
    dataGrid.ScrollBars = ScrollBars.None;
    // continue to get new data and populate cells....
    dataGrid.ScrollBars = ScrollBars.Both;
 }
3 голосов
/ 04 июля 2013

Вы можете использовать

dataGridView.PerformLayout(); 

Чтобы принудительно обновить полосу прокрутки сетки данных, это обычно решает эту проблему, но если она не работает, просто убедитесь, что вставки и удаления столбцов в вашей dataGrid выполняются, пока он активен (включен ) и он обновится сам собой правильно.

0 голосов
/ 18 октября 2012

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

Я обнаружил, что сброс полос прокрутки с использованием кода в методе datarefresh не решил проблему.

Как мне удалось обойти это - установить флаг, указывающий, что данные были обновлены, и когда пользователь выбрал вкладку основного списка (содержащую сетку данных), этот флаг будет определять, устанавливать ли вручную столбец сортировки сетки и направление сортировки , Казалось, это работает.

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

...