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

C# Discussion :

Recherche dans un TreeView


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2014
    Messages : 13
    Points : 15
    Points
    15
    Par défaut Recherche dans un TreeView
    Bonjour,

    je recherche une fonction de recherche dans un treeview un peu spécifique, je vous explique.

    L'objectif est que l'on a une textbox, un bouton search et la possibilité de rentrer une chaine de caractère, puis sur le clique du bouton le logiciel recherche dans le treeview.

    Nous avons par exemple un treeview comme ceci :
    1. Dev
    1.1 Deve
    1.1.1 Devel
    1.1.2 Bonjour
    1.1.3 Perso
    1.2 Verif
    1.2.1 Lapin
    1.2.2 Derien
    1.2.3 Merci
    2. Coucou
    2.1 Dons
    2.1.1 Develop
    2.1.2 CSharp
    2.1.3 C++
    2.2 Hello
    2.2.1 World
    2.2.2 Foo
    2.2.3 Develap

    Dans la textbox, nous entrons "devel".
    L'objectif est que le treeview affiche :
    1. Dev
    1.1 Deve
    1.1.1 Devel
    2. Coucou
    2.1 Dons
    2.1.1 Develop
    2.2 Hello
    2.2.3 Develap

    L'objectif est donc, vous l'avez compris, de faire une recherche sur le dernier enfant du treeview et qu'il affiche donc tous les pères.

    Pour le moment, voici où j'en suis :
    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
    private List<TreeNode> CurrentNodeMatches = new List<TreeNode>();
            private int LastNodeIndex = 0;
            private string LastSearchText;
     
            private void fbtn_SearchParam_Click(object sender, EventArgs e)
            {
                string searchText = this.ftbx_SearchParam.Text;
     
                if (String.IsNullOrEmpty(searchText))
                    return;
     
                if (LastSearchText != searchText)
                {
                    CurrentNodeMatches.Clear();
                    LastSearchText = searchText;
                    LastNodeIndex = 0;
                    SearchNode(searchText, ftrv_mainTV.Nodes[0]);
                }
     
                if (LastNodeIndex >= 0 && CurrentNodeMatches.Count > 0 && LastNodeIndex < CurrentNodeMatches.Count)
                {
                    TreeNode selectedNode = CurrentNodeMatches[LastNodeIndex];
                    TreeNode[] treeNode = new TreeNode[CurrentNodeMatches.Count];
                    int i = 0;
     
                    foreach (TreeNode tr in CurrentNodeMatches)
                    {
                        treeNode[i] = tr;
                        i++;
                    }
                    LastNodeIndex++;
                    this.ftrv_mainTV.Nodes.Clear();
                    this.ftrv_mainTV.Nodes.AddRange(treeNode);
                }
            }
     
            private void SearchNode(string SearchText, TreeNode StartNode)
            {
                while (StartNode != null)
                {
                    if (StartNode.Text.ToLower().Contains(SearchText.ToLower()))
                    {
                        CurrentNodeMatches.Add(StartNode.Parent.Parent);
                        CurrentNodeMatches.Add(StartNode.Parent);
                        CurrentNodeMatches.Add(StartNode);
                    }
     
                    //Recursive Search
                    if (StartNode.Nodes.Count != 0)
                        SearchNode(SearchText, StartNode.Nodes[0]);
                    StartNode = StartNode.NextNode;
                }
            }
    Merci d'avance pour votre aide !

    Amicalement,
    VincheZ

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Tu sauvegarde tes nodes ? Ou ta recherche est mono utilisation ?
    Comment ça restaure les nœuds une fois qu'il n'y à plus de filtre ?

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2014
    Messages : 13
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par ericlm128 Voir le message
    Tu sauvegarde tes nodes ? Ou ta recherche est mono utilisation ?
    Pour le moment, je ne sauvegarde pas mes nodes donc mono utilisation. J'aimerais d'abord faire en sorte que cela fonctionne, ensuite je mettrai en place le multi.

    Citation Envoyé par ericlm128 Voir le message
    Comment ça restaure les nœuds une fois qu'il n'y à plus de filtre ?
    Aucune restauration pour le moment, je veux juste que la fonction de recherche fonctionne.
    Sinon je pensais mettre en place un tableau permettant de sauvegarder mes nodes et donc de faire un affichage complet lorsqu'il n'y aura plus de filtre.

    L'autre objectif est de supprimer le bouton et de faire un affichage dynamique. C'est à dire que lors de la saisie de l'utilisateur (sur un TextChanged Event de la textbox) l'affichage se mettra à jour.


    Cordialement,
    VincheZ

  4. #4
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Voici un TreeView dérivé.

    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
    public class TreeViewFilter : TreeView
    {
        /// <summary>
        /// Permet de supprimer les nœuds selon les paramètres
        /// </summary>
        /// <param name="level">Niveau des nœuds recherchés</param>
        /// <param name="filter">Texte recherché dans les nœuds</param>
        /// <param name="KeepSubNodes">Conserve les sous-nœuds des nœuds trouvés</param>
        public void FilterNodes(int level, string filter, bool KeepSubNodes)
        {
            BeginUpdate();
            this.Nodes.Cast<TreeNode>().ToList().ForEach(a => FilterNodes(a, level, filter, KeepSubNodes));
            EndUpdate();
        }
     
        private void FilterNodes(TreeNode tn, int level, string filter, bool KeepSubNodes)
        {
            if (tn.Level == level)
            {
                if (tn.Text.IndexOf(filter, StringComparison.InvariantCultureIgnoreCase) == -1)
                    tn.Remove();
                else if (!KeepSubNodes)
                    tn.Nodes.Clear();
            }
            else
            {
                foreach (TreeNode item in tn.Nodes.Cast<TreeNode>().ToList())
                    FilterNodes(item, level, filter, KeepSubNodes);
     
                if (tn.Nodes.Count == 0)
                    tn.Remove();
            }
        }
    }

    J'alimente le TreeViewFilter et je déplie les nœuds.
    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
    treeViewFilter1.Nodes.Add(new TreeNode() { Text = "1. Dev", Name = "1. Dev" });
    treeViewFilter1.Nodes["1. Dev"].Nodes.Add(new TreeNode() { Text = "1.1 Deve", Name = "1.1 Deve" });
    treeViewFilter1.Nodes["1. Dev"].Nodes["1.1 Deve"].Nodes.Add(new TreeNode() { Text = "1.1.1 Devel", Name = "1.1.1 Devel" });
    treeViewFilter1.Nodes["1. Dev"].Nodes["1.1 Deve"].Nodes["1.1.1 Devel"].Nodes.Add(new TreeNode() { Text = "1.1.1.X subDevel1", Name = "1.1.1 subDevel1" });
    treeViewFilter1.Nodes["1. Dev"].Nodes["1.1 Deve"].Nodes["1.1.1 Devel"].Nodes.Add(new TreeNode() { Text = "1.1.1.X subDevel2", Name = "1.1.1 subDevel2" });
     
    treeViewFilter1.Nodes["1. Dev"].Nodes["1.1 Deve"].Nodes.Add(new TreeNode() { Text = "1.1.2 Bonjour", Name = "1.1.2 Bonjour" });
    treeViewFilter1.Nodes["1. Dev"].Nodes["1.1 Deve"].Nodes.Add(new TreeNode() { Text = "1.1.3 Perso", Name = "1.1.3 Perso" });
    treeViewFilter1.Nodes["1. Dev"].Nodes.Add(new TreeNode() { Text = "1.2 Verif", Name = "1.2 Verif" });
    treeViewFilter1.Nodes["1. Dev"].Nodes["1.2 Verif"].Nodes.Add(new TreeNode() { Text = "1.2.1 Lapin", Name = "1.2.1 Lapin" });
    treeViewFilter1.Nodes["1. Dev"].Nodes["1.2 Verif"].Nodes.Add(new TreeNode() { Text = "1.2.2 Derien", Name = "1.2.2 Derien" });
    treeViewFilter1.Nodes["1. Dev"].Nodes["1.2 Verif"].Nodes.Add(new TreeNode() { Text = "1.2.3 Merci", Name = "1.2.3 Merci" });
    treeViewFilter1.Nodes.Add(new TreeNode() { Text = "2. Coucou", Name = "2. Coucou" });
    treeViewFilter1.Nodes["2. Coucou"].Nodes.Add(new TreeNode() { Text = "2.1 Dons", Name = "2.1 Dons" });
    treeViewFilter1.Nodes["2. Coucou"].Nodes["2.1 Dons"].Nodes.Add(new TreeNode() { Text = "2.1.1 Develop", Name = "2.1.1 Develop" });
    treeViewFilter1.Nodes["2. Coucou"].Nodes["2.1 Dons"].Nodes.Add(new TreeNode() { Text = "2.1.2 CSharp", Name = "2.1.2 CSharp" });
    treeViewFilter1.Nodes["2. Coucou"].Nodes["2.1 Dons"].Nodes.Add(new TreeNode() { Text = "2.1.3 C++", Name = "2.1.3 C++" });
    treeViewFilter1.Nodes["2. Coucou"].Nodes.Add(new TreeNode() { Text = "2.2 Hello", Name = "2.2 Hello" });
    treeViewFilter1.Nodes["2. Coucou"].Nodes["2.2 Hello"].Nodes.Add(new TreeNode() { Text = "2.2.1 World", Name = "2.2.1 World" });
    treeViewFilter1.Nodes["2. Coucou"].Nodes["2.2 Hello"].Nodes.Add(new TreeNode() { Text = "2.2.2 Foo", Name = "2.2.2 Foo" });
    treeViewFilter1.Nodes["2. Coucou"].Nodes["2.2 Hello"].Nodes.Add(new TreeNode() { Text = "2.2.3 Develap", Name = "2.2.3 Develap" });
     
    treeViewFilter1.ExpandAll();

    Je filtre.
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    treeViewFilter1.FilterNodes(2, "devel", true);

  5. #5
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    J'ai ajouté une sauvegarde et une restauration, à voir.

    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
    public class TreeViewFilter : TreeView
    {
        private List<TreeNode> NodesSave = new List<TreeNode>();
     
        /// <summary>
        /// Permet de supprimer les nœuds selon les paramètres
        /// </summary>
        /// <param name="level">Niveau des nœuds recherchés</param>
        /// <param name="filter">Texte recherché dans les nœuds</param>
        /// <param name="KeepSubNodes">Conserve les sous-nœuds des nœuds trouvés</param>
        public void FilterNodes(int level, string filter, bool KeepSubNodes)
        {
            BeginUpdate();
            this.Nodes.Cast<TreeNode>().ToList().ForEach(a => FilterNodes(a, level, filter, KeepSubNodes));
            EndUpdate();
        }
     
        private void FilterNodes(TreeNode tn, int level, string filter, bool KeepSubNodes)
        {
            if (tn.Level == level)
            {
                if (tn.Text.IndexOf(filter, StringComparison.InvariantCultureIgnoreCase) == -1)
                    tn.Remove();
                else if (!KeepSubNodes)
                    tn.Nodes.Clear();
            }
            else
            {
                foreach (TreeNode item in tn.Nodes.Cast<TreeNode>().ToList())
                    FilterNodes(item, level, filter, KeepSubNodes);
     
                if (tn.Nodes.Count == 0)
                    tn.Remove();
            }
        }
     
        public void SaveNodes()
        {
            NodesSave = new List<TreeNode>();
            Nodes.Cast<TreeNode>().ToList().ForEach(a => NodesSave.Add((TreeNode)a.Clone()));
        }
     
        public void RestoreNodes()
        {
            BeginUpdate();
            Nodes.Clear();
            NodesSave.Cast<TreeNode>().ToList().ForEach(a => Nodes.Add((TreeNode)a.Clone()));
            EndUpdate();
        }
    }

  6. #6
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2014
    Messages : 13
    Points : 15
    Points
    15
    Par défaut
    Bonjour,

    C'est tout bon !! Tout fonctionne !

    Merci beaucoup pour ton aide !

    Voici comment j'ai utilisé tes fonctions de sauvegarde et de restauration :

    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
    public Form1()
            {
                InitializeComponent();
                treeViewFilter1.Nodes.Add(new TreeNode() { Text = "Test Search", Name = "Test Search" });
                treeViewFilter1.Nodes["Test Search"].Nodes.Add(new TreeNode() { Text = "1. Dev", Name = "1. Dev" });
                treeViewFilter1.Nodes["Test Search"].Nodes["1. Dev"].Nodes.Add(new TreeNode() { Text = "1.1 Deve", Name = "1.1 Deve" });
                treeViewFilter1.Nodes["Test Search"].Nodes["1. Dev"].Nodes["1.1 Deve"].Nodes.Add(new TreeNode() { Text = "1.1.1 Devel", Name = "1.1.1 Devel" });
                treeViewFilter1.Nodes["Test Search"].Nodes["1. Dev"].Nodes["1.1 Deve"].Nodes["1.1.1 Devel"].Nodes.Add(new TreeNode() { Text = "1.1.1.X subDevel1", Name = "1.1.1 subDevel1" });
                treeViewFilter1.Nodes["Test Search"].Nodes["1. Dev"].Nodes["1.1 Deve"].Nodes["1.1.1 Devel"].Nodes.Add(new TreeNode() { Text = "1.1.1.X subDevel2", Name = "1.1.1 subDevel2" });
     
                treeViewFilter1.Nodes["Test Search"].Nodes["1. Dev"].Nodes["1.1 Deve"].Nodes.Add(new TreeNode() { Text = "1.1.2 Bonjour", Name = "1.1.2 Bonjour" });
                treeViewFilter1.Nodes["Test Search"].Nodes["1. Dev"].Nodes["1.1 Deve"].Nodes.Add(new TreeNode() { Text = "1.1.3 Perso", Name = "1.1.3 Perso" });
                treeViewFilter1.Nodes["Test Search"].Nodes["1. Dev"].Nodes.Add(new TreeNode() { Text = "1.2 Verif", Name = "1.2 Verif" });
                treeViewFilter1.Nodes["Test Search"].Nodes["1. Dev"].Nodes["1.2 Verif"].Nodes.Add(new TreeNode() { Text = "1.2.1 Lapin", Name = "1.2.1 Lapin" });
                treeViewFilter1.Nodes["Test Search"].Nodes["1. Dev"].Nodes["1.2 Verif"].Nodes.Add(new TreeNode() { Text = "1.2.2 Derien", Name = "1.2.2 Derien" });
                treeViewFilter1.Nodes["Test Search"].Nodes["1. Dev"].Nodes["1.2 Verif"].Nodes.Add(new TreeNode() { Text = "1.2.3 Merci", Name = "1.2.3 Merci" });
                treeViewFilter1.Nodes["Test Search"].Nodes.Add(new TreeNode() { Text = "2. Coucou", Name = "2. Coucou" });
                treeViewFilter1.Nodes["Test Search"].Nodes["2. Coucou"].Nodes.Add(new TreeNode() { Text = "2.1 Dons", Name = "2.1 Dons" });
                treeViewFilter1.Nodes["Test Search"].Nodes["2. Coucou"].Nodes["2.1 Dons"].Nodes.Add(new TreeNode() { Text = "2.1.1 Develop", Name = "2.1.1 Develop" });
                treeViewFilter1.Nodes["Test Search"].Nodes["2. Coucou"].Nodes["2.1 Dons"].Nodes.Add(new TreeNode() { Text = "2.1.2 CSharp", Name = "2.1.2 CSharp" });
                treeViewFilter1.Nodes["Test Search"].Nodes["2. Coucou"].Nodes["2.1 Dons"].Nodes.Add(new TreeNode() { Text = "2.1.3 C++", Name = "2.1.3 C++" });
                treeViewFilter1.Nodes["Test Search"].Nodes["2. Coucou"].Nodes.Add(new TreeNode() { Text = "2.2 Hello", Name = "2.2 Hello" });
                treeViewFilter1.Nodes["Test Search"].Nodes["2. Coucou"].Nodes["2.2 Hello"].Nodes.Add(new TreeNode() { Text = "2.2.1 World", Name = "2.2.1 World" });
                treeViewFilter1.Nodes["Test Search"].Nodes["2. Coucou"].Nodes["2.2 Hello"].Nodes.Add(new TreeNode() { Text = "2.2.2 Foo", Name = "2.2.2 Foo" });
                treeViewFilter1.Nodes["Test Search"].Nodes["2. Coucou"].Nodes["2.2 Hello"].Nodes.Add(new TreeNode() { Text = "2.2.3 Develap", Name = "2.2.3 Develap" });
     
                treeViewFilter1.ExpandAll();
                treeViewFilter1.SaveNodes();
            }
     
            private void textBoxFilter_TextChanged(object sender, EventArgs e)
            {            
                treeViewFilter1.RestoreNodes();
                treeViewFilter1.FilterNodes(3, textBoxFilter.Text, true);
                treeViewFilter1.ExpandAll();
            }
    J'ai rajouté un "Test Search" pour bien comprendre tout le fonctionnement de la recherche.

    Du coup sur la saisie de l'utilisateur dans le textBoxFilter, la liste est filtrée.


    Encore merci !

  7. #7
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Cool

    Il faut avoir conscience que les nœuds sauvegardé/restauré ne sont plus les mêmes mais sont des copies des originaux.

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

Discussions similaires

  1. [Débutant] recherche dans un treeview avec une clé ou subitem
    Par lucres84 dans le forum VB.NET
    Réponses: 0
    Dernier message: 29/10/2011, 22h32
  2. Afficher les résultats d'une recherche dans un TREEVIEW
    Par buddyMick dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/09/2010, 22h53
  3. Réponses: 2
    Dernier message: 02/07/2009, 09h13
  4. Recherche dans un treeview
    Par Baquardie dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 25/04/2007, 16h39
  5. [VB.NET] Faire une recherche dans une treeview
    Par Aspic dans le forum VB.NET
    Réponses: 3
    Dernier message: 15/11/2005, 19h10

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