web-dev-qa-db-ja.com

Winformsアプリでデータグリッドスクロールバーの位置を設定するにはどうすればよいですか?

私のC#winformsアプリには、データグリッドがあります。データグリッドが再ロードされたら、スクロールバーをユーザーが設定した場所に戻したいのですが。これどうやってするの?

編集:私は古いWinForms DataGridコントロールを使用していますが、新しいDataGridViewではありません

27
ScottG

実際には、スクロールバーを直接操作するのではなく、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));
    }
}
38
BFree

はい、間違いなく FirstDisplayedScrollingRowIndex です。ユーザー操作の後でこの値をキャプチャする必要があり、グリッドがリロードされた後、古い値に戻す必要があります。

たとえば、ボタンのクリックによってリロードがトリガーされた場合、ボタンクリックハンドラーで、最初の行として、この値を変数に配置するコマンドを使用できます。

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

// Do some work
...

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

垂直および水平スクロールの値を変数に格納し、それらをリセットします。

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

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
1
Bravo

私は@BFreeによる回答を使用しましたが、DataGridの最初の表示行をキャプチャする必要もありました。

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

これは古い質問ですが、上記の解決策の多くはうまくいきませんでした。最終的に機能したのは:

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