Bonjour,

EDI: VS2010

Voici le problème que je rencontre ainsi que beaucoup d'autres:
Dans un datagridview j'ai deux combobox liées adues sources de données distinctes. Mon datagridview n'est pour l'instant pas liés à une source de données.
Mon premier combobox est alimenté par un dataset. il me donne la liste des fournisseurs.

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
 
 Private Sub LoadCboFournisseur()
        Try
 
            Dim Rq As String = "SELECT IdFournisseur , Nom FROM Fournisseurs WHERE flag_supp=0"
            Dim ds As DataSet = SqlHelper.ExecuteDataset(sConnexion, CommandType.Text, Rq)
            Dim dr As DataRow = ds.Tables(0).NewRow()
            dr.Item("Nom") = "Sélectionnez"
            ds.Tables(0).Rows.InsertAt(dr, 0)
            CboFournisseur.DataSource = ds.Tables(0)
            CboFournisseur.ValueMember = "IdFournisseur"
            CboFournisseur.DisplayMember = "Nom"
            ''Liaison du combobox et du champ id
            DGPiecesReserves.Columns("CboFournisseur").DataPropertyName = "R_idFournisseur"
 
        Catch ex As Exception
 
            MessageBox.Show(ex.Message, "LoadCboFournisseur", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub
Mon deuxième combobox est bindé à une source de données "Piece".

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
 
   Private Sub LoadCboDesignation()
        Try
 
            Dim Rq As String = "SELECT Id_Piece , Designation,idFournisseur FROM Piece WHERE flag_supp=0"
            Dim ds As DataSet = SqlHelper.ExecuteDataset(sConnexion, CommandType.Text, Rq)
            Dim dr As DataRow = ds.Tables(0).NewRow()
            dr.Item("Designation") = "Sélectionnez"
            ds.Tables(0).Rows.InsertAt(dr, 0)
            ''*****************************************
            Dim bs As New BindingSource
            Dim dv As DataView = ds.Tables(0).DefaultView
            filteredDesignationBS.DataSource = dv
 
            ''******************************************
            CboDesignation.DataSource = filteredDesignationBS
            CboDesignation.ValueMember = "id_Piece"
            CboDesignation.DisplayMember = "Designation"
            ''Liaison du combobox et du champ id
            DGPiecesReserves.Columns("CboDesignation").DataPropertyName = "R_idPiece"
 
        Catch ex As Exception
            isLoadingCboDesignation = False
            MessageBox.Show(ex.Message, "LoadCboDesigner", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
Ces procédures sont appelées au chargement de mon formulaire. Jusque là tout va bien.

Mon objetif est de vous l'aurez compris, séléctionner mon fournisseur et obtenir les pièces correspondantes et ce pour chaque ligne du datagridview.

Par conséquent, j' implémente le code suivant qui gère les évènements du datagridview.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
 Private Sub DGPiecesReserves_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DGPiecesReserves.EditingControlShowing
 
        If TypeOf (e.Control) Is DataGridViewComboBoxEditingControl Then
 
            Dim cbo As ComboBox = CType(e.Control, ComboBox)
            If cbo IsNot Nothing Then
                 RemoveHandler cbo.SelectedIndexChanged, AddressOf cboFournisseur_SelectedIndexChanged
                AddHandler cbo.SelectedIndexChanged, AddressOf cboFournisseur_SelectedIndexChanged
 
            End If
        End If
 
    End Sub
Et je génère l' évènement me permettant d'intercepter une séléction de valeur sur les combobox du datagridview.

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
 
  Private Sub cboFournisseur_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs)
        Try
 
            Dim Cbo As ComboBox = DirectCast(sender, ComboBox)
            If Cbo.SelectedIndex < 0 Then
                Exit Sub
            ElseIf (Cbo.SelectedIndex = 0 And MyActiveCellCol = 2) Then
                  LoadCboDesignation()
                Exit Sub
            End If
 
            If MyActiveCellCol = 2 Then ''Test du combo parent
                If Cbo.SelectedValue.ToString = "" Or Cbo.SelectedValue.ToString = "System.Data.DataRowView" Then Exit Sub
                ''Affectation d une source de données au combo enfant
                filteredDesignationBS.Filter = "IdFournisseur=" & Cbo.SelectedValue
 
                Dim cboPiece As DataGridViewComboBoxCell = DirectCast(DGPiecesReserves(4, MyActiveCellRow), DataGridViewComboBoxCell)
                ''If MyActiveCellRow = 0 Then cboPiece.ToolTipText = "Colonne 1"
                ''If MyActiveCellRow = 1 Then cboPiece.ToolTipText = "Colonne 2"
                ''If MyActiveCellRow = 2 Then cboPiece.ToolTipText = "Colonne 3"
                cboPiece.DataSource = filteredDesignationBS
 
            End If
 
            If MyActiveCellCol = 4 Then
 
                Dim designation As String = String.Empty
                DGPiecesReserves.CurrentRow.Cells("R_IdPiece").Value = Cbo.SelectedValue
                If Cbo.SelectedValue.ToString = "" Or Cbo.SelectedValue.ToString = "System.Data.DataRowView" Then Exit Sub
                Dim rq As String = "SELECT Reference,Designation FROM Piece WHERE id_Piece=" & Cbo.SelectedValue
                Dim MyReader As SqlDataReader = SqlHelper.ExecuteReader(sConnexion, CommandType.Text, rq)
                If MyReader.HasRows Then
                    If MyReader.Read Then
                        DGPiecesReserves.CurrentRow.Cells("R_Reference").Value = MyReader.Item("Reference")
                        designation = MyReader.Item("Designation")
                    End If
                    MyReader.Close()
 
            End If
 
        Catch ex As Exception
            MessageBox.Show(ex.Message, "cboFournisseur_SelectedIndexChanged")
        End Try
    End Sub
La colonne 2 représente le combobox fournisseur et la colonne 4 celui de la pièce. La sélection dun fournisseur modifie le filtre du combobox de la pièce.

Mais apparait Le problème

Après avoir renseigné un ligne (fournisseur, pièce), si je tente de modifier le fournisseur une erreur apparait précisant que la valeur de la cellule du combobox de la pièce n'est pas valide. Pour information, je récupère les erreurs du datagridview comme il est conseille.

Cette erreur apparait également si je crée un ligne suivante avec un fournisseur différent.

Par conséquent j'en conclue que:

  1. Je modifie le data source de la colonne et non de la cellule
    Pourtant ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim cboPiece As DataGridViewComboBoxCell = DirectCast(DGPiecesReserves(4, MyActiveCellRow), DataGridViewComboBoxCell)
    instancie bien un objet de type cell et non column.
    D'ailleurs j'arrive bien à modifier pour chaque combo de chaque ligne la valeur de la propriété ToolTipText.
  2. Et lorsqu'une ligne est modifiée par le choix d'un autre fournisseur, il est nécessaire de réinitialiser le combobox pièce sous peine de lever un erreur du datagridview.


Maintenant j'attend avec impatience votre expérience, vos suggestions car je navigue déspérément sur le web sans trouver de solution à ce problème.