Faire correspondre 2 class en combobox vb.net

Résolu/Fermé
WarT Messages postés 67 Date d'inscription vendredi 14 août 2009 Statut Membre Dernière intervention 4 juin 2014 - 9 mai 2012 à 18:06
WarT Messages postés 67 Date d'inscription vendredi 14 août 2009 Statut Membre Dernière intervention 4 juin 2014 - 11 mai 2012 à 20:21
Bonjour,

Je suis actuellement en train de faire un programme pour modifier une base de données.

Dans ma base de données je dispose de deux tables :
parent(no_parent(PRIMAIRE),nom_parent,prenom_parent,adresse_parent,cp_parent,ville_parent)
enfant(no_enfant(PRIMAIRE),nom_enfant,prenom_enfant,no_parent#)

Dans mon programme, je dispose d'une combobox dans laquelle s'affiche la table enfant (via une classe), de deux textbox (nom,prenom), et d'une combobox dans laquelle s'affiche la table parent (encore une fois via une classe).

Voici mon code :

Imports System
Imports System.Data
Imports MySql.Data
Imports MySql.Data.MySqlClient

Public Class Modifier_un_enfant
Private oConnexion As New MySqlConnection("server=localhost;user=root;database=projet_alsh;port=3306;password=;")
Private oCommande As MySqlCommand

Private Sub Modifier_un_enfant_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim requete As String
cbx_modifier_un_enfant_enfant.Items.Clear()

Try
oConnexion.Open()
requete = "SELECT no_enfant,nom_enfant,prenom_enfant,no_parent FROM enfant"
oCommande = New MySqlCommand(requete, oConnexion)
Dim Enfant As MySqlDataReader = oCommande.ExecuteReader
While Enfant.Read()
cbx_modifier_un_enfant_enfant.Items.Add(New Class_Modifier_un_enfant(Enfant.Item("no_enfant"), Enfant.Item("nom_enfant"), Enfant.Item("prenom_enfant"), Enfant.Item("no_parent")))
End While
Enfant.Close()
Catch ex As Exception
MessageBox.Show("Insertion Class : " + ex.Message)
Finally
oConnexion.Close()
End Try
Try
oConnexion.Open()
requete = "SELECT no_parent,nom_parent,prenom_parent,adresse_parent,code_postal_parent,ville_parent FROM parent"
oCommande = New MySqlCommand(requete, oConnexion)
Dim Parent As MySqlDataReader = oCommande.ExecuteReader
While Parent.Read()
cbx_modifier_un_enfant_parent.Items.Add(New Class_Modifier_un_parent(Parent.Item("no_parent"), Parent.Item("nom_parent"), Parent.Item("prenom_parent"), Parent.Item("adresse_parent"), Parent.Item("code_postal_parent"), Parent.Item("ville_parent")))
End While
Parent.Close()
Catch ex As Exception
MessageBox.Show("Insertion Class : " + ex.Message)
Finally
oConnexion.Close()
End Try
End Sub

Private Sub cbx_modifier_un_enfant_enfant_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbx_modifier_un_enfant_enfant.SelectedIndexChanged
tbx_nomenfant.Text = cbx_modifier_un_enfant_enfant.SelectedItem.getnom
tbx_prenomenfant.Text = cbx_modifier_un_enfant_enfant.SelectedItem.getprenom
End Sub
End Class



Mon problème est le suivant : lorsque je sélectionne un enfant dans la combobox enfant, les textbox se remplissent en fonction de l'item sélectionné et des données implémentées dans la class, mais la combobox parent ne sélectionne aucun parent, cela veut dire qu'a chaque modification d'un enfant il faut resélectionner le parent.

Je souhaiterai faire une boucle afin de faire correspondre le no_parent de ma classe parent et enfant pour que ma combobox parent sélectionne le parent correspondant à l'enfant sélectionné dans ma combobox enfant (^^) mais je n'arrive pas à trouver de boucle qui fonctionne, pouvez-vous m'aider ?

Si ce n'est pas assez clair, dites le moi =)


Merci !
A voir également:

4 réponses

re:

Cela ne change rien au fait de pouvoir modifier le parent, cela te permettra
simplement de localisé le parent par une nouvelle lecture et ensuite par
balayage de le trouver dans ta liste déroulante parent.

Tu pourras trouver son index et le positionner dans ta liste déroulante.

Pour ma part, je n'ai pas compris comment tu peux ajouter une série d'éléments
dans un combobox :

cbx_modifier_un_enfant_enfant.Items.Add(New Class_Modifier_un_enfant(Enfant.Item("no_enfant"), Enfant.Item("nom_enfant"), Enfant.Item("prenom_enfant"), Enfant.Item("no_parent")))

en fait tu insère un DataRow ?

Cdt

Lupin
1
re:

S'il s'agit bien d'un DataRow qui est insérer dans tes ComboBoxs,
tu peux sélectionner le parent ainsi :

Private Sub cbx_Enfants_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbx_Enfants.SelectedIndexChanged


	If (Me.cbx_Enfants.SelectedIndex > 0) Then

		Dim Boucle As Int32 = 0
		Dim Position As Int32 = 0

		Dim Dr As DataRowView = DirectCast(Me.cbx_Enfants.SelectedItem, DataRowView)

		Dim NumeroParent As String = Dr(3).ToString

		For Boucle = 0 To Me.cbx_Parents.Items.Count - 1
			Dr = DirectCast(Me.cbx_Parents.Items(Boucle), DataRowView)
			If (Dr(0).ToString.Equals(NumeroParent)) Then
				Position = Boucle
				Exit For
			End If
		Next

		Me.cbx_Parents.SelectedIndex = Position
	End If

End Sub


Cdt

Lupin
0
Bonjour,

simplement tu pourrais tout simplement retourner à la BD
avec une clause WHERE dans le select du genre :

"SELECT no_parent,nom_parent,prenom_parent,adresse_parent,code_postal_parent,ville_parent FROM parent WHERE no_parent = " & NumParent

où NumParent est affecté lors de l'évènement Changed du ComboBox Enfants

Bien entendu, tu aurais avantage à travailler sur un modèle organique d'au
moins trois couches, et alimenté ton interface par des collections, bon c'est
mon humble avis, mais quand il y a BD...

Jouer dans ton interface avec des collections d'objets te permettrait d'utiliser
les méthodes LinQ pour gérer ce genre de situation.

Cdt

Lupin
0
WarT Messages postés 67 Date d'inscription vendredi 14 août 2009 Statut Membre Dernière intervention 4 juin 2014 16
9 mai 2012 à 23:10
"modèle organique d'au moins trois couches" ? "méthodes LinQ" ? Je crois que je n'ai pas encore vu ça en cours x)

Mais pour l'histoire du WHERE cela ne marchera pas car le programme doit offrir la possibilité de modifié le parent, or avec un WHERE restreindra juste les modifications possible au parent étant déjà associé à l'enfant, autrement dit aucunes modifications du parent ne sera possible (enfin il me semble ^^).
0
WarT Messages postés 67 Date d'inscription vendredi 14 août 2009 Statut Membre Dernière intervention 4 juin 2014 16
11 mai 2012 à 20:21
C'est plus ou moins se que j'ai trouvé ^^

        For i = 0 To (cmb_parent.Items.Count - 1)
            t = Split(cmb_parent.Items(i).getno.ToString)
            If t(0) = cmb_enfant.SelectedItem.getnoparent.ToString Then
                cmb_parent.SelectedIndex = i
            End If
        Next


J'ai bidouillé un peu et j'ai trouvé ça qui marche très bien.

Merci de ton aide lupin =)
0