DataGriViewComboboxCell et DataSource
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:
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:
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:
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:
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:
- Je modifie le data source de la colonne et non de la cellule
Pourtant ce code
Code:
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.
- 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.