web-dev-qa-db-fra.com

Comment définir la position de la barre de défilement de la grille de données dans mon application winforms?

Dans mon application Winforms C #, j'ai une grille de données. Lorsque la grille de données est rechargée, je souhaite redéfinir la barre de défilement à l'emplacement défini par l'utilisateur. Comment puis-je faire ceci?

EDIT: J'utilise l'ancien contrôle WinGforms DataGrid, pas le plus récent DataGridView

26
ScottG

En réalité, vous n’interagissez pas directement avec la barre de défilement, vous définissez plutôt la variable FirstDisplayedScrollingRowIndex. Donc, avant de recharger, capturez cet index, une fois qu'il est rechargé, réinitialisez-le sur cet index.

EDIT: Bon point dans le commentaire. Si vous utilisez un DataGridView, cela fonctionnera. Si vous utilisez l’ancienne DataGrid, le moyen le plus simple de le faire est d’en hériter. Voir ici: Liaison

Le DataGrid a une méthode GridVScrolled protégée qui peut être utilisée pour faire défiler la grille vers une ligne spécifique. Pour l'utiliser, dérivez une nouvelle grille du DataGrid et ajoutez une méthode ScrollToRow.

Code 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));
    }
}
37
BFree

Oui, certainement FirstDisplayedScrollingRowIndex . Vous devrez capturer cette valeur après une interaction de l'utilisateur, puis après le rechargement de la grille, vous voudrez la rétablir à l'ancienne valeur.

Par exemple, si le rechargement est déclenché par un clic sur un bouton, dans le gestionnaire de clic sur le bouton, vous voudrez peut-être avoir comme première ligne une commande qui place cette valeur dans une variable:

// 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

Vient de poster la réponse sur le lien donné par BFree

Le DataGrid a une méthode GridVScrolled protégée qui peut être utilisée pour faire défiler la grille vers une ligne spécifique. Pour l'utiliser, dérivez une nouvelle grille du DataGrid et ajoutez une méthode ScrollToRow.

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

Code 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

Stockez vos valeurs de défilement vertical et horizontal dans une variable et réinitialisez-les.

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

J'ai utilisé la réponse de @BFree, mais je devais aussi capturer la première ligne visible de la DataGrid:

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

Même s'il s'agit d'une vieille question, beaucoup des solutions ci-dessus n'ont pas fonctionné pour moi. Ce qui a finalement fonctionné a été:

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