DataGridView: как сделать полосу прокрутки синхронизированной с текущим выбором ячейки? - PullRequest
3 голосов
/ 03 июня 2010

У меня есть приложение Windows с DataGridView в качестве представления данных. Каждые 2 минуты сетка будет обновляться новыми данными. Чтобы синхронизировать полосу прокрутки с добавленными новыми данными, необходимо сбросить полосы прокрутки:

dbv.Rows.Clear(); // clear rows
SCrollBars sc = dbv.ScrollBars;
dbv.ScrollBars = ScrollBars.None;
// continue to populate rows such as dbv.Rows.Add(obj);
dbv.ScrollBars = sc; // restore the scroll bar setting back

С вышеуказанными кодами полоса прокрутки снова появляется нормально после обновления данных. Проблема в том, что приложение требует установить определенную ячейку, выбранную после обновления:

dbv.CurrentCell = dbv[0, selectedRowIndex];

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

Похоже, что положение полосы прокрутки возвращается к 0 после сброса. Код для установки CurrentCell сетки не заставляет полосу прокрутки перемещаться в правильное место. Насколько мне известно, нет свойства или метода для получения или установки значения полосы прокрутки в DataGriadView.

Я также пытался установить выбранную строку наверх:

dbv.CurrentCell = dbv[0, selectedRowIndex];
dbv.FirstDisplayedScrollingRowIndex = selectedRowIndex;

Строка будет установлена ​​наверх, но положение полосы прокрутки по-прежнему не синхронизировано. Не уверены, есть ли способ синхронизировать положение полосы прокрутки с выбранной строкой, заданной в коде?

Ответы [ 2 ]

1 голос
/ 05 июня 2010

Я нашел ответ, чтобы решить проблему. Как я уже говорил, элемент управления не имеет методов или свойств для установки правильного значения полосы прокрутки. Тем не менее, полоса прокрутки и содержимое DatagridView будут отображаться правильно, если есть взаимодействие непосредственно с пользовательским интерфейсом, такое как касание полосы прокрутки или ячейки сетки. Похоже, что элемент управления необходимо перефокусировать и перекрасить.

Простое использование следующих кодов не приводит к сбросу полосы прокрутки:

 dgv.Select();
 // or dbv.Focuse();

Я нашел способ заставить элемент управления DatagridView снова исчезнуть. К счастью, у меня есть элемент управления вкладками с несколькими вкладками. Затем я переключаю вкладку, чтобы получить сброс полосы прокрутки:

int index = myTabCtrl.SelectedIndex;
if (index == (myTabCtrl.TabCount)) {
  dgv.SeletecedIndex = 0;
}
else {
  dgv.SelectedIndex = index + 1;
}
myTabCtrl.SelectedIndex = index;

Если у вас нет способа скрыть DatagridView в вашей форме, вы можете просто свернуть форму и затем восстановить ее.

Проблема в том, что в пользовательском интерфейсе будет свежая версия.

0 голосов
/ 07 февраля 2012

Кажется, клавиши TAB, SHIFT + TAB, END не всегда переводят последний столбец в видимый вид. Следующий код внутри обработчика события CurrentCellChanged, похоже, решает эту проблему (vb.net):

If Me.MyDataGridView.CurrentCell IsNot Nothing Then
    Dim currentColumnIndex As Integer = e.MyDataGridView.CurrentCell.ColumnIndex
    Dim entireRect As Rectangle = _ 
           Me.MyDataGridView.GetColumnDisplayRectangle(currentColumnIndex, False)
    Dim visiblePart As Rectangle = _
           Me.MyDataGridView.GetColumnDisplayRectangle(currentColumnIndex, True)

    If (visiblePart.Width < entireRect.Width) Or (entireRect.Width = 0) Then
        Me.MyDataGridView.FirstDisplayedCell = Me.MyDataGridView.CurrentCell
        'OR Me.MyDataGridView.FirstDisplayedScrollingColumnIndex = currentColumnIndex
    End If
End If
...