Подтвердить что ты не робот

Как я могу установить положение полосы прокрутки datagrid в моем приложении winforms?

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

EDIT: я использую старый элемент управления DataGrid winforms, а не новый DataGridView

4b9b3361

Ответ 1

Фактически вы не взаимодействуете непосредственно с полосой прокрутки, а установите FirstDisplayedScrollingRowIndex. Поэтому, прежде чем перезагружать, запишите этот индекс после его перезагрузки, reset к этому индексу.

EDIT: Хорошая точка в комментарии. Если вы используете DataGridView, тогда это сработает. Если вы используете старый DataGrid, то самый простой способ сделать это - унаследовать его. См. Здесь: Связь

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

Код С#

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));
    }
}

Ответ 2

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

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

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

// Do some work
...

// Rebind the grid and reset scrolling
myGridView.DataBind;
myGridView.FirstDisplayedScrollingRowIndex = scrollPosition;

Ответ 3

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

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

Код С#

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

Ответ 4

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

int v= dataGridView1.VerticalScrollingOffset ;
int h= dataGridView1.HorizontalScrollingOffset ;
//...reload
dataGridView1.VerticalScrollingOffset = v;
dataGridView1.HorizontalScrollingOffset =h; 

Ответ 5

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

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