1. #1
    Membre régulier
    Profil pro
    Inscrit en
    juin 2007
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2007
    Messages : 269
    Points : 118
    Points
    118

    Par défaut Colonne "bouton radio" dans un DataGridView

    Bonjour,

    J'ai un DataGridView correspondant à une liste de fraises, voici la liste des colonnes :
    - sélectionnée pour ébauche
    - sélectionnée pour demi-finition
    - sélectionnée pour finition
    - diamètre
    - hauteur
    - nombre de dents
    - hélice
    -...

    Les trois premières colonnes sont de type "case à cocher"

    Voici ma question : je ne doit permettre à l'utilisateur de ne sélectionner qu'une seule fraise pour l'ébauche

    Actuellement, j'affiche une erreur si plus de deux fraises sont cochées pour l'ébauche

    idem pour la demi-finition et la finition

    J'aimerais utiliser, au lieu de cases à cocher, des boutons radios, de telle sorte qu'il soit impossible de cocher plus d'une case par colonne, si vous voyez ce que je veux dire

    A noter également : il doit être possible de ne rien cocher

    Pour résumer, dans chaque colonne ébauche, demi-finition ou finition il n'est autorisé que une case cochée ou zéro case cochée.

    En fait cela revient à pouvoir, pour chaque phase (ébauche, demi-finition et finition), sélectionner une ligne ou aucune ligne.

    Quelle est la façon la plus élégante de procéder :
    - faire une colonne "radio bouton" si c'est possible ?
    - conserver les cases à cocher et détecter le cochage pour décocher les autres cases éventuelles
    - utiliser une cellule texte standard non éditable et coder le comportement de A à Z

    Sachant que je souhaite que la saisie puisse se faire "normalement" au clavier ou à la souris

    Merci

    A bientôt

  2. #2
    Membre du Club
    Homme Profil pro
    Etude technique THT
    Inscrit en
    juillet 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Etude technique THT
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : juillet 2012
    Messages : 63
    Points : 53
    Points
    53

    Par défaut Re

    Bonjour,

    Selon moi et si j’ai bien compris :

    Lorsque l’utilisateur sélectionne une case à cocher, dans l’événement enregistrer le numéro de la ligne du DGV dans une variable.
    Si l’utilisateur coche à nouveau vérifiez que le numéro de la ligne corresponde à celle de la variable. Si celles-ci ne correspondent pas
    (ou plus de 2 fraises soit 2 lignes), désélectionnez la ou les cases par du code est indiquer les restrictions à l’utilisateur par exemple
    dans un Label.

    Si j’ai mal compris peut-être faire le test dans l’événement sur les colonnes.

    Cordialement.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    juin 2007
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2007
    Messages : 269
    Points : 118
    Points
    118

    Par défaut

    Citation Envoyé par DD-78 Voir le message
    Bonjour,

    Selon moi et si j’ai bien compris :

    Lorsque l’utilisateur sélectionne une case à cocher, dans l’événement enregistrer le numéro de la ligne du DGV dans une variable.
    Si l’utilisateur coche à nouveau vérifiez que le numéro de la ligne corresponde à celle de la variable. Si celles-ci ne correspondent pas
    (ou plus de 2 fraises soit 2 lignes), désélectionnez la ou les cases par du code est indiquer les restrictions à l’utilisateur par exemple
    dans un Label.

    Si j’ai mal compris peut-être faire le test dans l’événement sur les colonnes.

    Cordialement.
    Oui je pensais faire quelque chose de ce genre

    Mais en explorant les forums je me suis rendu compte que les contrôles DataGridView ne génèrent pas d’événements CheckedChanged, et d'après ce que j'ai pu lire les événements du DataGridView ne correspondent pas bien pour faire un équivalent au CheckedChanged (certains clics ou frappe au clavier ne sont pas pris en compte, pris en compte en retard, ou déclenchés alors que rien ne s'est passé)

    A bientôt

  4. #4
    Membre du Club
    Homme Profil pro
    Etude technique THT
    Inscrit en
    juillet 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Etude technique THT
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : juillet 2012
    Messages : 63
    Points : 53
    Points
    53

    Par défaut Re

    Et avec ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub DGV_Click(sender As Object, e As DataGridViewCellEventArgs) Handles DGV.CellContentClick
            MsgBox("Clique")
        End Sub
    Je n'ai pas testé!

    Cdt.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    juin 2007
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2007
    Messages : 269
    Points : 118
    Points
    118

    Par défaut

    Citation Envoyé par DD-78 Voir le message
    Et avec ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub DGV_Click(sender As Object, e As DataGridViewCellEventArgs) Handles DGV.CellContentClick
            MsgBox("Clique")
        End Sub
    Je n'ai pas testé!

    Cdt.
    Un "click" ne corresponds pas nécessairement à un cochage ou décochage (on peut cliquer dans la cellule mais juste à côté de la case à cocher)

    de plus la saisie au clavier n'est pas prise en compte

    A bientôt

  6. #6
    Membre du Club
    Homme Profil pro
    Etude technique THT
    Inscrit en
    juillet 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Etude technique THT
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : juillet 2012
    Messages : 63
    Points : 53
    Points
    53

    Par défaut Re

    Oui il faut approfondir en faisant ceci par exemple :

    Nécessite pour l'exemple :
    - DataGridView1 (il faut définir les colonnes)
    - Label1

    Initialisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i As Integer = 0 To 2
                DataGridView1.Columns(i).ReadOnly = False 'agit sur les cellules des colonnes mais pas sur chekbox.
            Next

    Evénements
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
        Private Sub DataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
            Dim XoldRowIndex As Integer = DataGridView1.CurrentCellAddress.X 'retourne le numéro de la colonne de la cellule active
            Dim YoldRowIndex As Integer = DataGridView1.CurrentCellAddress.Y 'retourne le numéro de la ligne de la cellule active
     
     
            If (DataGridView1.CurrentCellAddress.X = 0 Or DataGridView1.CurrentCellAddress.X = 1 Or DataGridView1.CurrentCellAddress.X = 2) Then
     
                If (DataGridView1.Rows(YoldRowIndex).Cells(XoldRowIndex).Value = 0) Then
                    DataGridView1.Rows(YoldRowIndex).Cells(XoldRowIndex).Value = 1
                Else
                    DataGridView1.Rows(YoldRowIndex).Cells(XoldRowIndex).Value = 0
                End If
     
                ' resutat du checked dans la cellule.
                Label1.Text = "checked : " & DataGridView1.Rows(YoldRowIndex).Cells(XoldRowIndex).Value
                Label1.Text += "          Collonne = " & XoldRowIndex + 1
                Label1.Text += "    Ligne = " & YoldRowIndex + 1
     
            End If
     
        End Sub
     
        Private Sub DataGridView1_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellClick
     
            If (DataGridView1.CurrentCellAddress.X > 2) Then
                Label1.Text = ""
            End If
        End Sub
    Par contre on peut toujours cliquer à côté de la case à cocher!

    Cdt.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    juin 2007
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2007
    Messages : 269
    Points : 118
    Points
    118

    Par défaut

    Citation Envoyé par DD-78 Voir le message
    Oui il faut approfondir en faisant ceci par exemple :

    Nécessite pour l'exemple :
    - DataGridView1 (il faut définir les colonnes)
    - Label1

    Initialisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i As Integer = 0 To 2
                DataGridView1.Columns(i).ReadOnly = False 'agit sur les cellules des colonnes mais pas sur chekbox.
            Next

    Evénements
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
        Private Sub DataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
            Dim XoldRowIndex As Integer = DataGridView1.CurrentCellAddress.X 'retourne le numéro de la colonne de la cellule active
            Dim YoldRowIndex As Integer = DataGridView1.CurrentCellAddress.Y 'retourne le numéro de la ligne de la cellule active
     
     
            If (DataGridView1.CurrentCellAddress.X = 0 Or DataGridView1.CurrentCellAddress.X = 1 Or DataGridView1.CurrentCellAddress.X = 2) Then
     
                If (DataGridView1.Rows(YoldRowIndex).Cells(XoldRowIndex).Value = 0) Then
                    DataGridView1.Rows(YoldRowIndex).Cells(XoldRowIndex).Value = 1
                Else
                    DataGridView1.Rows(YoldRowIndex).Cells(XoldRowIndex).Value = 0
                End If
     
                ' resutat du checked dans la cellule.
                Label1.Text = "checked : " & DataGridView1.Rows(YoldRowIndex).Cells(XoldRowIndex).Value
                Label1.Text += "          Collonne = " & XoldRowIndex + 1
                Label1.Text += "    Ligne = " & YoldRowIndex + 1
     
            End If
     
        End Sub
     
        Private Sub DataGridView1_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellClick
     
            If (DataGridView1.CurrentCellAddress.X > 2) Then
                Label1.Text = ""
            End If
        End Sub
    Par contre on peut toujours cliquer à côté de la case à cocher!

    Cdt.
    Bonjour,

    ton code effectue le cochage / décochage en fonction du clic ?

    n'y a t-il pas un risque de doublons avec le comportement normal de la check box, avec comme résultat deux actions qui s'annulent ?

    Merci

    A bientôt

  8. #8
    Membre du Club
    Homme Profil pro
    Etude technique THT
    Inscrit en
    juillet 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Etude technique THT
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : juillet 2012
    Messages : 63
    Points : 53
    Points
    53

    Par défaut Re

    Bonjour,

    Non pas de doublons puisque le code met à jour la cellule où la case à cocher est positionnée (boolean) et tenant compte des 3 colonnes en check.

    Pour mieux te rendre compte exécute le code.

    Effectivement le code coche ou décoche en fonction du clic ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    If (DataGridView1.CurrentCellAddress.X = 0 Or DataGridView1.CurrentCellAddress.X = 1 Or DataGridView1.CurrentCellAddress.X = 2) Then
     
                If (DataGridView1.Rows(YoldRowIndex).Cells(XoldRowIndex).Value = 0) Then
                    DataGridView1.Rows(YoldRowIndex).Cells(XoldRowIndex).Value = 1
                Else
                    DataGridView1.Rows(YoldRowIndex).Cells(XoldRowIndex).Value = 0
                End If
     
               ...

    En le faisant fonctionné je n'ai rien constaté mais si tu remarques quelque chose dit le moi.

    Depuis je l'ai quelque peu modifié !

    Ci-joint le dossier de l'exemple Test_DGV.rar

    Bien sûr ce code doit être complété pour convenir à tes besoins et notamment remplir les conditions requises.


    Cdt.

  9. #9
    Membre expert
    Inscrit en
    avril 2008
    Messages
    1 972
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : avril 2008
    Messages : 1 972
    Points : 3 387
    Points
    3 387

    Par défaut

    bonjour

    Bah , tu a 2 cas :

    1/ cas :des RadioButtons Exclusifs (ou groupés)
    - un seul RadioButtons est cheque à la fois constamment
    - bouton clické => Checked = True et les Restants =>Checked=False
    Les Restants ?
    2/ cas : des RadioButtons Exclusifs avec état intermédiaire:
    - bouton clické => Checked = True ,les Restants =>Checked=False
    - bouton clické => Checked=False,les Restants =>Checked=False


    Pourquoi les Restants ? pour se souvenir des "Restants" ,les "retardaires" si tu veux il suffit de mémoriser leurs indices de colonnes à la creation...

    voici le code exemple du 2eme Cas (pour avoir le 1er cas,il suffit de modifier le code de la ligne commentée)....
    De plus le code redessine le CheckBoxCell du CheckBoxColumn avec RadioButtonRenderer de manière à le "deguiser" en sosie du RadioButton(il importer l'espace de nom System.Windows.Forms.VisualStyles) dans l'event
    DataGridView_CellPainting
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
     
    Imports System.Windows.Forms.VisualStyles
     
    Public Class Form2
        Private TableFraises As DataTable
        Private RadioCol As DataGridViewCheckBoxColumn
        Private ListIndexes As New List(Of Integer) '  les Restants  
     
        Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            TableFraises = GetDataTable()
            DataGridView1.DataSource = TableFraises
            AddButtons()
        End Sub
        Private Function GetDataTable() As DataTable
     
            Dim dt As New DataTable("Fraises")
     
            Dim columns() As DataColumn = {
                    New DataColumn("ID", GetType(String)),
                    New DataColumn("DIAMETRE", GetType(Double)),
                    New DataColumn("HAUTEUR", GetType(Double))
                }
     
            dt.Columns.AddRange(columns)
            Dim dr As DataRow = dt.NewRow
            Dim rnd As New Random
            For index = 1 To 10
                dr(0) = "Code" + index.ToString
                dr(1) = rnd.Next(100, 200)
                dr(2) = rnd.Next(1250, 1350)
                dt.Rows.Add(dr)
                dr = dt.NewRow
            Next
     
            Return dt
        End Function
        Private Sub AddButtons()
            Dim cellEbauche As New DataGridViewCheckBoxCell
            cellEbauche.Style.BackColor = Color.Wheat
     
            Dim cellFinition As New DataGridViewCheckBoxCell
            cellFinition.Style.BackColor = Color.NavajoWhite
            Dim celldemifinition As New DataGridViewCheckBoxCell
            celldemifinition.Style.BackColor = Color.Moccasin
     
            Dim arrCols() As DataGridViewCheckBoxColumn = {
               New DataGridViewCheckBoxColumn() With {
                   .Name = "EBAUCHE",
                   .HeaderText = "EBAUCHE",
                   .ValueType = GetType(Boolean),
                   .CellTemplate = cellEbauche
               },
               New DataGridViewCheckBoxColumn() With {
                   .Name = "FINITION",
                   .HeaderText = "FINITION",
                   .ValueType = GetType(Boolean),
                   .CellTemplate = cellFinition
               },
               New DataGridViewCheckBoxColumn() With {
                   .Name = "DEMI-FINITION",
                   .HeaderText = "DEMI-FINITION",
                   .ValueType = GetType(Boolean),
                   .CellTemplate = celldemifinition
               }
            }
     
            For i As Integer = 0 To arrCols.Length - 1
                Dim index As Integer = DataGridView1.Columns.Add(arrCols(i))
                ListIndexes.Add(index)
            Next
     
        End Sub
        Private Sub DataGridView1_CellClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick
            If e.ColumnIndex = ListIndexes(0) Or e.ColumnIndex = ListIndexes(1) Or
               e.ColumnIndex = ListIndexes(2) Then
     
                DataGridView1.CurrentCell.ReadOnly = False
                'remplacer cette ligne de code par : 'DataGridView1.CurrentCell.Value = True
                'pour traiter le 1er cas
                DataGridView1.CurrentCell.Value = Not DataGridView1.CurrentCell.Value
                DataGridView1.CurrentCell.Style.BackColor = Color.Red
                DataGridView1.InvalidateCell(DataGridView1.CurrentCell)
     
                For Each ndx As Integer In ListIndexes
     
                    If e.ColumnIndex <> ndx Then
                        DataGridView1.Rows(e.RowIndex).Cells(ndx).Value = False
                        DataGridView1.Rows(e.RowIndex).Cells(ndx).Style.BackColor = DataGridView1.Columns(ndx).CellTemplate.Style.BackColor
                        DataGridView1.Rows(e.RowIndex).Cells(ndx).ReadOnly = True
                        DataGridView1.InvalidateCell(DataGridView1.Rows(e.RowIndex).Cells(ndx))
                    End If
                Next
            End If
        End Sub
     
        Private Sub DataGridView1_CellPainting(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting
            If e.ColumnIndex = ListIndexes(0) Or e.ColumnIndex = ListIndexes(1) Or
               e.ColumnIndex = ListIndexes(2) Then
                If e.RowIndex >= 0 Then
                    e.PaintBackground(e.ClipBounds, True)
     
                    Dim rectRadioButton As Rectangle
                    rectRadioButton.Width = 14
                    rectRadioButton.Height = 14
                    rectRadioButton.Width = e.CellBounds.Width
                    rectRadioButton.Height = e.CellBounds.Height
                    rectRadioButton.X = e.CellBounds.X + (e.CellBounds.Width - rectRadioButton.Width) / 2
                    rectRadioButton.Y = e.CellBounds.Y + (e.CellBounds.Height - rectRadioButton.Height) / 2
     
                    Dim txt As String = DataGridView1.Columns(e.ColumnIndex).Name
                    If IsDBNull(e.Value) OrElse e.Value = False Then
                        RadioButtonRenderer.DrawRadioButton(e.Graphics,
                        rectRadioButton.Location, RadioButtonState.UncheckedHot)
     
                    Else
                        RadioButtonRenderer.DrawRadioButton(e.Graphics,
                      rectRadioButton.Location, rectRadioButton, txt,
                      e.CellStyle.Font, RadioButtonState.CheckedHot, e.Value)
                    End If
     
                    e.Paint(e.ClipBounds, DataGridViewPaintParts.Focus)
     
                    e.Handled = True
                End If
            End If
        End Sub
    End Class

    Bon code....

  10. #10
    Membre du Club
    Homme Profil pro
    Etude technique THT
    Inscrit en
    juillet 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Etude technique THT
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : juillet 2012
    Messages : 63
    Points : 53
    Points
    53

    Par défaut DataGridView version case à cocher

    Bonjour,

    Résultat à obtenir :

    Nom : Fraise DGV.PNG
Affichages : 81
Taille : 18,9 Ko

    Tu trouveras dans le code beaucoup de commentaires, en espérant qu’ils puissent t’aider à bien comprendre
    le fonctionnement. En cas de bug dit le moi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    ' Nécessaire pour l'exemple :
    ' DataGridView nommé dgv_fraise 
    ' Définir les colonnes selon leurs typages - les colonnes 1 - 2 et 3 en CheckBox
    ' Définir la colonne 7 (Hèlice) en ComboBox (les items sont définis dans les propriétés du dgv).
    ' Les autres en TextBox.
    ' Label nommé Label_checked ' pour débug 
    ' Label nommé Label_col_dgv_fraise
    ' Label nommé Label_ligne_dgv_fraise
    ' Label nommé Label_titre_message
    ' Label nommé Label_message
     
    ' Dans paramètres (My Project > fenêtre Explorateur de solutions) :
    ' Couleur de cellule (My.Settings.dgv_couleur_fond   ' Couleur de cellule)
    ' Couleur de polices (My.Settings.dgv_couleur_police  ' Couleur de police)
     
    '---------- Dans le cas d'une fonctionnalité plus poussé (dans l'immédiat pas nécessaire) -------------
    ' ébauche > chekbox > nb_ebauche > Une séléction par colonne
    ' demi-finition > chekbox > nb_demi_finition > Une séléction par colonne
    ' finition > chekbox > nb_finition > Une séléction par colonne
    ' diamètre > entier ou décimale selon l'unité > diametre > définir une condition pour la validation.
    ' hauteur > entier ou décimale selon l'unité > définir une condition pour la validation.
    ' nombre de dents > entier > nb_dent > définir une condition pour la validation.
    ' hélice > texte ? > helice >  définir une condition pour la validation.
    '----------------------------------------------------------------------------------------------------
     
    Option Strict On
    Option Explicit On
     
     
    Public Class fraises
     
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            MaximizeBox = False
            For i As Integer = 1 To 3
                dgv_fraise.Columns(i).ReadOnly = False 'agit sur les cellules de la colonne mais pas sur chekbox.
            Next
     
            For i As Integer = 0 To 15
                dgv_fraise.Rows.Add() ' Ajoute une ligne
                For c As Integer = 1 To 3
                    dgv_fraise.Rows(i).Cells(c).Value = False ' l'initialise
                Next
            Next
     
            ' Entête de colonne
            dgv_fraise.EnableHeadersVisualStyles = False
            With dgv_fraise.ColumnHeadersDefaultCellStyle
                .BackColor = My.Settings.dgv_couleur_fond   ' Couleur de cellule déclarait dans paramètres
                .ForeColor = My.Settings.dgv_couleur_police  ' Couleur de police déclarait dans paramètres
                .Font = New Font(dgv_fraise.Font, FontStyle.Bold) ' Epaisseur de police
                .Alignment = DataGridViewContentAlignment.MiddleCenter ' Position des titres de colonnes
            End With
            Label_checked.Visible = False ' ************** Ligne à mettre en commentaire pour mode débug si nécessaire *****************
            dgv_fraise.Columns(3).Frozen = True ' fige les colonnes du contrôle 
            dgv_fraise.Columns(3).DividerWidth = 3 ' Largeur du séparateur de colonne en pixels.
     
            dgv_fraise_numerotation_ligne() ' Numérote les lignes
            dgv_fraise.CurrentCell = dgv_fraise.Item(4, 0) ' Obtient le focus
        End Sub
        Private Sub dgv_fraise_numerotation_ligne()
            ' Utiliser par les événements MyBase.Load et dgv_fraise.RowsRemoved
            For i As Integer = 0 To dgv_fraise.Rows.Count - 1
                dgv_fraise.CurrentCell = dgv_fraise.Item(0, i) ' Obtient le focus
                dgv_fraise.CurrentCell.Style.BackColor = My.Settings.dgv_couleur_fond  ' Couleur de cellule déclarait dans paramètres
                dgv_fraise.CurrentCell.Style.ForeColor = My.Settings.dgv_couleur_police  ' Couleur de police déclarait dans paramètres
                dgv_fraise.CurrentCell.Style.Font = New Font(dgv_fraise.Font, FontStyle.Bold)
                dgv_fraise.Rows(i).Cells(0).Value = i + 1
            Next
        End Sub
     
        Private Sub dgv_fraise_style_ligne()
            ' Utiliser par les événements dgv_fraise.CellClick, dgv_fraise.CurrentCellChanged et dgv_fraise.DefaultValuesNeeded
            Dim YoldRowIndex As Integer = dgv_fraise.CurrentCellAddress.Y 'retourne le numéro de la ligne de la cellule active
     
            If (YoldRowIndex > 0) Then
                If (IsNothing(dgv_fraise.Rows(YoldRowIndex).Cells(0).Value) = True Or CInt(dgv_fraise.Rows(YoldRowIndex).Cells(0).Value) = 0) Then
                    dgv_fraise.Rows(YoldRowIndex).Cells(0).Value = CInt(dgv_fraise.Rows(YoldRowIndex - 1).Cells(0).Value) + 1
                    dgv_fraise.Rows(YoldRowIndex).Cells(0).Style.BackColor = Color.DarkBlue  ' Couleur de la cellule
                    dgv_fraise.Rows(YoldRowIndex).Cells(0).Style.ForeColor = Color.White  ' Couleur de la cellule
                    dgv_fraise.Rows(YoldRowIndex).Cells(0).Style.Font = New Font(dgv_fraise.Font, FontStyle.Bold)
                    dgv_fraise.Rows(YoldRowIndex).Cells(1).Value = False
                    dgv_fraise.Rows(YoldRowIndex).Cells(2).Value = False
                    dgv_fraise.Rows(YoldRowIndex).Cells(3).Value = False
                End If
            End If
        End Sub
     
        Private Function verif_colonne_check_dgv_fraise(ByVal num_ligne As Integer, ByVal num_colonne As Integer) As Integer
     
            ' Utiliser par l'événnement dgv_fraise.CellContentClick
     
            'Dim nb_ligne_dgv As Integer = dgv_fraise.Rows.Count - 1 ' A titre indicatif si cela s'avère nécessaire par la suite.
            'Dim nb_col_dgv As Integer = dgv_fraise.ColumnCount - 1 ' A titre indicatif si cela s'avère nécessaire par la suite.
     
            Dim col_debut As Integer ' Défini la première colonne à vérifier
            Dim col_max As Integer '  Défini la dernière colonne à vérifier
     
            col_debut = 1 : col_max = 3
     
            '----------------------------------------- Parcoure du DGV ---------------------------------------
     
            For i As Integer = 0 To dgv_fraise.Rows.Count - 1 ' boucle sur les lignes
                For c As Integer = col_debut To col_max ' boucle sur les colonnes du dgv
     
                    Try
                        dgv_fraise.Rows(i).Cells(num_colonne).Value = Convert.ToBoolean(dgv_fraise.Rows(i).Cells(num_colonne).Value)
                    Catch ex As Exception
                        dgv_fraise.Rows(i).Cells(num_colonne).Value = False
                    End Try
     
                    'If (dgv_fraise.Rows(i).Cells(num_colonne).Value = True) Then
                    If (Convert.ToBoolean(dgv_fraise.Rows(i).Cells(num_colonne).Value) = True) Then
                        If (i <> num_ligne) Then ' On contrôle qu'il ne sagit pas de la ligne à vérifier passé en argument.
                            Return i : Exit Function ' retourne le numéro de la ligne déjà en sélection et quitte la fonction.
                        End If
                    End If
                Next
            Next
     
            Return -1 ' pas de checked dans la colonne : retourne -1
     
        End Function
     
        Private Sub dgv_fraise_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgv_fraise.CellContentClick ', dgv_fraise.CellClick
            Dim XoldRowIndex As Integer = dgv_fraise.CurrentCellAddress.X 'retourne le numéro de la colonne de la cellule active
            Dim YoldRowIndex As Integer = dgv_fraise.CurrentCellAddress.Y 'retourne le numéro de la ligne de la cellule active
     
            Label_message.Text = ""
     
            'Traitement pour le chekbox du DGV
            If (dgv_fraise.CurrentCellAddress.X = 1 Or dgv_fraise.CurrentCellAddress.X = 2 Or dgv_fraise.CurrentCellAddress.X = 3) Then
     
     
                If (Convert.ToBoolean(dgv_fraise.Rows(YoldRowIndex).Cells(XoldRowIndex).Value) = False) Then
     
                    ' -------------------- Vérification de la sélection par colonne -------------------------
                    Dim ligne_verif As Integer = verif_colonne_check_dgv_fraise(YoldRowIndex, XoldRowIndex)
     
                    If (ligne_verif <> -1) Then ' -1 signifie aucune cellule sélectionnée dans la colonne.
     
                        Beep()
                        Dim nom_colonne As String = dgv_fraise.Columns(XoldRowIndex).HeaderText
                        Label_message.Text = "La cellule de la ligne " & ligne_verif + 1 & " colonne " & Chr(34) & nom_colonne & Chr(34) & " est déjà en sélection !" & vbCrLf &
                                             "Vous devez la décocher avant de cocher une autre cellule dans la même colonne."
     
                        dgv_fraise.CurrentCell = dgv_fraise.Item(XoldRowIndex, ligne_verif) ' Obtient le focus nécessaire pour désactiver la case.
                        dgv_fraise.Rows(YoldRowIndex).Cells(XoldRowIndex).Value = False ' désactive la case.
                        dgv_fraise.CurrentCell = dgv_fraise.Item(XoldRowIndex, YoldRowIndex) ' redonne le focus à la cellule active.
     
                        With dgv_fraise ' Mise en sélection de la ligne déjà coché
                            .CurrentCell = .Item(0, ligne_verif) ' il faue d'abord sélectionner une cellule de la ligne à mettre en seléction
                            .CurrentRow.Selected = True ' Mise en sélection de la ligne
                        End With
     
                        Label_col_dgv_fraise.Text = "Col "
                        Exit Sub
                    End If
                    '----------------------------- Fin de la vérification par colonne--------------------------
     
                    dgv_fraise.Rows(YoldRowIndex).Cells(XoldRowIndex).Value = True
                Else
                    dgv_fraise.Rows(YoldRowIndex).Cells(XoldRowIndex).Value = False
                End If
     
                ' resutat du checked dans la cellule.
                Label_checked.Text = "checked : " & dgv_fraise.Rows(YoldRowIndex).Cells(XoldRowIndex).Value.ToString ' A retirer au final.
                Label_col_dgv_fraise.Text = "Col " & XoldRowIndex + 1
                Label_ligne_dgv_fraise.Text = "Ln " & YoldRowIndex + 1
     
            End If
     
        End Sub
     
        Private Sub dgv_fraise_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgv_fraise.CellClick
            dgv_fraise_style_ligne()
     
            Label_message.Text = ""
            Label_col_dgv_fraise.Text = "Col " & dgv_fraise.CurrentCellAddress.X + 1
            Label_ligne_dgv_fraise.Text = "Ln " & dgv_fraise.CurrentCellAddress.Y + 1
     
        End Sub
        Private Sub dgv_fraise_CurrentCellChanged(sender As Object, e As EventArgs) Handles dgv_fraise.CurrentCellChanged
            'Tabulation, Flèche de déplacement, etc..
     
            dgv_fraise_style_ligne()
     
            Label_checked.Text = ""
            Label_col_dgv_fraise.Text = "Col " & dgv_fraise.CurrentCellAddress.X + 1
            Label_ligne_dgv_fraise.Text = "Ln " & dgv_fraise.CurrentCellAddress.Y + 1
        End Sub
     
        Private Sub dgv_fraise_KeyUp(sender As Object, e As KeyEventArgs) Handles dgv_fraise.KeyUp
            ' Lorsque le clavier est utilisé (n'importe quelle touche)
            Label_message.Text = ""
        End Sub
     
        Private Sub dgv_fraise_DefaultValuesNeeded(sender As Object, e As DataGridViewRowEventArgs) Handles dgv_fraise.DefaultValuesNeeded
            ' Initialisation d'une nouvelle ligne en fin de tableau
            dgv_fraise_style_ligne()
        End Sub
     
        Private Sub dgv_fraise_RowsRemoved(sender As Object, e As DataGridViewRowsRemovedEventArgs) Handles dgv_fraise.RowsRemoved
            'Suppression d'une ou plusieurs lignes
            dgv_fraise_numerotation_ligne()
            dgv_fraise.CurrentCell = dgv_fraise.Item(4, e.RowIndex) ' Obtient le focus.
        End Sub
     
        Private Sub fraises_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
            ' Configuration message box
            Dim message As String = "Voulez-vous vraiment quitter ?"
            Dim titre As String = "Quitter"
            Dim bouttons As MessageBoxButtons = MessageBoxButtons.YesNo
            Dim icon As MessageBoxIcon = MessageBoxIcon.Information
            Dim defaultResult As MessageBoxDefaultButton = MessageBoxDefaultButton.Button2
            ' Affichage
            If (MessageBox.Show(message, titre, bouttons, icon, defaultResult) = vbNo) Then e.Cancel = True ' Annule
     
        End Sub
    End Class
    ci-joint le projet correspondant Visual Studio Test_DGV.rar

    Cordialement.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    juin 2007
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2007
    Messages : 269
    Points : 118
    Points
    118

    Par défaut

    Bonjour à tous

    merci pour vos réponses détaillées

    je fais des essais et vous tient au courant

    A bientôt

  12. #12
    Membre du Club
    Homme Profil pro
    Etude technique THT
    Inscrit en
    juillet 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Etude technique THT
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : juillet 2012
    Messages : 63
    Points : 53
    Points
    53

    Par défaut Amélioration du DGV

    Nouvelles améliorations :
    - Affichage du DGV.
    - Vérification de la valeur d'une cellule si elle est numérique dans DGV
    - Ajout du point de départ (tabulation) pour la saisie.

    Annule et remplace l'ancien code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    ' Nécessaire pour l'exemple :
    ' DataGridView nommé dgv_fraise 
    ' Définir les colonnes selon leurs typages - les colonnes 1 - 2 et 3 en CheckBox
    ' Définir la colonne 7 (Hélice) en ComboBox (les items sont définis dans les propriétés du dgv).
    ' Les autres en TextBox.
    ' Label nommé Label_checked ' pour débug 
    ' Label nommé Label_col_dgv_fraise
    ' Label nommé Label_nom_titre_col
    ' Label nommé Label_ligne_dgv_fraise
    ' Label nommé Label_titre_message
    ' Label nommé Label_message
     
    ' Dans paramètres (My Project > fenêtre Explorateur de solutions) :
    ' Couleur de cellule (My.Settings.dgv_couleur_fond   ' Couleur de cellule)
    ' Couleur de polices (My.Settings.dgv_couleur_police  ' Couleur de police)
     
    '---------- Dans le cas d'une fonctionnalité plus poussé (dans l'immédiat pas nécessaire) -------------
    ' ébauche > chekbox > nb_ebauche > Une séléction par colonne
    ' demi-finition > chekbox > nb_demi_finition > Une séléction par colonne
    ' finition > chekbox > nb_finition > Une séléction par colonne
    ' diamètre > entier ou décimale selon l'unité > diametre > définir une condition pour la validation.
    ' hauteur > entier ou décimale selon l'unité > définir une condition pour la validation.
    ' nombre de dents > entier > nb_dent > définir une condition pour la validation.
    ' hélice > texte ? > helice >  définir une condition pour la validation.
    '----------------------------------------------------------------------------------------------------
     
    Option Strict On
    Option Explicit On
     
     
     
    Public Class Fraises
     
        Private cellule_numerique As Boolean 'Drapeau pour vérifier si la valeur dans la cellule est numerique
        Private X_numerique As Integer ' Coordonnée en X pour la cellule si non numérique
        Private Y_numerique As Integer ' Coordonnée en Y pour la cellule si non numérique
        Private tabu_debut_col As Integer = 4 ' Position de départ de la touche tabulation soit la 4ème colonne car la saisie commence ici.
     
     
        Private Sub Fraise_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Label_nom_titre_col.Text = Nothing
     
            MaximizeBox = False
            For i As Integer = 1 To 3
                dgv_fraise.Columns(i).ReadOnly = False 'agit sur les cellules de la colonne mais pas sur chekbox.
            Next
     
            For i As Integer = 0 To 15
                dgv_fraise.Rows.Add() ' Ajoute une ligne
                For c As Integer = 1 To 3
                    dgv_fraise.Rows(i).Cells(c).Value = False ' l'initialise
                Next
            Next
     
            dgv_fraise.BorderStyle = BorderStyle.Fixed3D
            ' ' Entête de colonne dans le contrôle DataGridView Windows Forms
            dgv_fraise.EnableHeadersVisualStyles = False
            Dim depart_colonne = 1 ' On commence après la colonne de numérotation des lignes
            Dim nb_colonne = 8 ' Nombre de colonne dans le DGV
            For i As Integer = depart_colonne To nb_colonne
                With dgv_fraise
                    .Columns(i).HeaderCell.Style.BackColor = My.Settings.dgv_couleur_fond   ' Couleur de cellule déclarait dans paramètres
                    .Columns(i).HeaderCell.Style.ForeColor = My.Settings.dgv_couleur_police  ' Couleur de police déclarait dans paramètres
                    .Columns(i).HeaderCell.Style.Font = New Font(dgv_fraise.Font, FontStyle.Bold) ' Epaisseur de police
                End With
            Next
            dgv_fraise.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter ' Position des titres de colonnes
     
            Label_valeur.Visible = False ' ************** Ligne à mettre en commentaire pour mode débug si nécessaire *****************
            Label_col_dgv_fraise.Visible = False ' ************** Ligne à mettre en commentaire pour mode débug si nécessaire *****************
            dgv_fraise.Columns(0).Frozen = True ' fige les colonnes du contrôle 
            ' dgv_fraise.Columns(0).DividerWidth = 0 ' Largeur du séparateur de colonne en pixels.
     
            dgv_fraise_numerotation_ligne() ' Numérote les lignes
            dgv_fraise.CurrentCell = dgv_fraise.Item(tabu_debut_col, 0) ' Obtient le focus
        End Sub
     
        Private Sub dgv_fraise_numerotation_ligne()
            ' Utiliser par les événements MyBase.Load et dgv_fraise.RowsRemoved
            For i As Integer = 0 To dgv_fraise.Rows.Count - 1
                dgv_fraise.CurrentCell = dgv_fraise.Item(0, i) ' Obtient le focus
                dgv_fraise.CurrentCell.Style.BackColor = My.Settings.dgv_couleur_fond  ' Couleur de cellule déclarait dans paramètres
                dgv_fraise.CurrentCell.Style.ForeColor = My.Settings.dgv_couleur_police  ' Couleur de police déclarait dans paramètres
                dgv_fraise.CurrentCell.Style.Font = New Font(dgv_fraise.Font, FontStyle.Bold)
                dgv_fraise.Rows(i).Cells(0).Value = i + 1
            Next
        End Sub
     
        Private Sub dgv_fraise_style_ligne()
            ' Utiliser par les événements dgv_fraise.CellClick, dgv_fraise.CurrentCellChanged et dgv_fraise.DefaultValuesNeeded
            Dim YoldRowIndex As Integer = dgv_fraise.CurrentCellAddress.Y 'retourne le numéro de la ligne de la cellule active
     
            If (YoldRowIndex > 0) Then
                If (IsNothing(dgv_fraise.Rows(YoldRowIndex).Cells(0).Value) = True Or CInt(dgv_fraise.Rows(YoldRowIndex).Cells(0).Value) = 0) Then
                    dgv_fraise.Rows(YoldRowIndex).Cells(0).Value = CInt(dgv_fraise.Rows(YoldRowIndex - 1).Cells(0).Value) + 1
                    dgv_fraise.Rows(YoldRowIndex).Cells(0).Style.BackColor = Color.DarkBlue  ' Couleur de la cellule
                    dgv_fraise.Rows(YoldRowIndex).Cells(0).Style.ForeColor = Color.White  ' Couleur de la cellule
                    dgv_fraise.Rows(YoldRowIndex).Cells(0).Style.Font = New Font(dgv_fraise.Font, FontStyle.Bold)
                    dgv_fraise.Rows(YoldRowIndex).Cells(1).Value = False
                    dgv_fraise.Rows(YoldRowIndex).Cells(2).Value = False
                    dgv_fraise.Rows(YoldRowIndex).Cells(3).Value = False
                End If
            End If
        End Sub
     
        Private Sub si_valeur_cellule_numerique()
            'Utiliser par les événements dgv_fraise.MouseClick, dgv_fraise.KeyUp, dgv_fraise.CellClick, dgv_fraise.MouseDoubleClick
     
            'Vérification si la valeur de la cellule est numérique (drapeau).
            If (cellule_numerique = False) Then
                Dim nom_colonne As String = dgv_fraise.Columns(X_numerique).HeaderText
                Label_nom_titre_col.Text = nom_colonne
                dgv_fraise.CurrentCell = dgv_fraise.Item(X_numerique, Y_numerique) ' redonne le focus à la cellule active.
                'Beep()
                Label_message.Text = "La valeur de la cellule doit être numérique!"
            End If
        End Sub
        Private Function verif_colonne_check_dgv_fraise(ByVal num_ligne As Integer, ByVal num_colonne As Integer) As Integer
     
            ' Utiliser par l'événnement dgv_fraise.CellContentClick
     
            Dim col_debut As Integer ' Défini la première colonne à vérifier
            Dim col_max As Integer '  Défini la dernière colonne à vérifier
     
            col_debut = 1 : col_max = 3
     
            '----------------------------------------- Parcoure du DGV ---------------------------------------
     
            For i As Integer = 0 To dgv_fraise.Rows.Count - 1 ' boucle sur les lignes
                For c As Integer = col_debut To col_max ' boucle sur les colonnes du dgv
     
                    Try
                        dgv_fraise.Rows(i).Cells(num_colonne).Value = Convert.ToBoolean(dgv_fraise.Rows(i).Cells(num_colonne).Value)
                    Catch ex As Exception
                        dgv_fraise.Rows(i).Cells(num_colonne).Value = False
                    End Try
     
                    'If (dgv_fraise.Rows(i).Cells(num_colonne).Value = True) Then
                    If (Convert.ToBoolean(dgv_fraise.Rows(i).Cells(num_colonne).Value) = True) Then
                        If (i <> num_ligne) Then ' On contrôle qu'il ne sagit pas de la ligne à vérifier passé en argument.
                            Return i : Exit Function ' retourne le numéro de la ligne déjà en sélection et quitte la fonction.
                        End If
                    End If
                Next
            Next
     
            Return -1 ' pas de checked dans la colonne : retourne -1
     
        End Function
     
        Private Sub dgv_fraise_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgv_fraise.CellContentClick ', dgv_fraise.CellClick
            Dim XoldRowIndex As Integer = dgv_fraise.CurrentCellAddress.X 'retourne le numéro de la colonne de la cellule active
            Dim YoldRowIndex As Integer = dgv_fraise.CurrentCellAddress.Y 'retourne le numéro de la ligne de la cellule active
            Dim nom_colonne As String = dgv_fraise.Columns(XoldRowIndex).HeaderText
     
            Label_message.Text = ""
     
            'Traitement pour le chekbox du DGV
            If (dgv_fraise.CurrentCellAddress.X = 1 Or dgv_fraise.CurrentCellAddress.X = 2 Or dgv_fraise.CurrentCellAddress.X = 3) Then
     
     
                If (Convert.ToBoolean(dgv_fraise.Rows(YoldRowIndex).Cells(XoldRowIndex).Value) = False) Then
     
                    ' -------------------- Vérification de la sélection par colonne -------------------------
                    Dim ligne_verif As Integer = verif_colonne_check_dgv_fraise(YoldRowIndex, XoldRowIndex)
     
                    If (ligne_verif <> -1) Then ' -1 signifie aucune cellule sélectionnée dans la colonne.
     
                        Beep()
                        Label_message.Text = "La cellule de la ligne " & ligne_verif + 1 & " colonne " & Chr(34) & nom_colonne & Chr(34) & " est déjà en sélection !" & vbCrLf &
                                             "Vous devez la décocher avant de cocher une autre cellule dans la même colonne."
     
                        dgv_fraise.CurrentCell = dgv_fraise.Item(XoldRowIndex, ligne_verif) ' Obtient le focus nécessaire pour désactiver la case.
                        dgv_fraise.Rows(YoldRowIndex).Cells(XoldRowIndex).Value = False ' désactive la case.
                        dgv_fraise.CurrentCell = dgv_fraise.Item(XoldRowIndex, YoldRowIndex) ' redonne le focus à la cellule active.
     
                        With dgv_fraise ' Mise en sélection de la ligne déjà coché
                            .CurrentCell = .Item(0, ligne_verif) ' il faut d'abord sélectionner une cellule de la ligne à mettre en seléction
                            .CurrentRow.Selected = True ' Mise en sélection de la ligne
                        End With
     
                        Label_col_dgv_fraise.Text = "Col "
                        Exit Sub
                    End If
                    '----------------------------- Fin de la vérification par colonne--------------------------
     
                    dgv_fraise.Rows(YoldRowIndex).Cells(XoldRowIndex).Value = True
                Else
                    dgv_fraise.Rows(YoldRowIndex).Cells(XoldRowIndex).Value = False
                End If
     
                ' resutat du checked dans la cellule.
                Label_valeur.Text = "Valeur : " & dgv_fraise.Rows(YoldRowIndex).Cells(XoldRowIndex).Value.ToString ' A retirer au final.
                Label_col_dgv_fraise.Text = "Col " & XoldRowIndex + 1
                Label_nom_titre_col.Text = nom_colonne
                Label_ligne_dgv_fraise.Text = "Ln " & YoldRowIndex + 1
     
            End If
     
        End Sub
     
        Private Sub dgv_fraise_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgv_fraise.CellClick
            Dim XoldRowIndex As Integer = dgv_fraise.CurrentCellAddress.X 'retourne le numéro de la colonne de la cellule active
            Dim YoldRowIndex As Integer = dgv_fraise.CurrentCellAddress.Y 'retourne le numéro de la ligne de la cellule active
            Dim nom_colonne As String = dgv_fraise.Columns(XoldRowIndex).HeaderText
     
     
            ' Lorsque le focus est sur la colonne 0 (numéro des lignes) on met la ligne en séléction
            If (dgv_fraise.CurrentCellAddress.X = 0) Then
                With dgv_fraise ' Mise en sélection de la ligne déjà coché
                    .CurrentCell = .Item(0, YoldRowIndex) ' il faut d'abord sélectionner une cellule de la ligne à mettre en seléction
                    .CurrentRow.Selected = True ' Mise en sélection de la ligne
                End With
            End If
     
            Label_message.Text = ""
     
            si_valeur_cellule_numerique() 'Vérification si la valeur de la cellule est numérique (drapeau).
     
            dgv_fraise_style_ligne()
     
            Try
                Label_valeur.Text = "Valeur : " & dgv_fraise.Rows(YoldRowIndex).Cells(XoldRowIndex).Value.ToString ' A retirer au final.
            Catch ex As Exception
                Label_valeur.Text = "Valeur : "
            End Try
     
            Label_col_dgv_fraise.Text = "Col " & dgv_fraise.CurrentCellAddress.X + 1
            Label_nom_titre_col.Text = nom_colonne
            Label_ligne_dgv_fraise.Text = "Ln " & dgv_fraise.CurrentCellAddress.Y + 1
     
        End Sub
        Private Sub dgv_fraise_CurrentCellChanged(sender As Object, e As EventArgs) Handles dgv_fraise.CurrentCellChanged
            'Tabulation, Flèche de déplacement, etc..
            Dim XoldRowIndex As Integer = dgv_fraise.CurrentCellAddress.X 'retourne le numéro de la colonne de la cellule active
            Dim YoldRowIndex As Integer = dgv_fraise.CurrentCellAddress.Y 'retourne le numéro de la ligne de la cellule active
     
            ' Lorsque le focus est sur la colonne 0 (numéro des lignes) on met la ligne en séléction
            If (XoldRowIndex > 0) Then
                Dim nom_colonne As String = dgv_fraise.Columns(XoldRowIndex).HeaderText
                Label_nom_titre_col.Text = nom_colonne
            End If
     
            dgv_fraise_style_ligne()
     
            Label_valeur.Text = ""
            Try
                Label_valeur.Text = "Valeur : " & dgv_fraise.Rows(YoldRowIndex).Cells(XoldRowIndex).Value.ToString
            Catch ex As Exception
                Label_valeur.Text = "Valeur : "
            End Try
            Label_col_dgv_fraise.Text = "Col " & dgv_fraise.CurrentCellAddress.X + 1
            Label_ligne_dgv_fraise.Text = "Ln " & dgv_fraise.CurrentCellAddress.Y + 1
        End Sub
     
        Private Sub dgv_fraise_KeyUp(sender As Object, e As KeyEventArgs) Handles dgv_fraise.KeyUp ' n'importe quelle touche
            ' Lorsque le clavier est utilisé (n'importe quelle touche)
     
            Dim XoldRowIndex As Integer = dgv_fraise.CurrentCellAddress.X 'retourne le numéro de la colonne de la cellule active
            Dim YoldRowIndex As Integer = dgv_fraise.CurrentCellAddress.Y 'retourne le numéro de la ligne de la cellule active
     
            ' Lorsque le focus est sur la colonne 0 (numéro des lignes) on positionne le focus sur la colonne 1
            If (dgv_fraise.CurrentCellAddress.X = 0) Then
                dgv_fraise.CurrentCell = dgv_fraise.Item(tabu_debut_col, YoldRowIndex) ' Obtient le focus
                XoldRowIndex = dgv_fraise.CurrentCellAddress.X 'retourne le numéro de la colonne de la cellule active
                Dim nom_colonne As String = dgv_fraise.Columns(XoldRowIndex).HeaderText
                Label_nom_titre_col.Text = nom_colonne
            End If
     
            Label_message.Text = ""
            si_valeur_cellule_numerique() 'Vérification si la valeur de la cellule est numérique (drapeau).
     
            Try
                Label_valeur.Text = "Valeur : " & dgv_fraise.Rows(YoldRowIndex).Cells(XoldRowIndex).Value.ToString
            Catch ex As Exception
                Label_valeur.Text = "Valeur : "
            End Try
     
            Label_col_dgv_fraise.Text = "Col " & dgv_fraise.CurrentCellAddress.X + 1
            Label_ligne_dgv_fraise.Text = "Ln " & dgv_fraise.CurrentCellAddress.Y + 1
     
        End Sub
     
        Private Sub dgv_fraise_DefaultValuesNeeded(sender As Object, e As DataGridViewRowEventArgs) Handles dgv_fraise.DefaultValuesNeeded
            ' Initialisation d'une nouvelle ligne en fin de tableau
            dgv_fraise_style_ligne()
        End Sub
     
        Private Sub dgv_fraise_RowsRemoved(sender As Object, e As DataGridViewRowsRemovedEventArgs) Handles dgv_fraise.RowsRemoved
            'Suppression d'une ou plusieurs lignes
            dgv_fraise_numerotation_ligne()
            dgv_fraise.CurrentCell = dgv_fraise.Item(tabu_debut_col, e.RowIndex) ' Obtient le focus.
        End Sub
     
        Private Sub dgv_fraise_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles dgv_fraise.CellValueChanged
            Dim XoldRowIndex As Integer = dgv_fraise.CurrentCellAddress.X 'retourne le numéro de la colonne de la cellule active
            Dim YoldRowIndex As Integer = dgv_fraise.CurrentCellAddress.Y 'retourne le numéro de la ligne de la cellule active
     
            'Vérfication si une cellule est numérique.
            cellule_numerique = True 'Drapeau boolean initialisait à numerique par défaut
            If (XoldRowIndex = 4 Or XoldRowIndex = 5 Or XoldRowIndex = 6) Then ' Choix de ou des colonnes à vérifier
                If (IsNumeric(dgv_fraise.Rows(YoldRowIndex).Cells(XoldRowIndex).Value) = False) Then
                    X_numerique = XoldRowIndex
                    Y_numerique = YoldRowIndex
                    cellule_numerique = False 'Drapeau boolean initialisait à non numerique
                End If
            End If
     
        End Sub
     
        Private Sub dgv_fraise_MouseClick(sender As Object, e As MouseEventArgs) Handles dgv_fraise.MouseClick, dgv_fraise.MouseDoubleClick
            si_valeur_cellule_numerique() 'Vérification si la valeur de la cellule est numérique (drapeau).
        End Sub
     
        Private Sub fraises_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
            ' Configuration message box
            Dim message As String = "Voulez-vous vraiment quitter ?"
            Dim titre As String = "Quitter"
            Dim bouttons As MessageBoxButtons = MessageBoxButtons.YesNo
            Dim icon As MessageBoxIcon = MessageBoxIcon.Information
            Dim defaultResult As MessageBoxDefaultButton = MessageBoxDefaultButton.Button2
            ' Affichage
            If (MessageBox.Show(message, titre, bouttons, icon, defaultResult) = vbNo) Then e.Cancel = True ' Annule
     
        End Sub
     
    End Class
    Il faut vérifier qu'il n'y a pas de bugs, si c'est le cas merci de me le signaler.

    Cordialement.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    juin 2007
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2007
    Messages : 269
    Points : 118
    Points
    118

    Par défaut

    Bonjour,

    j'ai trouvé une autre solution :

    - en utilisant un tableau de booleans (qui sert à stocker "en double" les valeurs cochées / non cochées des checkbox)
    - en mettant les trois colonnes de check box en ReadOnly
    - en gérant la saisie avec l'évenement Click (qui se déclenche aussi avec saisie au clavier)

    cette solution ne m'a demandé en fait que très peu de modification de code et c'est plus simple

    j'ai bien le résultat voulu, à savoir que chaque colonne de checkbox se comporte comme un groupe de boutons radio

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    Public Class FrmMagasinFraise
        Private ColBool(2, 1) As Boolean
     
        Private Sub GriListeFraises_CellClick(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles GriListeFraises.CellClick
            Dim r As Integer, c As Integer
            c = e.ColumnIndex
            r = e.RowIndex
            Dim nbcoche As Integer
            If r >= 0 And r < GriListeFraises.RowCount Then
                If c >= 0 And c <= 2 Then
                    GriListeFraises.SuspendLayout()
                    'Saisie :
                    ColBool(c, r) = Not ColBool(c, r)
                    GriListeFraises.Item(c, r).Value = ColBool(c, r)
                    'Comptage :
                    nbcoche = 0
                    For i = 0 To GriListeFraises.RowCount - 1
                        If ColBool(c, i) = True Then nbcoche += 1
                    Next
                    'Controle :
                    If nbcoche > 1 Then
                        For i = 0 To GriListeFraises.RowCount - 1
                            If i <> r Then
                                GriListeFraises.Item(c, i).Value = False
                                ColBool(c, i) = False
                            End If
                        Next
                    End If
                    GriListeFraises.ResumeLayout()
                    My.Application.DoEvents()
                End If
            End If
        End Sub
     
        Private Sub ButSuppLigne_Click(sender As System.Object, e As System.EventArgs) Handles ButSuppLigne.Click
            Dim i As Integer
            Call DebutTraitement(Me)
            If GriListeFraises.SelectedCells.Count = 1 Then
                i = GriListeFraises.SelectedCells.Item(0).RowIndex
                If i >= 0 And i < GriListeFraises.RowCount Then
                    If FrmMsgBox.Montrer("Voulez-vous supprimer la ligne " & (i + 1).ToString & " ?", vbYesNo) = vbYes Then
                        GriListeFraises.Rows.RemoveAt(i)
                    End If
                End If
            End If
            ReDim Preserve ColBool(2, GriListeFraises.RowCount - 1)
            EditionManuelle = True
            Call FinTraitement(Me)
        End Sub
     
        Private Sub ButNvLigne_Click(sender As System.Object, e As System.EventArgs) Handles ButNvLigne.Click
            Dim i As Integer
            Dim j As Integer
            GriListeFraises.RowCount += 1
            ReDim Preserve ColBool(2, GriListeFraises.RowCount - 1)
            For j = 0 To 2
                ColBool(j, GriListeFraises.RowCount - 1) = False
            Next
            EditionManuelle = True
        End Sub
     
        Private Sub ButDupLigne_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButDupLigne.Click
            Dim i As Integer
            Dim j As Integer
            Dim k As Integer
            Call DebutTraitement(Me)
            If GriListeFraises.SelectedCells.Count = 1 Then
                i = GriListeFraises.SelectedCells.Item(0).RowIndex
                If i >= 0 And i < GriListeFraises.RowCount Then
                    GriListeFraises.RowCount += 1
                    For j = GriListeFraises.RowCount - 1 To i + 1 Step -1
                        For k = 0 To GriListeFraises.ColumnCount - 1
                            GriListeFraises.Item(k, j).Value = GriListeFraises.Item(k, j - 1).Value
                            ColBool(k, j) = ColBool(k, j - 1)
                        Next
                    Next
                End If
            End If
            EditionManuelle = True
            Call FinTraitement(Me)
        End Sub
     
     
        Private Function LireParams(ByVal NomFichier As String, Optional ByVal VerifierTailleEtDateBMPassocie As Boolean = False, Optional ByVal ErreurSiFichierExistePas As Boolean = True) As Boolean
            '*** FONCTION DE LECTURE DES PARAMETRES
            Dim n As Integer
            Dim tmps As String
            Dim tmpi As Integer
            Dim tmpb As Boolean
            Dim tmp As Double
            Dim tmpd As DateTime
            Dim i As Integer
            Dim nb As Integer
            Call DebutTraitement(Me)
            'Me.Enabled = False
            If Dir(NomFichier) = "" Then
                If ErreurSiFichierExistePas Then
                    FrmMsgBox.Montrer("Le fichier " & NomFichier & " n'existe pas")
                End If
                Call FinTraitement(Me)
                Return False
            End If
            n = FreeFile()
            FileOpen(n, NomFichier, OpenMode.Input)
            'Lecture :
            Input(n, nb)
            GriListeFraises.Rows.Clear()
            GriListeFraises.RowCount = nb
            ReDim Preserve ColBool(2, GriListeFraises.RowCount - 1)
            For i = 0 To nb - 1
                Input(n, tmpb) : GriListeFraises.Item(0, i).Value = tmpb : ColBool(0, i) = tmpb 'Ebauche 
                Input(n, tmpb) : GriListeFraises.Item(1, i).Value = tmpb : ColBool(1, i) = tmpb 'Demi-Finition 
                Input(n, tmpb) : GriListeFraises.Item(2, i).Value = tmpb : ColBool(2, i) = tmpb 'Finition 
                Input(n, tmp) : GriListeFraises.Item(3, i).Value = ToStringUnites(tmp) 'DF
                Input(n, tmp) : GriListeFraises.Item(4, i).Value = ToStringUnites(tmp) 'DQ
                Input(n, tmp) : GriListeFraises.Item(5, i).Value = ToStringUnites(tmp) 'PM
                Input(n, tmp) : GriListeFraises.Item(6, i).Value = ToStringUnites(tmp) 'PC
                Input(n, tmp) : GriListeFraises.Item(7, i).Value = ToStringUnites(tmp) 'HQ
                Input(n, tmpi) : GriListeFraises.Item(8, i).Value = tmpi 'NbDents
                Input(n, tmpi) : Grille_SetSelectedIndex(GriListeFraises, 9, i, tmpi) 'Helice
                Input(n, tmpi) : GriListeFraises.Item(10, i).Value = tmpi 'NumT
                Input(n, tmpi) : GriListeFraises.Item(11, i).Value = tmpi 'NumH
            Next
            FileClose(n)
            'Call AfficherValeurs()
            EditionManuelle = False
            Call FinTraitement(Me)
            Return True
        End Function
     
        Private Sub SauverParams(ByVal NomFichier As String, Optional ByVal BmpMode As Boolean = False)
            '*** PROCEDURE DE SAUVEGARDE DES PARAMETRES
            Dim n As Integer
            Dim tmpd As DateTime
            Dim Erreur As String
            Dim i As Integer
            Call DebutTraitement(Me)
            'Me.Enabled = False
            n = FreeFile()
            FileOpen(n, NomFichier, OpenMode.Output)
            WriteLine(n, GriListeFraises.RowCount)
            For i = 0 To GriListeFraises.RowCount - 1
                WriteLine(n, Grille_GetCheckedValue(GriListeFraises, 0, i)) 'Ebauche
                WriteLine(n, Grille_GetCheckedValue(GriListeFraises, 1, i)) 'Demi-Finition
                WriteLine(n, Grille_GetCheckedValue(GriListeFraises, 2, i)) 'Finition
                WriteLine(n, Grille_GetDoubleValueMm(GriListeFraises, 3, i)) 'DF
                WriteLine(n, Grille_GetDoubleValueMm(GriListeFraises, 4, i)) 'DQ
                WriteLine(n, Grille_GetDoubleValueMm(GriListeFraises, 5, i)) 'PM
                WriteLine(n, Grille_GetDoubleValueMm(GriListeFraises, 6, i)) 'PC
                WriteLine(n, Grille_GetDoubleValueMm(GriListeFraises, 7, i)) 'HQ
                WriteLine(n, Grille_GetIntegerValue(GriListeFraises, 8, i)) 'NbDents
                WriteLine(n, CType(Grille_GetSelectedIndex(GriListeFraises, 9, i), TypeHelice))
                WriteLine(n, Grille_GetIntegerValue(GriListeFraises, 10, i)) 'NumT
                WriteLine(n, Grille_GetIntegerValue(GriListeFraises, 11, i)) 'NumH
            Next
            FileClose(n)
            EditionManuelle = False
            Call FinTraitement(Me)
            'Me.Enabled = True
        End Sub
     
        Private Sub ButOK_Click(sender As System.Object, e As System.EventArgs) Handles ButOK.Click
            Me.Tag = "OK"
            Me.Hide()
        End Sub
     
        Private Sub ButAnnuler_Click(sender As System.Object, e As System.EventArgs) Handles ButAnnuler.Click
            Me.Tag = ""
            Me.Hide()
        End Sub
     
    	Public Sub DebutTraitement(ByRef Feuille As System.Windows.Forms.Form)
            'ActiverDetectionEditionManuelle = False
            Feuille.Cursor = Cursors.WaitCursor
            My.Application.DoEvents()
            Feuille.SuspendLayout()
        End Sub
     
        Public Sub FinTraitement(ByRef Feuille As System.Windows.Forms.Form)
            Feuille.Cursor = Cursors.Default
            My.Application.DoEvents()
            Feuille.ResumeLayout()
            'ActiverDetectionEditionManuelle = True
        End Sub
    End Class
    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/03/2011, 17h05
  2. Colonne de bouton dans Datagridview
    Par jubourbon dans le forum Windows Forms
    Réponses: 1
    Dernier message: 25/01/2010, 19h30
  3. Réponses: 0
    Dernier message: 14/11/2008, 13h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo