8
votes

Comment détecter la barre de défilement verticale dans un contrôle de DataGridView

Utilisation de Winforms dans VS2008. J'ai une DataGridView et je voudrais détecter lorsque la barre de défilement verticale est visible. Quel événement dois-je m'inscrire?

J'ajoute la résumé de la valeur de chaque cellule dans la dernière colonne de la grille et affichant cette valeur dans une zone de texte en bas de la DataGridView.

J'aimerais que cette zone de texte reste alignée avec les valeurs de cellule (je les ai faites correctement alignées car elle est des valeurs $$) même après la présence de la barre de défilement.


0 commentaires

7 Réponses :


8
votes

Le comportement DGV primordial est généralement une énorme douleur dans le cou. J'ai cependant ça assez vite. Ajoutez une nouvelle classe à votre formulaire et collez le code présenté ci-dessous. Compiler. Déposez la nouvelle commande du haut de la barre d'outils sur un formulaire. Implémentez l'événement ScrollBarVissibleChanged. XXX


2 commentaires

Ouch qui semble être une douleur juste pour détecter quand une colonne a été redimensionnée en raison de la barre de défilement indiquée.


@Billy: toujours une erreur de ne pas dire pourquoi vous avez vraiment besoin de quelque chose. Utilisez l'événement ColuminyWidthChanged de DGV.



0
votes

Je pense qu'il n'y a pas d'événement pour ça ... mais vous pouvez essayer avec quelque chose comme ça dans tous les endroits où la grille peut pousser:

  • Obtenez le nombre de lignes réelles dans la grilleview + l'en-tête
  • Multipliez ce nombre par la hauteur de chaque rangée
  • Si le résultat est supérieur à la hauteur du datagramrid, il doit y avoir une barre de défilement verticale.

0 commentaires

0
votes

J'ai donné à Hans Passant la coche puisque il a répondu à la question posée ... Cependant, je suis allé un autre itinéraire pour la solution. Étant donné que la boîte de dialogue est modale, la liste des éléments ne changera pas à partir du temps qu'il est créé. Donc, je suis capable d'appeler le code ci-dessous pour vous assurer que les boîtes de texte sont dans le bon emplacement lorsque la boîte de dialogue s'affiche d'abord.

  /// <summary>
  /// Horizontally shifts the label and text boxes that display the total
  /// values so that the totals remain aligned with the columns.
  /// </summary>
  private void ShiftTotalsDisplay(DataGridView grid, Label firstLabel,
     TextBox secondTextBox, TextBox thirdTextBox)
  {         
     //Note if you have a rowheader add the width here also.
     int nameRightLoc = grid.Location.X +            
        grid.Columns[0].Width;
     int fpRightLoc = nameRightLoc +
        grid.Columns[0].DividerWidth +
        grid.Columns[1].Width;
     int dlRightLoc = fpRightLoc + 
        grid.Columns[1].DividerWidth +
        grid.Columns[2].Width;

     Point loc = firstLabel.Location;
     loc.X = nameRightLoc - firstLabel.Width - 2;
     firstLabel.Location = loc;

     loc = secondTextBox.Location;
     loc.X = fpRightLoc - secondTextBox.Width - 2;
     secondTextBox.Location = loc;

     loc = thirdTextBox.Location;
     loc.X = dlRightLoc - thirdTextBox.Width - 2;
     thirdTextBox.Location = loc;         
  }


0 commentaires

24
votes
var vScrollbar = dataGridView1.Controls.OfType<VScrollBar>().First();
if (vScrollbar.Visible)
{
}

2 commentaires

Merci d'avoir ajouté la réponse. J'apprends actuellement Linq et j'adore le pouvoir qu'il fournit!


Cela devrait être la réponse acceptée. J'utilise cela maintenant pour réapparaître mon formulaire jusqu'à ce que les barres de défilement disparaissent.



0
votes

Si votre DGV est à l'intérieur d'un panneau, vous pouvez comparer les propriétés du panneau et de la hauteur DGV. Si les DGV sont plus gros que celle du panneau, il doit y avoir une barre de défilement, non?

J'aime: xxx


0 commentaires

1
votes

Définissez la propriété "AutoSizemode" de la dernière colonne DGV pour "remplir" et définir la propriété de largeur de la zone de texte égale à DGV.Columns ["DateColumn"]. Largeur.


0 commentaires

1
votes

Au lieu d'utiliser Linq (Adam Butler), vous pouvez simplement utiliser les commandes et inscrivez-vous un gestionnaire d'événements qui sera appelé chaque fois que la visibilité de la barre de défilement change. Je l'ai mis en œuvre de cette façon et cela fonctionne assez bien:

void c_VisibleChanged(object sender, EventArgs e)
{
    VScrollBar vb = sender as VScrollBar;
    if (vb.Visible) _DataGridViewScrollbarWidth = vb.Width;
    else _DataGridViewScrollbarWidth = 0;
} 


1 commentaires

Code utile pour ceux qui ont une version pré-linq de .NET. Je suggérerais cependant si (c.getType (). Equals (typeof (vscrollbar))) comme une meilleure comparaison d'égalité que d'utiliser Tostring () . De plus, une déclaration dans le Foreach le rendrait encore mieux.