Как установить положение полосы прокрутки сетки данных в приложении winforms? - PullRequest
27 голосов
/ 18 декабря 2008

В моем приложении C # winforms у меня есть сетка данных. Когда сетка данных перезагружается, я хочу вернуть полосу прокрутки туда, где ее установил пользователь. Как я могу это сделать?

РЕДАКТИРОВАТЬ: я использую старый элемент управления DataGrid winforms, а не более новый DataGridView

Ответы [ 6 ]

38 голосов
/ 18 декабря 2008

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

РЕДАКТИРОВАТЬ: Хороший момент в комментарии. Если вы используете DataGridView, это будет работать. Если вы используете старую DataGrid, то самый простой способ сделать это - унаследовать ее. Смотрите здесь: Связь

DataGrid имеет защищенный метод GridVScrolled, который можно использовать для прокрутки сетки к определенной строке. Чтобы использовать его, выведите новую сетку из DataGrid и добавьте метод ScrollToRow.

код C #

public void ScrollToRow(int theRow)
{
    //
    // Expose the protected GridVScrolled method allowing you
    // to programmatically scroll the grid to a particular row.
    //
    if (DataSource != null)
    {
        GridVScrolled(this, new ScrollEventArgs(ScrollEventType.LargeIncrement, theRow));
    }
}
9 голосов
/ 18 декабря 2008

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

Например, если перезагрузка вызвана нажатием кнопки, то в обработчике щелчка кнопки может потребоваться в качестве первой строки команда, которая помещает это значение в переменную:

// Get current user scroll position
int scrollPosition = myGridView.FirstDisplayedScrollingRowIndex;

// Do some work
...

// Rebind the grid and reset scrolling
myGridView.DataBind;
myGridView.FirstDisplayedScrollingRowIndex = scrollPosition;
1 голос
/ 29 апреля 2013

Сохраните значения вертикальной и горизонтальной прокрутки в некоторую переменную и сбросьте их.

int v= dataGridView1.VerticalScrollingOffset ;
int h= dataGridView1.HorizontalScrollingOffset ;
//...reload
dataGridView1.VerticalScrollingOffset = v;
dataGridView1.HorizontalScrollingOffset =h; 
1 голос
/ 23 июля 2012

Только что опубликовал ответ по ссылке, данной BFree

DataGrid имеет защищенный метод GridVScrolled, который можно использовать для прокрутки сетки к определенной строке. Чтобы использовать его, выведите новую сетку из DataGrid и добавьте метод ScrollToRow.

C # код

public void ScrollToRow(int theRow)
{
    //
    // Expose the protected GridVScrolled method allowing you
    // to programmatically scroll the grid to a particular row.
    //
    if (DataSource != null)
    {
        GridVScrolled(this, new ScrollEventArgs(ScrollEventType.LargeIncrement, theRow));
    }
}

код VB.NET

Public Sub ScrollToRow(ByVal theRow As Integer)
    '
    ' Expose the protected GridVScrolled method allowing you
    ' to programmatically scroll the grid to a particular row.
    '
    On Error Resume Next

    If Not DataSource Is Nothing Then
        GridVScrolled(Me, New ScrollEventArgs(ScrollEventType.LargeIncrement, theRow))
    End If
End Sub
0 голосов
/ 21 июня 2018

Хотя это старый вопрос, многие из приведенных выше решений не сработали для меня. В конечном итоге это сработало:

if(gridEmployees.FirstDisplayedScrollingRowIndex != -1) gridEmployees.FirstDisplayedScrollingRowIndex = 0;
0 голосов
/ 25 января 2017

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

int indexOfTopMostRow = HitTest(dataGrid.RowHeaderWidth + 10, 
                                dataGrid.PreferredRowHeight + 10).Row;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...