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
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));
}
}
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;
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
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 je devais aussi capturer la première ligne visible de la 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;