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

Windows Presentation Foundation Discussion :

Listbox liées


Sujet :

Windows Presentation Foundation

  1. #1
    Membre habitué Avatar de mailbox
    Profil pro
    Inscrit en
    Février 2010
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 140
    Points : 159
    Points
    159
    Par défaut Listbox liées
    Bonjour,

    Je cherche à faire un mix de Listbox/Treeview...Mes données sont classées selon une arborescence:


    Et j'aimerai naviguer dans cette arborescence via quelque chose qui ressemble à une listbox:


    En WPF/C#...des idées?

    Voilà à quoi ressemble mon code actuellement mais je n'arrive à faire que deux niveaux de l'arborescence et il y a des bugs donc cette méthode ne semble pas bonne:
    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 void buttonZoomIn_Click(object sender, RoutedEventArgs e)
            {
                if (listBox1.SelectedItem.ToString() == "System.Windows.Controls.ListBoxItem: CAC 40")
                {
                    string fichier = "..\\..\\Resources\\secteurs.txt";
                    createListBox(fichier);
                }
     
                else if (listBox1.SelectedItem.ToString() == "System.Windows.Controls.ListBoxItem: SBF 120")
                {
                    string fichier = "..\\..\\Resources\\srd.txt";
                    createListBox(fichier);
                }
            }

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Renonces-tu à la possibilité de déplier plusieurs noeuds en même temps ?
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    - A
      - a1
      - a2
    + B
    - C
      - c1
      - c2
    Si oui, il s'agit de n ListBox liéés ou le contenu du niveau i dépend de l'item sélectionné dans la listbox de niveau i-1.

    Si tu veux un nombre de niveaux variables, il vaut mieux créer les ListBox dynamiquement, plûtot que par le designer. Une fois la listbox créée, il suffit de recharger les items lorsqu'on qu'on change la sélection.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  3. #3
    Membre habitué Avatar de mailbox
    Profil pro
    Inscrit en
    Février 2010
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 140
    Points : 159
    Points
    159
    Par défaut
    Citation Envoyé par Graffito Voir le message
    Renonces-tu à la possibilité de déplier plusieurs noeuds en même temps ?
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    - A
      - a1
      - a2
    + B
    - C
      - c1
      - c2
    Si oui, il s'agit de n ListBox liéés ou le contenu du niveau i dépend de l'item sélectionné dans la listbox de niveau i-1.

    Si tu veux un nombre de niveaux variables, il vaut mieux créer les ListBox dynamiquement, plûtot que par le designer. Une fois la listbox créée, il suffit de recharger les items lorsqu'on qu'on change la sélection.
    Salut,

    Oui je n'ai pas besoin de déplier plusieurs noeuds en même temps, je voudrai "simplement" naviguer entre ces différents niveaux de ListBox.

    As-tu des exemples?

  4. #4
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Les boutons ZoomIn/zoomOut me semblent inutiles.

    On peut systématiquement réinitialiser la listBox de niveau inférieur avec l'event SelectedIndexChanged de la ListBox.
    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
    private void listBox1_SelectedIndexChanged(object sender, System.EventArgs e)
    {
     string selected1 = listBox1.SelectedItem==null?null:listBox1.SelectedItem.ToString();
     if (listbox2==null) 
     { // en cas de création dynamique des listBox (nombre de niveaux indéterminé)
        // create listbox2 ...
        // initialiser son event listBox2_SelectedIndexChanged
     }
     listbox2.Items.Clear() ;
     if (selected1==null)   
     {
        // Construire les items2 correspondant associés à selected1 ...
        for (int i= 0;i<items.count;i+)  listbox2.items.Add(items2) ;
        listBox1.SelectedIndex=0 ;
     }
    }
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  5. #5
    Membre habitué Avatar de mailbox
    Profil pro
    Inscrit en
    Février 2010
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 140
    Points : 159
    Points
    159
    Par défaut
    Mais comment déclarer mes listBox dans le xaml dans ce cas?

    Car je n'ai qu'une listbox1:
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            <ListBox Grid.Row="2" Margin="20,84,12,142" Name="listBox1"  >
                <ListBoxItem>CAC 40</ListBoxItem>
                <ListBoxItem>SBF 120</ListBoxItem>
            </ListBox>

    Ou dois-je mettre la listBox2?

  6. #6
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Désolé, J'avais pas vu que l'environnement est WPF.
    Voir : http://www.c-sharpcorner.com/uploadf...istbox-in-wpf/
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  7. #7
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour mailbox.
    Bonjour Graffito.De ce que j'ai compris il veut "wrapper" les TreeViewItems dans des listbox.
    Ca n'est pas difficile si tu sais que le controle qui prend en charge l'affichage des diffrents niveaux est Mr. TreeViewItem.
    Come tous les sub-ItemsControles WPF il est tres "versatile" et on peut mettre tout dans son datatemplate ......y compris lui-meme comme "nous l'allons voir tout à l'heure" dirait le fabuliste.
    Voici comment.
    Son HierarchicalDataTemplate attend dans sa prop "visual tree" un DataTemplate.
    Là il suffit de lui "redonner" un TreeViewItem bien astique à ta maniere qui :
    -dispose d'un header binde sur le nom de le class de niveau -N-correspondante(indice,secteur d'activite,etc....)..
    -"wrappe" (enveloppe) un ListBox de ton cru .....et de faire pointer son ItemSource vers la liste habituelle du HierarchicalDataTemplate (deportee de celui-ci ou il faut la supprimer)
    -ajouter bien sur un DataTemplate pour le niveau -N0-
    Ce travail est à faire pour chaque HierarchicalDataTemplate.....
    Et c'est tout.....
    le code exemple:
    code behind du form ou j'ai repris tes class.En plus il y a un checkbox pour agrementer les headers:
    Code c# : 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
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Collections.ObjectModel;
     
    namespace WpfTreeViewWithListBoxCSharp
    {
        /// <summary>
        /// Logique d'interaction pour Window1.xaml
        /// </summary>
        public partial class Window1 : Window
        {
            public Window1()
            {
                InitializeComponent();
            }
        }
     
        //Grande Entreprise
        public class GrandeEntreprise
        {
            private string _name ;
            public string Name { get { return _name; } }
            public GrandeEntreprise(string name)
            { 
                _name = name;
            }
        }
     
        //liste Grande Entreprise
        public class GrandeEntrepriseList:ObservableCollection<GrandeEntreprise>
        {
            public GrandeEntrepriseList()
            {
            }
        }
     
        // secteur activite
        public class SecteurActivite
        {
            private string _name ;
            public string Name { get { return _name; } }
            private GrandeEntrepriseList _GrandeEntreprises;
            public GrandeEntrepriseList GrandeEntreprises { get { return _GrandeEntreprises; } }
            public  SecteurActivite(string name)
                { 
                    _name = name;
                    _GrandeEntreprises = new  GrandeEntrepriseList();
                }
        }
     
        // liste secteur activite
        public class SecteurActiviteList:ObservableCollection<SecteurActivite>
        {
            public  SecteurActiviteList()
            {
            }
        }
     
     // indice
        public class Indice
        {
            private string _name ;
            public string Name { get { return _name; } }
            private SecteurActiviteList _SecteurActivites;
            public SecteurActiviteList SecteurActivites { get { return _SecteurActivites; } }
            public  Indice(string name)
            {
                _name = name;
                _SecteurActivites = new  SecteurActiviteList();
            }
     
     
        }
     
        // liste indices
         public class ListIndice:ObservableCollection<Indice>
        {
            public   ListIndice() 
            {
                Indice l ;
                SecteurActivite d ;
     
                //indice CAC40
                l =new  Indice("CAC40");
                Add(l);
                d = new  SecteurActivite("AeroSpatiale");
                l.SecteurActivites.Add(d);
                d.GrandeEntreprises.Add(new  GrandeEntreprise("EADS"));
                d.GrandeEntreprises.Add(new  GrandeEntreprise("Dassault"));
                d.GrandeEntreprises.Add(new  GrandeEntreprise("ArianeSpace"));
     
                d = new  SecteurActivite("Chimie");
                l.SecteurActivites.Add(d);
                d.GrandeEntreprises.Add(new   GrandeEntreprise("Saint-Gobain"));
                d.GrandeEntreprises.Add(new   GrandeEntreprise("RHONE POULENC"));
                d.GrandeEntreprises.Add(new  GrandeEntreprise("MICHELIN"));
     
                d = new  SecteurActivite("Banques");
                l.SecteurActivites.Add(d);
                d.GrandeEntreprises.Add(new  GrandeEntreprise("PARIBAS"));
                d.GrandeEntreprises.Add(new  GrandeEntreprise("CREDIT LYONNAIS"));
                d.GrandeEntreprises.Add(new  GrandeEntreprise("CREDIT AGRICOLE"));
                d.GrandeEntreprises.Add(new  GrandeEntreprise("CREDIT COMMERCIAL"));
                d.GrandeEntreprises.Add(new  GrandeEntreprise("SOCIETE GENERALE"));
     
                //  indice SRD
                l = new  Indice("SRD");
                Add(l);
                d = new   SecteurActivite("SRD-S1");
                l.SecteurActivites.Add(d);
                d.GrandeEntreprises.Add(new   GrandeEntreprise("SRD-S11"));
                d.GrandeEntreprises.Add(new   GrandeEntreprise("SRD-S12"));
                d.GrandeEntreprises.Add(new  GrandeEntreprise("SRD-S13"));
                d.GrandeEntreprises.Add(new   GrandeEntreprise("SRD-S14"));
                d.GrandeEntreprises.Add(new   GrandeEntreprise("SRD-S15"));
                d.GrandeEntreprises.Add(new   GrandeEntreprise("SRD-S16"));
     
                d = new  SecteurActivite("SRD-S2");
                l.SecteurActivites.Add(d);
                d.GrandeEntreprises.Add(new   GrandeEntreprise("SRD-S21"));
                d.GrandeEntreprises.Add(new   GrandeEntreprise("SRD-S22"));
                d.GrandeEntreprises.Add(new   GrandeEntreprise("SRD-S23"));
                d.GrandeEntreprises.Add(new   GrandeEntreprise("SRD-S24"));
                d.GrandeEntreprises.Add(new   GrandeEntreprise("SRD-S25"));
     
            }
            public Indice this[string name]
            {
                get
                {
                    foreach (Indice l in this)
                        if (l.Name == name)
                            return l;
     
                    return null;
                }
            }
     
        }
    }
    code xaml du form ou j'ai repris tes class:
    Code xaml : 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
     
    <Window x:Class="WpfTreeViewWithListBoxCSharp.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfTreeViewWithListBoxCSharp"
        Title="Window1" Height="300" Width="300">
        <Window.Resources>
            <local:ListIndice x:Key="MyListIndice"/>
            <!--wrapper le "visual tree" du HierarchicalDataTemplate 
            de chaque  niveau N dans un StackPanel "englobant"-->
     
            <!-- niveau N1(class Indice)-->
            <HierarchicalDataTemplate 
                DataType="{x:Type local:Indice}" >
                <StackPanel>
                    <!--un CheckBox decisif pour les choix au dessus du Header-->
                    <CheckBox 
                            Name="chkHeader"
                            Background="YellowGreen" 
                            Foreground="WhiteSmoke"
                            FontSize="10"
                            FontFamily="Times new  Roman" 
                            FontStyle="Italic"
                            Content="{Binding Path=Name}">
                    </CheckBox>
                    <!--ce niveau N(Class Indice) sera wrappe dans un TreeViewItem  habituel 
                    dont le contenu sera affiche par un ListBox
                    Le listbox pointe son ItemsSource sur l'ItemsSource du 
                    HierarchicalDataTemplate qui est deporte ici-->
                    <TreeViewItem 
                        IsExpanded="True"
                        Foreground="Yellow"
                        FontSize="16"
                        FontWeight="Bold"
                        Background="Red" 
                        Header="{Binding Path=Name}">
                        <ListBox 
                            Name="List1"
                            Background="DarkBlue" 
                            Foreground="WhiteSmoke"
                            ItemsSource="{Binding Path=SecteurActivites}">
                        </ListBox>
                    </TreeViewItem>
                </StackPanel>
            </HierarchicalDataTemplate>
     
            <!--idem pour le niveau N2(class Secteur)-->
            <HierarchicalDataTemplate 
                    DataType="{x:Type local:SecteurActivite}"
                    ItemsSource="{Binding Path=GrandeEntrepriseList}">
                <StackPanel>
                    <CheckBox 
                            Name="chkHeader"
                            Background="YellowGreen" 
                            Foreground="WhiteSmoke"
                            FontSize="10"
                            FontFamily="Times new  Roman" 
                            FontStyle="Italic"
                            Content="{Binding Path=Name}">
                    </CheckBox>
                    <TreeViewItem 
                        IsExpanded="True"
                        Foreground="Yellow"
                        FontSize="16"
                        FontWeight="Bold"
                        Background="Red" 
                        Header="{Binding Path=Name}">
                        <!--ScrollViewer visible vertical pour notre listbox
                        reduire la hauteur du ListBox pour le voir-->
                        <!--idem pour largeur-->
                        <ScrollViewer
                            VerticalScrollBarVisibility="Auto">
                            <ListBox
                                x:Name="List1"
                                ScrollViewer.VerticalScrollBarVisibility="Auto"
                                Width="200"
                                Height="50"
                                Background="YellowGreen" 
                                Foreground="WhiteSmoke"
                                ItemsSource="{Binding Path=GrandeEntreprises}">
                            </ListBox>
                        </ScrollViewer>
                    </TreeViewItem>
                </StackPanel>
            </HierarchicalDataTemplate>
            <!--un DataTemplate pour le niveau N0(class GE)-->
            <DataTemplate 
                    DataType="{x:Type local:GrandeEntreprise}">
                <TextBlock 
                        FontSize="12"
                        Foreground="WhiteSmoke"
                        Text="{Binding Path=Name}"/>
            </DataTemplate>
        </Window.Resources>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="*"></RowDefinition>
            </Grid.RowDefinitions>
            <TreeView
                Grid.Row="0"
                x:Name="treeviewBourse"  
                Background="DarkOrange" 
                BorderBrush="RoyalBlue"
                BorderThickness="4" >
                <TreeViewItem 
                    IsExpanded="True"
                    FontSize="16"
                    Foreground="WhiteSmoke"
                    ItemsSource="{Binding Source={StaticResource MyListIndice}}"
                    Header="Indices -de la Deroute -Boursiers 2012" />
            </TreeView>
        </Grid>
    </Window>
    En esperant que cela repond à ton souci........
    bon code............

  8. #8
    Membre habitué Avatar de mailbox
    Profil pro
    Inscrit en
    Février 2010
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 140
    Points : 159
    Points
    159
    Par défaut
    Merci!! J'ai testé ton code à part et c'est ce que je cherchais, encore merci

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

Discussions similaires

  1. [MySQL] Probleme recuperation variable autocompletion listbox liées
    Par Jarod51 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 05/10/2011, 10h09
  2. 2 listbox lies entre eux
    Par swinia dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 29/04/2009, 16h35
  3. Deux listbox liée avec ajout/suppression d'élément
    Par slideveloppeur2006 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 10/10/2008, 16h35
  4. Réponses: 2
    Dernier message: 02/08/2006, 10h25
  5. [C# 2.0] Comment Updater le BindingSource lié à une ListBox ?
    Par vinsou___ dans le forum Accès aux données
    Réponses: 2
    Dernier message: 02/07/2006, 21h14

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