Mise à jour dynamique Combobox

Résolu
Azhdarz - 19 mars 2013 à 17:52
 Azhdarz - 20 mars 2013 à 13:57
Bonsoir ,
débutant en VB , je cherche une methode pour mettre à jour dynamiquement mes combo box qui sont au nombre de 6 et interdépendante :

Combobox1 : A;B;C;D
Combobox2 : 1;2;3;4;5
Combobox3 : Q;S;D;F

Si Combobox1 est selectionné sur A , les choix 3;4;5 ne sont plus disponibles pour la combobox2 et Q;D ne sont plus disponiobles pour la combobox3 .
Mes combobox sont généré via une requête sur une table SQL SERVER 2005

J'arrive à mettre à jour ponctuellement mes combo via un bouton , mais je ne suis pas familier avec le système d'événements , comment actualiser mes combo box facilement ?

13 réponses

VbNicoG Messages postés 127 Date d'inscription vendredi 27 juin 2008 Statut Membre Dernière intervention 6 septembre 2019
20 mars 2013 à 12:09
C'est un problème de récursivité.
Tu dois faire en sorte d'inhiber l'évènement de la combo pendant le rechargement de celle-ci.
Lorsque tu recharges une combo et que tu sélectionnes la bonne item, ça implique l'appel de l'évènement sur cette combo, c'est pourquoi j'utiliserais un bit indépendant comme ceci :

Private NoEvent as boolean

    Private Sub Combo_load()
        if NoEvent then return
        Try
          NoEvent = true
          Type_Op_Load()
          Gamme_Alu_Load()
          Type_Ouv_Load()
          Nb_V_Load()
          Nb_V_F_Load()
          Renfort_Load()
        finally
           NoEvent = false
        end try
    End Sub

 Private Sub CB_Type_op_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CB_Type_op.SelectedIndexChanged
        if NoEvent then return
        Try
          NoEvent = true
          Gamme_Alu_Load()
          Type_Ouv_Load()
          Nb_V_Load()
          Nb_V_F_Load()
          Renfort_Load()
        finally
           NoEvent = false
        end try
    End Sub
    Private Sub CB_Gamme_Alu_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CB_Gamme_Alu.SelectedIndexChanged
        if NoEvent then return
        Try
          NoEvent = true
          Type_Op_Load()
          Type_Ouv_Load()
          Nb_V_Load()
          Nb_V_F_Load()
          Renfort_Load()
        finally
           NoEvent = false
        end try
    End Sub

    Private Sub CB_Type_Ouv_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CB_Type_Ouv.SelectedIndexChanged
          if NoEvent then return
        Try
          NoEvent = true
          Type_Op_Load()
          Gamme_Alu_Load()
          Nb_V_Load()
          Nb_V_F_Load()
          Renfort_Load()
        finally
           NoEvent = false
        end try
    End Sub

    Private Sub CB_Nb_V_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CB_Nb_V.SelectedIndexChanged
        if NoEvent then return
        Try
          NoEvent = true
          Type_Op_Load()
          Gamme_Alu_Load()
          Type_Ouv_Load()
          Nb_V_F_Load()
          Renfort_Load()
        finally
           NoEvent = false
        end try
    End Sub

    Private Sub CB_Nb_V_F_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CB_Nb_V_F.SelectedIndexChanged
        if NoEvent then return
        Try
          NoEvent = true
          Type_Op_Load()
          Gamme_Alu_Load()
          Type_Ouv_Load()
          Nb_V_Load()
          Renfort_Load()
         finally
           NoEvent = false
        end try
   End Sub

    Private Sub CB_renfort_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CB_renfort.SelectedIndexChanged
        if NoEvent then return
        Try
          NoEvent = true
          Type_Op_Load()
          Gamme_Alu_Load()
          Type_Ouv_Load()
          Nb_V_Load()
          Nb_V_F_Load()
        finally
           NoEvent = false
        end try
    End Sub
3
Merci beaucoup ça fonctionne parfaitement !
3
VbNicoG Messages postés 127 Date d'inscription vendredi 27 juin 2008 Statut Membre Dernière intervention 6 septembre 2019
20 mars 2013 à 08:57
Bonjour,

Utilises les évènements "SelectedIndexChanged".
Pour les utiliser, c'est très simple, dans la fenêtre de code, sélectionne ta combbobox dans la liste en haut à gauche, puis l'évènement dans la liste en haut à droite, la fonction est automatiquement créée.
A chaque changement de valeur sur la combo A, cette fonction sera appelée, ensuite suivant la valeur sélectionnée, tu peux recharger tes autres combobox.
0
Cela semble fonctionner , le problème est que mes combobox se vide quand je lance ma sous procedure qui les charge :
Private Sub Combo_load()
        strsql = "Select Distinct Type_Op from q_cas_possible_fab" '"select Distinct Type_Op  from q_cas_possible_fab where Gamme_Alu  LIKE " & Convert.ToChar(39) & "%" & CB_Gamme_Alu.SelectedItem & "%" & Convert.ToChar(39) & "AND Type_Ouv LIKE " & Convert.ToChar(39) & "%" & CB_Type_Ouv.SelectedItem & "%" & Convert.ToChar(39) & "AND Renfort LIKE " & Convert.ToChar(39) & "%" & CB_renfort.SelectedItem & "%" & Convert.ToChar(39) 
        cmd = New SqlCommand(strsql, con)
        dr = cmd.ExecuteReader
        CB_Type_op.Items.Clear()
        Do While dr.Read
            CB_Type_op.Items.Add(dr("Type_Op"))
        Loop
        dr.Close()
        strsql = "Select Distinct Gamme_Alu from q_cas_possible_fab" '"select Distinct Gamme_Alu  from q_cas_possible_fab where Type_Op  LIKE " & Convert.ToChar(39) & "%" & CB_Type_op.SelectedItem & "%" & Convert.ToChar(39) & " AND Type_Ouv LIKE " & Convert.ToChar(39) & "%" & CB_Type_Ouv.SelectedItem & "%" & Convert.ToChar(39) & " AND Renfort LIKE " & Convert.ToChar(39) & "%" & CB_renfort.SelectedItem & "%" & Convert.ToChar(39) 
        cmd = New SqlCommand(strsql, con)
        dr = cmd.ExecuteReader
        CB_Gamme_Alu.Items.Clear()
        Do While dr.Read
            CB_Gamme_Alu.Items.Add(dr("Gamme_Alu"))
        Loop
        dr.Close()

        strsql = "Select Distinct Type_Ouv from q_cas_possible_fab" '"select Distinct Type_Ouv  from q_cas_possible_fab where Type_Op  LIKE " & Convert.ToChar(39) & "%" & CB_Type_op.SelectedItem & "%" & Convert.ToChar(39) & " AND Gamme_Alu LIKE " & Convert.ToChar(39) & "%" & CB_Gamme_Alu.SelectedItem & "%" & Convert.ToChar(39) & " AND Renfort LIKE " & Convert.ToChar(39) & "%" & CB_renfort.SelectedItem & "%" & Convert.ToChar(39) 
        cmd = New SqlCommand(strsql, con)
        dr = cmd.ExecuteReader
        CB_Type_Ouv.Items.Clear()
        Do While dr.Read
            CB_Type_Ouv.Items.Add(dr("Type_Ouv"))
        Loop
        dr.Close()

        strsql = "Select Distinct Nb_V from q_cas_possible_fab" '"select Distinct Nb_V  from q_cas_possible_fab where Type_Op  LIKE " & Convert.ToChar(39) & "%" & CB_Type_op.SelectedItem & "%" & Convert.ToChar(39) & " AND Gamme_Alu LIKE " & Convert.ToChar(39) & "%" & CB_Gamme_Alu.SelectedItem & "%" & Convert.ToChar(39) & " AND Type_Ouv LIKE " & Convert.ToChar(39) & "%" & CB_Type_Ouv.SelectedItem & "%" & Convert.ToChar(39) & " AND Renfort LIKE " & Convert.ToChar(39) & "%" & CB_renfort.SelectedItem & "%" & Convert.ToChar(39) 
        cmd = New SqlCommand(strsql, con)
        dr = cmd.ExecuteReader
        CB_Nb_V.Items.Clear()
        Do While dr.Read
            CB_Nb_V.Items.Add(dr("Nb_V"))
        Loop
        dr.Close()

        strsql = "Select Distinct Nb_V_F from q_cas_possible_fab" '"select Distinct Nb_V_F  from q_cas_possible_fab where Type_Op  LIKE " & Convert.ToChar(39) & "%" & CB_Type_op.SelectedItem & "%" & Convert.ToChar(39) & " AND Gamme_Alu LIKE " & Convert.ToChar(39) & "%" & CB_Gamme_Alu.SelectedItem & "%" & Convert.ToChar(39) & " AND Type_Ouv LIKE " & Convert.ToChar(39) & "%" & CB_Type_Ouv.SelectedItem & "%" & Convert.ToChar(39) & " AND Renfort LIKE " & Convert.ToChar(39) & "%" & CB_renfort.SelectedItem & "%" & Convert.ToChar(39) 
        cmd = New SqlCommand(strsql, con)
        dr = cmd.ExecuteReader
        CB_Nb_V_F.Items.Clear()
        Do While dr.Read
            CB_Nb_V_F.Items.Add(dr("Nb_V_F"))
        Loop
        dr.Close()

        strsql = "Select Distinct Renfort from q_cas_possible_fab" '"select Distinct Renfort  from q_cas_possible_fab where Type_Op  LIKE " & Convert.ToChar(39) & "%" & CB_Type_op.SelectedItem & "%" & Convert.ToChar(39) & " AND Gamme_Alu LIKE " & Convert.ToChar(39) & "%" & CB_Gamme_Alu.SelectedItem & "%" & Convert.ToChar(39) & " AND Type_Ouv LIKE " & Convert.ToChar(39) & "%" & CB_Type_Ouv.SelectedItem & "%" & Convert.ToChar(39) 
        cmd = New SqlCommand(strsql, con)
        dr = cmd.ExecuteReader
        CB_renfort.Items.Clear()
        Do While dr.Read
            CB_renfort.Items.Add(dr("Renfort"))
        Loop
        dr.Close()
    End Sub
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Pas de bouton édition sur ce forum oO
Simplement pour précisuer que le second select en commnetaire correspond au select pour la mise à jour dynamique de mes combo
0
VbNicoG Messages postés 127 Date d'inscription vendredi 27 juin 2008 Statut Membre Dernière intervention 6 septembre 2019
20 mars 2013 à 09:17
Quand tu dis qu'elles se vident, il n'y a plus de sélections possibles car plus d'items présentes ?
Ou que la sélection précédente est annulée ?

Si c'est le deuxième cas, ça semble normal car ta nouvelle sélection dans ta combobox A implique un tri d'item par tes requêtes sql dans tes autres combos, donc tu te dois de re-sélectionner l'item correspondante par choix dans la combo ou par code.
0
La Selection précédente est annulé malgrè le faites qu'elle reste un des choix valide de la combo

COmment faire en sorte de conserver les selections appartenant à la liste des choix de la combo ?
0
VbNicoG Messages postés 127 Date d'inscription vendredi 27 juin 2008 Statut Membre Dernière intervention 6 septembre 2019
20 mars 2013 à 09:35
Tu mémorises tes sélections précédentes de tes combos (attention par le texte, pas par l'index) avant d'appeler ta fonction combo_load() et ensuite tu fais un test entre tes textes mémorisés et les nouvelles items de tes combos. S'il y a correspondance, tu forces la sélection de ta combo, sinon elle reste vide.
0
Comment fais-je pour obtenir les items actuelles de ma combo ?
0
VbNicoG Messages postés 127 Date d'inscription vendredi 27 juin 2008 Statut Membre Dernière intervention 6 septembre 2019
20 mars 2013 à 09:53
Essaies quelque chose comme ça :

For i as integer = 0 to MyCombo.Items.Count-1
       if MyTextMemorized.equals(MyCombo.Items(i).ToString) then
          MyCombo.SelectedIndex = i
       endif
   exit for
next
0
Merci pour ton aide j'ai bien avancé .
J'ai donc suivi ta méthode pour sauvergarder mes valeurs dans mes combobox et remettre la valeur , j'ai mit une execution de ma procedure combo_load à chaque SelectedIndexChanged , mais du fait que ma procedure combo_load contient toutes les combos ça boucle "Une exception non gérée du type 'System.StackOverflowException' s'est produite dans Fabrication_2013.exe" ais-je une autre solution que de créer une procedure par evenement ?
0
VbNicoG Messages postés 127 Date d'inscription vendredi 27 juin 2008 Statut Membre Dernière intervention 6 septembre 2019
20 mars 2013 à 11:14
A partir de là, tu devrais pouvoir t'en sortir tout seul.
Il suffit de mettre un bit à 1 dans l'évènement de ta combo, puis dans la fonction Combo_load(), si le bit de la combo en question est à 1, tu ne la recharges pas, tu ne recharges que les autres...pareils pour les évènements des autres combos.
Et n'oublies pas de remettre à 0 ce bit en sortie de fonction.
0
Private Sub Type_Op_Load()
        Type_Op_sav = CB_Type_op.Text
        strsql = "select Distinct Type_Op  from q_cas_possible_fab where Gamme_Alu  LIKE " & Convert.ToChar(39) & "%" & CB_Gamme_Alu.SelectedItem & "%" & Convert.ToChar(39) & " AND Type_Ouv LIKE " & Convert.ToChar(39) & "%" & CB_Type_Ouv.SelectedItem & "%" & Convert.ToChar(39) & " AND Renfort LIKE " & Convert.ToChar(39) & "%" & CB_renfort.SelectedItem & "%" & Convert.ToChar(39) '"Select Distinct Type_Op from q_cas_possible_fab"
        cmd = New SqlCommand(strsql, con)
        dr = cmd.ExecuteReader
        CB_Type_op.Items.Clear()
        Do While dr.Read
            CB_Type_op.Items.Add(dr("Type_Op"))
        Loop
        dr.Close()
        For i As Integer = 0 To CB_Type_op.Items.Count - 1
            If Type_Op_sav.Equals(CB_Type_op.Items(i).ToString) Then
                CB_Type_op.SelectedIndex = i
            End If
            Exit For
        Next
    End Sub
    Private Sub Gamme_Alu_Load()
        Gamme_Alu_sav = CB_Gamme_Alu.Text
        strsql = "select Distinct Gamme_Alu  from q_cas_possible_fab where Type_Op  LIKE " & Convert.ToChar(39) & "%" & CB_Type_op.SelectedItem & "%" & Convert.ToChar(39) & " AND Type_Ouv LIKE " & Convert.ToChar(39) & "%" & CB_Type_Ouv.SelectedItem & "%" & Convert.ToChar(39) & " AND Renfort LIKE " & Convert.ToChar(39) & "%" & CB_renfort.SelectedItem & "%" & Convert.ToChar(39) '"Select Distinct Gamme_Alu from q_cas_possible_fab"
        cmd = New SqlCommand(strsql, con)
        dr = cmd.ExecuteReader
        CB_Gamme_Alu.Items.Clear()
        Do While dr.Read
            CB_Gamme_Alu.Items.Add(dr("Gamme_Alu"))
        Loop
        dr.Close()
        For i As Integer = 0 To CB_Gamme_Alu.Items.Count - 1
            If Gamme_Alu_sav.Equals(CB_Gamme_Alu.Items(i).ToString) Then
                CB_Gamme_Alu.SelectedIndex = i
            End If
            Exit For
        Next
    End Sub
    Private Sub Type_Ouv_Load()
        Type_Ouv_sav = CB_Type_Ouv.Text
        strsql = "select Distinct Type_Ouv  from q_cas_possible_fab where Type_Op  LIKE " & Convert.ToChar(39) & "%" & CB_Type_op.SelectedItem & "%" & Convert.ToChar(39) & " AND Gamme_Alu LIKE " & Convert.ToChar(39) & "%" & CB_Gamme_Alu.SelectedItem & "%" & Convert.ToChar(39) & " AND Renfort LIKE " & Convert.ToChar(39) & "%" & CB_renfort.SelectedItem & "%" & Convert.ToChar(39) '"Select Distinct Type_Ouv from q_cas_possible_fab" 
        cmd = New SqlCommand(strsql, con)
        dr = cmd.ExecuteReader
        CB_Type_Ouv.Items.Clear()
        Do While dr.Read
            CB_Type_Ouv.Items.Add(dr("Type_Ouv"))
        Loop
        dr.Close()
        For i As Integer = 0 To CB_Type_Ouv.Items.Count - 1
            If Type_Ouv_sav.Equals(CB_Type_Ouv.Items(i).ToString) Then
                CB_Type_Ouv.SelectedIndex = i
            End If
            Exit For
        Next
    End Sub

    Private Sub Nb_V_Load()
        Nb_V_sav = CB_Nb_V.Text
        strsql = "select Distinct Nb_V  from q_cas_possible_fab where Type_Op  LIKE " & Convert.ToChar(39) & "%" & CB_Type_op.SelectedItem & "%" & Convert.ToChar(39) & " AND Gamme_Alu LIKE " & Convert.ToChar(39) & "%" & CB_Gamme_Alu.SelectedItem & "%" & Convert.ToChar(39) & " AND Type_Ouv LIKE " & Convert.ToChar(39) & "%" & CB_Type_Ouv.SelectedItem & "%" & Convert.ToChar(39) & " AND Renfort LIKE " & Convert.ToChar(39) & "%" & CB_renfort.SelectedItem & "%" & Convert.ToChar(39) '"Select Distinct Nb_V from q_cas_possible_fab" '
        cmd = New SqlCommand(strsql, con)
        dr = cmd.ExecuteReader
        CB_Nb_V.Items.Clear()
        Do While dr.Read
            CB_Nb_V.Items.Add(dr("Nb_V"))
        Loop
        dr.Close()
        For i As Integer = 0 To CB_Nb_V.Items.Count - 1
            If Nb_V_sav.Equals(CB_Nb_V.Items(i).ToString) Then
                CB_Nb_V.SelectedIndex = i
            End If
            Exit For
        Next

    End Sub
    Private Sub Nb_V_F_Load()
        Nb_V_F_sav = CB_Nb_V_F.Text
        strsql = "select Distinct Nb_V_F  from q_cas_possible_fab where Type_Op  LIKE " & Convert.ToChar(39) & "%" & CB_Type_op.SelectedItem & "%" & Convert.ToChar(39) & " AND Gamme_Alu LIKE " & Convert.ToChar(39) & "%" & CB_Gamme_Alu.SelectedItem & "%" & Convert.ToChar(39) & " AND Type_Ouv LIKE " & Convert.ToChar(39) & "%" & CB_Type_Ouv.SelectedItem & "%" & Convert.ToChar(39) & " AND Renfort LIKE " & Convert.ToChar(39) & "%" & CB_renfort.SelectedItem & "%" & Convert.ToChar(39) '"Select Distinct Nb_V_F from q_cas_possible_fab" 
        cmd = New SqlCommand(strsql, con)
        dr = cmd.ExecuteReader
        CB_Nb_V_F.Items.Clear()
        Do While dr.Read
            CB_Nb_V_F.Items.Add(dr("Nb_V_F"))
        Loop
        dr.Close()
        For i As Integer = 0 To CB_Nb_V_F.Items.Count - 1
            If Nb_V_F_sav.Equals(CB_Nb_V_F.Items(i).ToString) Then
                CB_Nb_V_F.SelectedIndex = i
            End If
            Exit For
        Next

    End Sub
    Private Sub Renfort_Load()
        Renfort_sav = CB_renfort.Text
        strsql = "select Distinct Renfort  from q_cas_possible_fab where Type_Op  LIKE " & Convert.ToChar(39) & "%" & CB_Type_op.SelectedItem & "%" & Convert.ToChar(39) & " AND Gamme_Alu LIKE " & Convert.ToChar(39) & "%" & CB_Gamme_Alu.SelectedItem & "%" & Convert.ToChar(39) & " AND Type_Ouv LIKE " & Convert.ToChar(39) & "%" & CB_Type_Ouv.SelectedItem & "%" & Convert.ToChar(39) '"Select Distinct Renfort from q_cas_possible_fab" '
        cmd = New SqlCommand(strsql, con)
        dr = cmd.ExecuteReader
        CB_renfort.Items.Clear()
        Do While dr.Read
            CB_renfort.Items.Add(dr("Renfort"))
        Loop
        dr.Close()
        For i As Integer = 0 To CB_renfort.Items.Count - 1
            If Renfort_sav.Equals(CB_renfort.Items(i).ToString) Then
                CB_renfort.SelectedIndex = i
            End If
            Exit For
        Next
    End Sub
    Private Sub Combo_load()
        Type_Op_Load()
        Gamme_Alu_Load()
        Type_Ouv_Load()
        Nb_V_Load()
        Nb_V_F_Load()
        Renfort_Load()


    End Sub
 Private Sub CB_Type_op_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CB_Type_op.SelectedIndexChanged
        Gamme_Alu_Load()
        Type_Ouv_Load()
        Nb_V_Load()
        Nb_V_F_Load()
        Renfort_Load()
    End Sub
    Private Sub CB_Gamme_Alu_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CB_Gamme_Alu.SelectedIndexChanged
        Type_Op_Load()
        Type_Ouv_Load()
        Nb_V_Load()
        Nb_V_F_Load()
        Renfort_Load()
    End Sub

    Private Sub CB_Type_Ouv_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CB_Type_Ouv.SelectedIndexChanged
        Type_Op_Load()
        Gamme_Alu_Load()
        Nb_V_Load()
        Nb_V_F_Load()
        Renfort_Load()
    End Sub

    Private Sub CB_Nb_V_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CB_Nb_V.SelectedIndexChanged
        Type_Op_Load()
        Gamme_Alu_Load()
        Type_Ouv_Load()
        Nb_V_F_Load()
        Renfort_Load()

    End Sub

    Private Sub CB_Nb_V_F_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CB_Nb_V_F.SelectedIndexChanged
        Type_Op_Load()
        Gamme_Alu_Load()
        Type_Ouv_Load()
        Nb_V_Load()
        Renfort_Load()
    End Sub



    Private Sub CB_renfort_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CB_renfort.SelectedIndexChanged
        Type_Op_Load()
        Gamme_Alu_Load()
        Type_Ouv_Load()
        Nb_V_Load()
        Nb_V_F_Load()
    End Sub


Voila ma nouvelle version de mon Code avec le LOAD des combo géré par une procedure individuelle par combo , mais je rencontre encore des problèmes de stack overflow
0
Rejoignez-nous