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

Dans mon application C # Winforms, j’ai une grid de données. Lorsque la grid 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

En réalité, vous n’interagissez pas directement avec la barre de défilement, vous définissez plutôt 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’ancien DataGrid le moyen le plus simple consiste à 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 grid vers une ligne spécifique. Pour l’utiliser, dérivez une nouvelle grid 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)); } } 

Oui, définitivement FirstDisplayedScrollingRowIndex . Vous devrez capturer cette valeur après une interaction de l’utilisateur, puis après le rechargement de la grid, 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 pouvez vouloir 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; 

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 grid vers une ligne spécifique. Pour l’utiliser, dérivez une nouvelle grid 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 

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; 

J’ai utilisé la réponse de @BFree, mais j’avais également besoin de capturer la première ligne visible dans le DataGrid :

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

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;