Mise à jour dynamique Combobox [Résolu]

Azhdarz - 19 mars 2013 à 17:52 - Dernière réponse :  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 ?
Afficher la suite 

Votre réponse

13 réponses

Meilleure réponse
VbNicoG 120 Messages postés vendredi 27 juin 2008Date d'inscription 24 août 2018 Dernière intervention - 20 mars 2013 à 12:09
3
Merci
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

Merci VbNicoG 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de VbNicoG
Meilleure réponse
3
Merci
Merci beaucoup ça fonctionne parfaitement !

Merci Azhdarz 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de Azhdarz
VbNicoG 120 Messages postés vendredi 27 juin 2008Date d'inscription 24 août 2018 Dernière intervention - 20 mars 2013 à 08:57
0
Merci
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.
Commenter la réponse de VbNicoG
0
Merci
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
Commenter la réponse de Azhdarz
0
Merci
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
Commenter la réponse de Azhdarz
VbNicoG 120 Messages postés vendredi 27 juin 2008Date d'inscription 24 août 2018 Dernière intervention - 20 mars 2013 à 09:17
0
Merci
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.
Commenter la réponse de VbNicoG
0
Merci
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 ?
Commenter la réponse de Azhdarz
VbNicoG 120 Messages postés vendredi 27 juin 2008Date d'inscription 24 août 2018 Dernière intervention - 20 mars 2013 à 09:35
0
Merci
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.
Commenter la réponse de VbNicoG
0
Merci
Comment fais-je pour obtenir les items actuelles de ma combo ?
Commenter la réponse de Azhdarz
VbNicoG 120 Messages postés vendredi 27 juin 2008Date d'inscription 24 août 2018 Dernière intervention - 20 mars 2013 à 09:53
0
Merci
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
Commenter la réponse de VbNicoG
0
Merci
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 ?
Commenter la réponse de Azhdarz
VbNicoG 120 Messages postés vendredi 27 juin 2008Date d'inscription 24 août 2018 Dernière intervention - 20 mars 2013 à 11:14
0
Merci
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.
Commenter la réponse de VbNicoG
0
Merci
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
Commenter la réponse de Azhdarz

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.