Comment puis-je définir la position de mon scrollbar datagrid dans mon application winforms?

dans mon application c# winforms, j'ai un datagrid. Lorsque le datagrid se recharge, je veux remettre la barre de défilement à l'endroit où l'utilisateur l'avait placée. Comment puis-je faire cela?

EDIT: j'utilise l'ancien contrôle winforms DataGrid, pas le nouveau DataGridView

26
demandé sur Pollitzer 2008-12-18 19:09:06

6 réponses

vous n'interagissez pas directement avec la barre de défilement, vous définissez plutôt le FirstDisplayedScrollingRowIndex. Donc avant qu'il ne se recharge, capturez cet index, une fois qu'il est rechargé, réinitialisez-le à cet index.

EDIT: Bon point dans le commentaire. Si vous êtes en utilisant un DataGridView ensuite, ce sera le travail. Si vous utilisez l'ancien DataGrid alors la façon la plus facile de le faire est d'en hériter. Voir ici: Lien

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

C# code

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));
    }
}
35
répondu BFree 2016-07-14 09:03:19

Oui, certainement Premierdisplayedscrollingrowindex. Vous aurez besoin pour capturer cette valeur après une intervention de l'utilisateur, puis après la grille des recharges que vous aurez envie de revenir à l'ancienne valeur.

par exemple, si le rechargement est déclenché par le clic d'un bouton, puis dans le bouton click handler, vous pourriez 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
répondu sfuqua 2008-12-18 17:46:53

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

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

C# code

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 code

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
répondu Bravo 2017-05-23 11:53:53

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
répondu Thunder 2013-04-29 13:45:28

j'ai utilisé la réponse de @BFree, mais j'ai aussi eu besoin de capturer la première ligne visible dans le DataGrid:

int indexOfTopMostRow = HitTest(dataGrid.RowHeaderWidth + 10, 
                                dataGrid.PreferredRowHeight + 10).Row;
0
répondu Pollitzer 2017-01-25 14:21:36

Même si c'est une vieille question, Plusieurs des solutions ci-dessus ne fonctionne pas pour moi. Ce qui a finalement fonctionné, c'est:

if(gridEmployees.FirstDisplayedScrollingRowIndex != -1) gridEmployees.FirstDisplayedScrollingRowIndex = 0;
0
répondu Bharat Raj 2018-06-21 12:18:23