IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Cascading Combo Box [Débutant]


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 8
    Par défaut Cascading Combo Box
    Bonjour à tous,

    Je me retrouve face à un petit problème pour compléter des ComboBox en fonction du choix selectionné dans la ComboBox principale. En récupérant les données dans des dictionnary.

    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
     
    ' ComboBoxData.vb
    Public Class ComboBoxData
     
        ' Listing des types de raccordements
        Public Dic_typeRacco As New Dictionary(Of Integer, String) From
        {
            {0, "Aero Souterrain"},
            {1, "Branchement Souterrain"},
            {2, "Branchement Immeuble"},
            {3, "Colonne Montante"},
            {4, "Immeuble de 5 étages <= 44Log"},
            {5, "Immeuble de 7 étages <= 44Log"},
            {6, "Ft pour remplacement d'un CPE"}
        }
     
        ' Liste des prestations pour l'aero souterrain
        Public Dic_typePrestatsAeroSout As New Dictionary(Of Integer, String) From
        {
            {1, "Raccordement unitaire"},
            {2, "2 ≤ nb raccordements ≤ 10"},
            {3, "10 ≤ nb raccordements ≤ 25"},
            {4, "25 < nb raccordements ≤ 50"},
            {5, "50 < nb raccordements ≤ 100"},
            {6, "100 < nb raccordements ≤ 250"},
            {7, "250 < nb raccordements ≤ 500"},
            {8, "Nb raccordements > 500"}
        }
     
        ' Prestations pour un branchement Souterrain
        Public Dic_typePrestatsSout As New Dictionary(Of Integer, String) From
        {
            {1, "Raccordement unitaire"},
            {2, "2 ≤ nb raccordements ≤ 10"},
            {3, "10 ≤ nb raccordements ≤ 25"},
            {4, "25 < nb raccordements ≤ 50"},
            {5, "50 < nb raccordements ≤ 100"},
            {6, "100 < nb raccordements ≤ 250"},
            {7, "250 < nb raccordements ≤ 500"},
            {8, "Nb raccordements > 500"}
        }
     
    ' etc...
     
    End Class

    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
     
    ' IHM.vb
     
    Public Class IHM
     
        Dim cbData As New ComboBoxData
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
            ' Listing des types de raccordements
            infoRacc_typeRacc.DataSource = New BindingSource(cbData.Dic_typeRacco, Nothing)
            infoRacc_typeRacc.DisplayMember = "Value"
            infoRacc_typeRacc.ValueMember = "Key"
     
            Dim selectedItem As String
            selectedItem = infoRacc_typeRacc.SelectedItem.ToString()
            selectedItem = selectedItem.Substring(4, selectedItem.Length - 5)
     
            ' ComboBox n°2 affiche les prestats aero si ComboBox n°1 = aero
            ' Prestations pour un branchement Aero Souterrain
            If selectedItem = cbData.Dic_typeRacco.Item("0") Then
                infoRacc_prestation.DataSource = New BindingSource(cbData.Dic_typePrestatsAeroSout, Nothing)
                infoRacc_typeRacc.DisplayMember = "Value"
                infoRacc_typeRacc.ValueMember = "Key"
            End If
     
            ' Même principe, cb2 = prestas sout si cb1 = sout
            ' Prestations pour un branchement Souterrain
            If selectedItem = cbData.Dic_typeRacco.Item("1") Then
                infoRacc_prestation.DataSource = New BindingSource(cbData.Dic_typePrestatsSout, Nothing)
                infoRacc_typeRacc.DisplayMember = "Value"
                infoRacc_typeRacc.ValueMember = "Key"
            End If
        End Sub
     
        ' etc...
            Private Sub infoRacc_prestation_SelectedIndexChanged_1(sender As System.Object, e As System.EventArgs) Handles infoRacc_prestation.SelectedIndexChanged
            infoRacc_prestation.Items.Clear()
        End Sub
     
    End Class
    Voilà ce code fonctionne plus ou moins certes, mais je préférerais éviter la partie découpage, je suis sûr qu'il y a beaucoup plus simple mais je n'ai pas réussi.

    Second problème, je n'arrive pas à actualiser ma ComboBox n°2 si je change la valeur choisis par la ComboBox n°1.

    Merci d'avance pour le coup de pouce

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Par défaut
    Bonjour,

    Citation Envoyé par kestar Voir le message
    ce code fonctionne plus ou moins certes, mais je préférerais éviter la partie découpage, je suis sûr qu'il y a beaucoup plus simple mais je n'ai pas réussi.
    Qu'entends-tu par là ?

    Citation Envoyé par kestar Voir le message
    Second problème, je n'arrive pas à actualiser ma ComboBox n°2 si je change la valeur choisis par la ComboBox n°1.
    Il faut ajouter l'événement Combobox1.SelectedIndexChanged

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 8
    Par défaut
    J'ai édité mon code pour introduire la partie manquante concernant le refresh de ma ComboBox, je pense que tu me parlais de ca. Après les événements sont nouveaux pour moi pas vraiment sûr d'avoir compris le système xD.

    Sinon pour le découpage je parlais de cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            Dim selectedItem As String
            selectedItem = infoRacc_typeRacc.SelectedItem.ToString()
            selectedItem = selectedItem.Substring(4, selectedItem.Length - 5)
    Ca me gène un peu de laisser ce rafistollage, qui en plus de n'être pas très fiable va être ammené à passer devant d'autres personnes. C'est pour cela que je cherchais un moyen de mettre ce bout de code un peu plus dans les normes et compréhensible pour les personnes qui vont passer après moi .

  4. #4
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour kestar
    Tu as un dico principal qui gere les combox et les dico secondaires....
    Les dico secondaires sont -je presume-utilises pour gerer la partie "metier" proprement dite savoir les types de branchements electriques abonnes....

    Ce que je te suggere pour l'ihm pour eviter une "avenue" de select case -comme celle qui va suivre-vu que ton dico principal comporte actuellement 6 dicos secondaire en maintenant ton design actuel .
    Voici ton code pour rafraichir tes combo en nullifiant les datasources des combo :
    code amenage avec tes donnees initiales:
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
     
     
    'IHM.vb
     
    Public Class frmIHM
     
    	Private cbData As ComboBoxData
    	Public Sub New()
     
    		' This call is required by the designer.
    		InitializeComponent()
     
    		' Add any initialization after the InitializeComponent() call.
     
     
    	End Sub
     
    	Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Me.Load
    		cbData = New ComboBoxData
     
    		' Listing des types de raccordements
     
    		infoRacc_typeRacc.DataSource = New BindingSource(cbData.Dic_typeRacco, Nothing)
    		infoRacc_typeRacc.DisplayMember = "Value"
    		infoRacc_typeRacc.ValueMember = "Key"
     
    		Dim selectedItem As String
    		selectedItem = infoRacc_typeRacc.SelectedItem.ToString()
    		selectedItem = selectedItem.Substring(4, selectedItem.Length - 5)
     
    		'a virer tout ca
    		' ComboBox n°2 affiche les prestats aero si ComboBox n°1 = aero
    		' Prestations pour un branchement Aero Souterrain
    		'If selectedItem = cbData.Dic_typeRacco.Item("0") Then
    		'	ComboBox1.DataSource = New BindingSource(cbData.Dic_typePrestatsAeroSout, Nothing)
    		'	ComboBox1.DisplayMember = "Value"
    		'	ComboBox1.ValueMember = "Key"
    		'End If
     
    		'' Même principe, cb2 = prestas sout si cb1 = sout
    		'' Prestations pour un branchement Souterrain
     
    		'selectedItem = infoRacc_typeRacc.SelectedItem.ToString()
    		'selectedItem = selectedItem.Substring(4, selectedItem.Length - 5)
    		'If selectedItem = cbData.Dic_typeRacco.Item("1") Then
    		'	ComboBox2.DataSource = New BindingSource(cbData.Dic_typePrestatsSout, Nothing)
    		'	ComboBox2.DisplayMember = "Value"
    		'	ComboBox2.ValueMember = "Key"
    		'End If
    	End Sub
     
     
    	Private Sub infoRacc_typeRacc_SelectedValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles infoRacc_typeRacc.SelectedValueChanged
    		If TypeOf (Me.infoRacc_typeRacc.SelectedValue) Is KeyValuePair(Of Integer, String) Then Return
    		Dim ndx As Integer = CType(Me.infoRacc_typeRacc.SelectedValue, Integer)
    		Select Case ndx
    			Case 0
    				Me.ComboBox1.DataSource = Nothing
    				ComboBox1.DataSource = New BindingSource(cbData.Dic_typePrestatsAeroSout, Nothing)
    				ComboBox1.DisplayMember = "Value"
    				ComboBox1.ValueMember = "Key"
    			Case 1
    				Me.ComboBox2.DataSource = Nothing
    				ComboBox2.DataSource = New BindingSource(cbData.Dic_typePrestatsSout, Nothing)
    				ComboBox2.DisplayMember = "Value"
    				ComboBox2.ValueMember = "Key"
    			Case 2
    				'Me.ComboBox3.DataSource = Nothing
    			Case 3
    				'Me.ComboBox4.DataSource = Nothing
    			Case 4
     
    		End Select
    	End Sub
    End Class
    ' ComboBoxData.vb
    Public Class ComboBoxData
    	Public Dic_typeRacco As Dictionary(Of Integer, String)
    	Public Dic_typePrestatsAeroSout As Dictionary(Of Integer, String)
    	Public Dic_typePrestatsSout As New Dictionary(Of Integer, String)
    	Public Sub New()
    		' Listing des types de raccordements
    		Dic_typeRacco = New Dictionary(Of Integer, String) From {
       {0, "Aero Souterrain"},
       {1, "Branchement Souterrain"},
       {2, "Branchement Immeuble"},
       {3, "Colonne Montante"},
       {4, "Immeuble de 5 étages <= 44Log"},
       {5, "Immeuble de 7 étages <= 44Log"},
       {6, "Ft pour remplacement d'un CPE"}
      }
     
     
     
     
    		' Liste des prestations pour l'aero souterrain
    		Dic_typePrestatsAeroSout = New Dictionary(Of Integer, String) From
      {
       {1, "Raccordement unitaire"},
       {2, "2 ≤ nb raccordements ≤ 10"},
       {3, "10 ≤ nb raccordements ≤ 25"},
       {4, "25 < nb raccordements ≤ 50"},
       {5, "50 < nb raccordements ≤ 100"},
       {6, "100 < nb raccordements ≤ 250"},
       {7, "250 < nb raccordements ≤ 500"},
       {8, "Nb raccordements > 500"}
      }
     
    		' Prestations pour un branchement Souterrain
    		Dic_typePrestatsSout = New Dictionary(Of Integer, String) From
      {
       {1, "Raccordement unitaire"},
       {2, "2 ≤ nb raccordements ≤ 10"},
       {3, "10 ≤ nb raccordements ≤ 25"},
       {4, "25 < nb raccordements ≤ 50"},
       {5, "50 < nb raccordements ≤ 100"},
       {6, "100 < nb raccordements ≤ 250"},
       {7, "250 < nb raccordements ≤ 500"},
       {8, "Nb raccordements > 500"}
      }
     
     
    	End Sub
     
     
    End Class
    Une autre approche c'est de stocker la liste des dico secondaires utilises dans le class ComboxData et egalement la liste des combo "secondaires" et "droppes" correspondants utilises dans ton form.
    Dans le Selected_ValueChanged alors on travaille sans l'avenue de "select case" comme le montre cet exemple frmIHM2:

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
     
    Imports System.Collections.Generic
    'IHM.vb
     
    Public Class FrmIHM2
    	'liste des combo droppes
    	Public ListCombo As List(Of ComboBox) = New List(Of ComboBox)
     
    	Private cbData As ComboBoxData2 = New ComboBoxData2
    	Public Sub New()
     
    		' This call is required by the designer.
    		InitializeComponent()
     
    		' Add any initialization after the InitializeComponent() call.
    	End Sub
     
    	Private Sub FrmIHM2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Me.Load
     
    		'recupere les combox droppes
    		For Each ctrl As Control In Me.Controls
    			If TypeOf (ctrl) Is ComboBox Then
    				Dim cbo As ComboBox = CType(ctrl, ComboBox)
    				'saute si c'est pas le bon combo.il n'est pas concerne
    				If cbo.Name = "infoRacc_typeRacc" Then Continue For
    				Me.ListCombo.Add(ctrl)
     
    			End If
     
    		Next
    		' Listing des types de raccordements
     
    		infoRacc_typeRacc.DataSource = New BindingSource(cbData.Dic_typeRacco, Nothing)
    		infoRacc_typeRacc.DisplayMember = "Value"
    		infoRacc_typeRacc.ValueMember = "Key"
     
     
    	End Sub
     
     
    	Private Sub infoRacc_typeRacc_SelectedValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles infoRacc_typeRacc.SelectedValueChanged
    		If TypeOf (Me.infoRacc_typeRacc.SelectedValue) Is KeyValuePair(Of Integer, String) Then Return
    		Dim ndx As Integer = CType(Me.infoRacc_typeRacc.SelectedValue, Integer)
    		'L'AVENUE NETTOYEE 
    		'clear all combo
    		For Each cbo As ComboBox In ListCombo
    			cbo.DataSource = Nothing
    		Next
     
    		If ndx > cbData.ListDict.Count - 1 Then Return 'pas assez de dictionary declares actuelle.(2) 
     
    		Dim currentDict As Dictionary(Of Integer, String) = cbData.ListDict(ndx)
     
    		If ndx > Me.ListCombo.Count - 1 Then Return ' 'pas assez de combo droppes  actuelle.(2) 
    		Dim currentCombo As ComboBox = Me.ListCombo(ndx)
    		currentCombo.DataSource = Nothing
    		currentCombo.DataSource = New BindingSource(currentDict, Nothing)
    		currentCombo.DisplayMember = "Value"
    		currentCombo.ValueMember = "Key"
     
     
    	End Sub
     
     
     
    End Class
    ' ComboBoxData2.vb
    Public Class ComboBoxData2
    	'liste des dictionnaires utilises
    	Public ListDict As List(Of Dictionary(Of Integer, String))
     
    	Public Dic_typeRacco As Dictionary(Of Integer, String)
    	Public Dic_typePrestatsAeroSout As Dictionary(Of Integer, String)
    	Public Dic_typePrestatsSout As New Dictionary(Of Integer, String)
    	Public Sub New()
    		ListDict = New List(Of Dictionary(Of Integer, String))
     
    		' Listing des types de raccordements
    		Dic_typeRacco = New Dictionary(Of Integer, String) From {
    		 {0, "Aero Souterrain"},
    		 {1, "Branchement Souterrain"},
    		 {2, "Branchement Immeuble"},
    		 {3, "Colonne Montante"},
    		 {4, "Immeuble de 5 étages <= 44Log"},
    		 {5, "Immeuble de 7 étages <= 44Log"},
    		 {6, "Ft pour remplacement d'un CPE"}
    		}
     
     
    		' Liste des prestations pour l'aero souterrain
    		Dic_typePrestatsAeroSout = New Dictionary(Of Integer, String) From
    		{
    		 {1, "Raccordement unitaire"},
    		 {2, "2 ≤ nb raccordements ≤ 10"},
    		 {3, "10 ≤ nb raccordements ≤ 25"},
    		 {4, "25 < nb raccordements ≤ 50"},
    		 {5, "50 < nb raccordements ≤ 100"},
    		 {6, "100 < nb raccordements ≤ 250"},
    		 {7, "250 < nb raccordements ≤ 500"},
    		 {8, "Nb raccordements > 500"}
    		}
    		'add to list
    		Me.ListDict.Add(Dic_typePrestatsAeroSout)
     
    		' Prestations pour un branchement Souterrain
    		Dic_typePrestatsSout = New Dictionary(Of Integer, String) From
    		{
    		 {1, "Raccordement unitaire"},
    		 {2, "2 ≤ nb raccordements ≤ 10"},
    		 {3, "10 ≤ nb raccordements ≤ 25"},
    		 {4, "25 < nb raccordements ≤ 50"},
    		 {5, "50 < nb raccordements ≤ 100"},
    		 {6, "100 < nb raccordements ≤ 250"},
    		 {7, "250 < nb raccordements ≤ 500"},
    		 {8, "Nb raccordements > 500"}
    		}
    		'add to list
    		Me.ListDict.Add(Dic_typePrestatsSout)
     
    	End Sub
     
     
    End Class
    BON CODE...................

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 8
    Par défaut
    Merci beaucoup d'avoir pris du temps pour m'aider, ton premier choix me conviens parfaitement j'ai pu faire un truc assez propre. Le second choix à l'air tout aussi intéressant même si j'ai un peu plus de mal à comprendre le fonctionnement, je me pencherai dessus demain.

    Anyway Resolve! et merci encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2010] Combo box en cascade
    Par ultima67 dans le forum IHM
    Réponses: 3
    Dernier message: 16/09/2012, 01h18
  2. Réponses: 2
    Dernier message: 23/06/2004, 13h56
  3. [VB.NET] Choisir les valeurs des items d'un combo box?
    Par Eithelgul dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/06/2004, 10h13
  4. Réponses: 2
    Dernier message: 11/05/2004, 11h17
  5. Combo box et liste de valeurs contenues dans ma table
    Par TieumB dans le forum C++Builder
    Réponses: 14
    Dernier message: 05/04/2004, 18h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo