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
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));
}
}
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;
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
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'ai aussi eu besoin de capturer la première ligne visible dans le DataGrid
:
int indexOfTopMostRow = HitTest(dataGrid.RowHeaderWidth + 10,
dataGrid.PreferredRowHeight + 10).Row;
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;