Как установить положение полосы прокрутки сетки данных в приложении winforms?

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

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

Ответы на вопрос(6)

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

int indexOfTopMostRow = HitTest(dataGrid.RowHeaderWidth + 10, 
                                dataGrid.PreferredRowHeight + 10).Row;

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

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

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

// Do some work
...

// Rebind the grid and reset scrolling
myGridView.DataBind;
myGridView.FirstDisplayedScrollingRowIndex = scrollPosition;
Решение Вопроса

ки, вы устанавливаете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));
    }
}
 Pollitzer25 янв. 2017 г., 15:22
Те, кому нужно знать индекс первого видимогоDataGrid строка: пожалуйста, смотрите мой пост ниже.
 ScottG19 дек. 2008 г., 16:23
Спасибо ссылка была идеальной. Спасибо!
 ScottG18 дек. 2008 г., 21:11
Я использую старый элемент управления DataGrid
 BFree18 дек. 2008 г., 18:28
Хорошая точка зрения. Смотрите мое редактирование.
 Bravo23 июл. 2012 г., 04:12
Я до сих пор использую старую DataGrid :), ссылка на нее отвечает идеально. но я боюсь, что ссылка не будет длиться долго, так как это уже более 4 лет, я публикую ответ здесь для дальнейшего использования.
 Aleris18 дек. 2008 г., 18:19
Это работает для класса DataGridView, проверьте, используете ли вы это ...

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

int v= dataGridView1.VerticalScrollingOffset ;
int h= dataGridView1.HorizontalScrollingOffset ;
//...reload
dataGridView1.VerticalScrollingOffset = v;
dataGridView1.HorizontalScrollingOffset =h; 
 Mario The Spoon12 апр. 2015 г., 16:29
Тем не менее работает (.NET 4.5.1)
 SteveCinq31 июл. 2019 г., 00:25
VerticalScrollingOffset только для чтения (VB.NET 4.5.2), ноHorizontalScrollingOffset было все, что мне нужно, и это сработало отлично.
 Marie02 июн. 2016 г., 19:19
Это не работает для меня в .NET 4.5.2.
 Shahin27 нояб. 2013 г., 07:28
HorizontalScrollingOffset и VerticalScrollingOffset не имеют установщика

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

if(gridEmployees.FirstDisplayedScrollingRowIndex != -1) gridEmployees.FirstDisplayedScrollingRowIndex = 0;

Только что опубликовал ответ по ссылке, предоставленной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

Ваш ответ на вопрос