2010-06-02 10 views
3

J'ai une application Windows avec DataGridView comme présentation de données. Toutes les 2 minutes, la grille sera rafraîchie avec de nouvelles données. Afin de garder la barre de défilement en phase avec les nouvelles données ajoutées, je dois réinitialiser ses ScrollBars:DataGridView: comment synchroniser la barre de défilement avec la sélection de cellule actuelle?

dbv.Rows.Clear(); // clear rows 
SCrollBars sc = dbv.ScrollBars; 
dbv.ScrollBars = ScrollBars.None; 
// continue to populate rows such as dbv.Rows.Add(obj); 
dbv.ScrollBars = sc; // restore the scroll bar setting back 

Avec des codes ci-dessus, la barre de défilement réapparaît bien après actualisation des données. Le problème est que l'application nécessite de définir certaines cellules comme sélectionnées après l'actualisation:

dbv.CurrentCell = dbv[0, selectedRowIndex]; 

Avec le code ci-dessus, la cellule est sélectionnée; cependant, la position de la barre de défilement ne reflète pas la position de la ligne de la cellule sélectionnée. Lorsque j'essaie de déplacer la barre de défilement après la régénération, la grille passe à la première ligne.

Il semble que la position de la barre de défilement soit ramenée à 0 après la réinitialisation. Le code pour définir CurrentCell de la grille ne provoque pas le repositionnement de la barre de défilement à l'emplacement correct. Il n'y a aucune propriété ou méthode pour obtenir ou définir la valeur de barre de défilement dans DataGriadView, autant que je sache.

J'ai essayé aussi de définir la ligne sélectionnée vers le haut:

dbv.CurrentCell = dbv[0, selectedRowIndex]; 
dbv.FirstDisplayedScrollingRowIndex = selectedRowIndex; 

La ligne sera réglé sur le haut, mais il est encore désynchronisés la position de la barre de défilement. Vous ne savez pas s'il est possible de synchroniser la position de la barre de défilement avec la ligne sélectionnée dans le code?

Répondre

1

J'ai trouvé une réponse pour résoudre le problème. Comme je l'ai mentionné que le contrôle n'a pas de méthodes ou de propriétés pour définir la valeur de la barre de défilement correcte. Toutefois, la barre de défilement et le contenu DatagridView s'affichent correctement s'il y a une interaction directement vers l'interface utilisateur, par exemple en touchant la barre de défilement ou la cellule de la grille. On dirait que le contrôle doit être recentré et repeint.

suffit d'utiliser les codes suivants ne provoque pas la barre de défilement reset:

dgv.Select(); 
// or dbv.Focuse(); 

La façon dont je trouve est que je dois faire le contrôle DataGridView disparaître à nouveau. Heureusement, j'ai un contrôle onglet avec plusieurs onglets. Ensuite, je passe l'onglet pour obtenir réinitialiser la barre de défilement:

int index = myTabCtrl.SelectedIndex; 
if (index == (myTabCtrl.TabCount)) { 
    dgv.SeletecedIndex = 0; 
} 
else { 
    dgv.SelectedIndex = index + 1; 
} 
myTabCtrl.SelectedIndex = index; 

Si vous n'avez pas moyen de cacher la datagridview sur votre formulaire, vous pouvez simplement minimiser la forme et le restaurer.

Le problème est qu'il y aura un nouveau sur l'interface utilisateur.

0

Il semble que les touches TAB, SHIFT + TAB, END n'apportent pas toujours la dernière colonne dans la vue visible. Le code suivant dans le gestionnaire d'événements CurrentCellChanged semble résoudre ce problème (vb.net):

If Me.MyDataGridView.CurrentCell IsNot Nothing Then 
    Dim currentColumnIndex As Integer = e.MyDataGridView.CurrentCell.ColumnIndex 
    Dim entireRect As Rectangle = _ 
      Me.MyDataGridView.GetColumnDisplayRectangle(currentColumnIndex, False) 
    Dim visiblePart As Rectangle = _ 
      Me.MyDataGridView.GetColumnDisplayRectangle(currentColumnIndex, True) 

    If (visiblePart.Width < entireRect.Width) Or (entireRect.Width = 0) Then 
     Me.MyDataGridView.FirstDisplayedCell = Me.MyDataGridView.CurrentCell 
     'OR Me.MyDataGridView.FirstDisplayedScrollingColumnIndex = currentColumnIndex 
    End If 
End If 
Questions connexes