Bonjour je suis passé récemment de Access à VB.net et SQL server
Dans mon formulaire, j'ai une ListeBox nommée LstDefaut qui contient une liste de défaut liée à la TB_DEFAUT. À coté j'ai une datagridview DgElemn qui n'est pas reliée directement è la base de donnée, cette liste comporte une colonne checkbox nommée chk. le remplissage de ces contrôles ne pose pas de problème sauf pour la case a cochér.
Le rôle de cette case est d'indiquer si le défaut sélectionné dans la LstDefaut peut être associé à l'élément. Par exemple un boulon manquant ne peut pas être associé à la fondation ou au remblai donc la case n'est pas cochée.
Quand on coche un élément, un enregistrement est inscrit dans la table TB_DEFAUT_CLASS_ELEMN qui comprend 2 champs NO_DEFAUT et IDE_CLASS_ELEMN

Mon problème survient quand je veux que les cases soient mises à jour au changement de sélection du défaut et au chargement du formulaire. La seule case qui est cochée est celle au dernier passage de la boucle.
Voici le 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
 Sub CocherElemn()        'Coche les éléments visés par le défaut sélectionné
        sSql = "Select NO_DEFAUT, IDE_CLASS_ELEMN" _
            & " From TB_DEFAUT_CLASS_ELEMN" _
            & " Where NO_DEFAUT =" & LstDefaut.SelectedValue & ";"
        Flag = True
        Using connection = New SqlConnection(CONSTR)
            connection.Open()
            Using comm As SqlCommand = New SqlCommand(sSql, connection)
                Dim rs As SqlDataReader = comm.ExecuteReader
                ' Décoche toutes les cases avant la mise a jour
                With DgElemn
                    For i As Integer = 0 To .Rows.Count - 1
                        .Rows(i).Cells(1).Value = False
                        .Rows(i).Cells(1).Style.BackColor = Color.White
                    Next
                    'Vérifie chaque ligne de la table TB_DEFAUT_CLASS_ELEMN 
                    While rs.Read()
                        For i As Integer = 0 To .Rows.Count - 1
                            'Passe chaque élément de DgElemn
                            .Rows(i).Cells(1).Selected = True
                            If .Rows(i).Cells(0).Value = rs(1) Then
                                'Coche si LstDefaut.IDE_CLASS_ELEMN= DgElemn.IDE_CLASS_ELEMN
                                .Rows(i).Cells(1).Value = True
                                Debug.Print(.Rows(i).Cells(2).Value)
                            Else
                                .Rows(i).Cells(1).Value = False
                            End If
                        Next
                    End While
                    .ClearSelection()
                End With
            End Using
        End Using
        Flag = False
    End Sub
 
    Sub AjouterLien(cl As Integer)
        sSql = "INSERT INTO [dbo].[TB_DEFAUT_CLASS_ELEMN]" _
            & " ([NO_DEFAUT] ,[IDE_CLASS_ELEMN])" _
            & " VALUES (" & LstDefaut.SelectedValue & ", " & cl & ");"
        Using connection = New SqlConnection(CONSTR)
            connection.Open()
            Using comm As SqlCommand = New SqlCommand(sSql, connection)
                comm.ExecuteNonQuery()
            End Using
        End Using
    End Sub
 
    Sub RetirerLien(cl As Integer)
        sSql = "DELETE FROM [dbo].[TB_DEFAUT_CLASS_ELEMN]" _
             & " WHERE NO_DEFAUT=" & LstDefaut.SelectedValue & "[IDE_CLASS_ELEMN] =" & cl & ";"
        Using connection = New SqlConnection(CONSTR)
            connection.Open()
            Using comm As SqlCommand = New SqlCommand(sSql, connection)
                comm.ExecuteNonQuery()
            End Using
        End Using
    End Sub
Merci pour votre support.