Sélection par colonne ou par ligne dans un Flexgrid

Résolu
Notpa Messages postés 125 Date d'inscription dimanche 13 janvier 2019 Statut Membre Dernière intervention 8 janvier 2021 - 6 juil. 2019 à 19:51
Notpa Messages postés 125 Date d'inscription dimanche 13 janvier 2019 Statut Membre Dernière intervention 8 janvier 2021 - 7 juil. 2019 à 11:03
Bonjour,

Dans un VBFlexgrid, je veux faire une sélection multiple par colonne ou par ligne mais pas mélanger des deux.

Voici ce que je voudrais contrôler :


Le problème avec ces multiples lignes ou colonnes, on ne sait pas si la sélection est horizontale ou verticale, donc impossible d'utiliser la sélection qui dans mon cas, doit être une suite de caractères sur la même ligne ou la même colonne, mais pas sur plusieurs.

Si je spécifie la propriété SelectionMode à ByRow, tout la ligne est sélectionnée, pas quelques cellules. Pareil pour le ByColumn.

Est-ce possible ?

Merci d'avance

Notpa

1 réponse

Notpa Messages postés 125 Date d'inscription dimanche 13 janvier 2019 Statut Membre Dernière intervention 8 janvier 2021 1
7 juil. 2019 à 11:03
Hello !

Je n'ai pas trouvé comment forcer le sélection sur plusieurs lignes ou colonnes, mais j'ai trouvé comment contrôler qu'une seule ligne ou colonne est sélectionnée.

Pour ça, j'ai codé 2 radio boutons (nommés opt_H (Horizontal) et opt_V (Vertical)). Dans la grille, dans la fonction MouseDown, je récupère la colonne et la ligne que je stocke dans 2 variables (Deb_row et Deb_col). Dans MouseUp, je récupère la colonne et la ligne stockées dans 2 autres variables (Fin_row et Fin_col). Si l'option Horizontal est sélectionnée et que Deb_row <> Fin_row, il y a eu plusieurs lignes sélectionnées, donc rejet. Si Vertical est sélectionné, mêmes contrôles mais sur les colonnes de début et de fin. Si différent, même punition.

Exemple de code :

Option Explicit
Dim deb_row As Integer
Dim fin_row As Integer
Dim deb_col As Integer
Dim fin_col As Integer
Dim x As Integer
Dim zone As String

Private Sub Command1_Click()
grille.Col = deb_col
grille.Row = deb_row
zone = grille.Text
If opt_H.Value = True Then
    grille.Row = deb_row
    grille.Col = fin_col
    If deb_row <> fin_row Then
        MsgBox "Faire sélection horizontale sur une seule ligne."
        Exit Sub
    End If
    Else
    grille.Row = fin_row
    grille.Col = deb_col
    If deb_col <> fin_col Then
        MsgBox "Faire sélection verticale sur une seule colonne."
        Exit Sub
    End If
End If
zone = zone & "-" & grille.Text
Text1.Text = zone
End Sub

Private Sub Form_Load()
For x = 0 To 9
    grille.ColWidth(x) = 1000
    grille.RowHeight(x) = 500
    grille.Row = x
    grille.Col = 0
    grille.Text = x
Next x
For x = 0 To 9
    grille.ColWidth(x) = 1000
    grille.RowHeight(x) = 500
    grille.Row = x
    grille.Col = 1
    grille.Text = x + 100
Next x
For x = 0 To 9
    grille.ColWidth(x) = 1000
    grille.RowHeight(x) = 500
    grille.Row = x
    grille.Col = 2
    grille.Text = x + 200
Next x
For x = 0 To 9
    grille.ColWidth(x) = 1000
    grille.RowHeight(x) = 500
    grille.Row = x
    grille.Col = 3
    grille.Text = x + 300
Next x
End Sub


Private Sub grille_MouseDown(Button As Integer, Shift As Integer, x As Single, Y As Single)
deb_row = grille.Row
deb_col = grille.Col
End Sub

Private Sub grille_MouseUp(Button As Integer, Shift As Integer, x As Single, Y As Single)
fin_row = grille.RowSel
fin_col = grille.ColSel

End Sub


Dans le Load Form, j'ai rempli les cases pour tester. Le contrôle Grill (VBFlexgrid) a les propriétés suivantes :
- AllowBigSelection=False
- AllowSelection=True
- SelectionMode=Free

Le bouton Command1 permet de faire ce contrôle.

Voilà. Ce petit code peut être utile à d'autres. Je passe en résolu.

Bonnes vacances à tous !

Notpa
0
Rejoignez-nous