Как я могу установить положение полосы прокрутки datagrid в моем приложении winforms?
В моем приложении winforms С# у меня есть datagrid. Когда перезагружается datagrid, я хочу, чтобы панель прокрутки вернулась туда, где пользователь установил ее. Как я могу это сделать?
EDIT: я использую старый элемент управления DataGrid winforms, а не новый DataGridView
Ответы
Ответ 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;