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.
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 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
Ces procédures sont appelées au chargement de mon formulaire. Jusque là tout va bien.
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
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.
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 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
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.
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
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
instancie bien un objet de type cell et non column.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Dim cboPiece As DataGridViewComboBoxCell = DirectCast(DGPiecesReserves(4, MyActiveCellRow), DataGridViewComboBoxCell)
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.






Répondre avec citation
Partager