私のC#winformsアプリには、データグリッドがあります。データグリッドが再ロードされたら、スクロールバーをユーザーが設定した場所に戻したいのですが。これどうやってするの?
編集:私は古いWinForms DataGridコントロールを使用していますが、新しいDataGridViewではありません
実際には、スクロールバーを直接操作するのではなく、FirstDisplayedScrollingRowIndex
を設定します。したがって、リロードする前に、そのインデックスをキャプチャし、リロードしたら、そのインデックスにリセットします。
EDIT:コメントの良い点。 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));
}
}
はい、間違いなく FirstDisplayedScrollingRowIndex です。ユーザー操作の後でこの値をキャプチャする必要があり、グリッドがリロードされた後、古い値に戻す必要があります。
たとえば、ボタンのクリックによってリロードがトリガーされた場合、ボタンクリックハンドラーで、最初の行として、この値を変数に配置するコマンドを使用できます。
// Get current user scroll position
int scrollPosition = myGridView.FirstDisplayedScrollingRowIndex;
// Do some work
...
// Rebind the grid and reset scrolling
myGridView.DataBind;
myGridView.FirstDisplayedScrollingRowIndex = scrollPosition;
垂直および水平スクロールの値を変数に格納し、それらをリセットします。
int v= dataGridView1.VerticalScrollingOffset ;
int h= dataGridView1.HorizontalScrollingOffset ;
//...reload
dataGridView1.VerticalScrollingOffset = v;
dataGridView1.HorizontalScrollingOffset =h;
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
私は@BFreeによる回答を使用しましたが、DataGrid
の最初の表示行をキャプチャする必要もありました。
int indexOfTopMostRow = HitTest(dataGrid.RowHeaderWidth + 10,
dataGrid.PreferredRowHeight + 10).Row;
これは古い質問ですが、上記の解決策の多くはうまくいきませんでした。最終的に機能したのは:
if(gridEmployees.FirstDisplayedScrollingRowIndex != -1) gridEmployees.FirstDisplayedScrollingRowIndex = 0;