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 Forms Discussion :

Parcours récursif d'un ToolStrip


Sujet :

Windows Forms

  1. #1
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut Parcours récursif d'un ToolStrip
    Bonjour

    Je cherche la plus belle maniere de parcourir TOUS les éléments a tous les niveau d'un Toolstrip

    Une methode récursive me semble de mise ici
    Maintenant je rame un peu pour sub-iterer selon le Type (DropDownButton ou MenuItem)

    Donc comme je me dis que ca pourrait servir a d'autre et que je n'ai pas trouvé d'exemple ici je cree le post en attentant la premiere bonne solution que je continue a chercher
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par olibara Voir le message
    Une methode récursive me semble de mise ici
    Effectivement. L'approche récursive peut causer des débordements de pile sur des hiérarchies très profondes, mais a priori ce n'est pas le cas ici... ou alors l'application sera un cauchemar à utiliser

    Citation Envoyé par olibara Voir le message
    Maintenant je rame un peu pour sub-iterer selon le Type (DropDownButton ou MenuItem)
    Ben c'est pareil, non ? Les deux héritent de ToolStripDropDownItem, qui a une propriété DropDownItems.

    Donc un truc comme ça devrait le faire:

    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
    public IEnumerable<ToolStripItem> EnumerateItems(ToolStripItemCollection items)
    {
        foreach(var item in items)
        {
            yield return item;
     
            var ddItem = item as ToolStripDropDownItem;
            if (ddItem == null)
                continue;
     
            foreach(var subItem in EnumerateItems(ddItem.DropDownItems))
            {
                yield return subItem;
            }
        }
    }
    (pas testé...)

  3. #3
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci TomLev

    Tu m'a mis sur la bonne piste

    Oui je ne pense pas spontanément à tester le null d'un cast
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            var ddItem = item as ToolStripDropDownItem;
            if (ddItem == null) {...}

    Finalement ca donne ca (testé)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        BrowseMenu(toolStripMenu.Items);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
       private static void BrowseMenu(ToolStripItemCollection items)
        {
          foreach (ToolStripItem item in items)
          {
            var ddItem = item as ToolStripDropDownItem;
            if (ddItem == null)
            {
              continue;
            }
            BrowseMenu(ddItem.DropDownItems);
          }
        }
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par olibara Voir le message
    Finalement ca donne ca (testé)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        BrowseMenu(toolStripMenu.Items);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
       private static void BrowseMenu(ToolStripItemCollection items)
        {
          foreach (ToolStripItem item in items)
          {
            var ddItem = item as ToolStripDropDownItem;
            if (ddItem == null)
            {
              continue;
            }
            BrowseMenu(ddItem.DropDownItems);
          }
        }
    Bah là tu parcours les items, mais tu ne fais rien avec... donc ça sert à quoi au final ?

  5. #5
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    On va dire que je chipote mais je prefère dans ce sens qui me semble plus fluide:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    private static void BrowseMenu(ToolStripItemCollection items)
    {
          foreach (ToolStripItem item in items)
          {
            if (item is ToolStripDropDownItem)
            {
                var ddItem = item as ToolStripDropDownItem;
                BrowseMenu(ddItem.DropDownItems);
            }
          }
    }
    Ou tiens, du Linq! Ca faisait longtemps!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    private static void BrowseMenu(ToolStripItemCollection col)
    {
          var items = col.OfType<ToolStripDropDownItem>();
          foreach (var item in items)
          {
                BrowseMenu(item.DropDownItems);
          }
    }

  6. #6
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Citation Envoyé par Tomlev
    Bah là tu parcours les items, mais tu ne fais rien avec... donc ça sert à quoi au final ?
    C'est le parcours qui me posait souci, donc j'ai isolé cette partie de code

    Apres l'objetif c'est d'appeler une methode a chaque Item pour le rendre enable ou visible en fonction de son Nom et d'un parametre utilisateur accessible dans une base de donnée

    Mais ca c'est du gateau
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  7. #7
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci TomLev et PitMaverick78

    Voila me semble-il un petit post a garder sur un coin de table
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par olibara Voir le message
    C'est le parcours qui me posait souci, donc j'ai isolé cette partie de code

    Apres l'objetif c'est d'appeler une methode a chaque Item pour le rendre enable ou visible en fonction de son Nom et d'un parametre utilisateur accessible dans une base de donnée
    Si tu veux faire quelque chose de réutilisable, tu peux passer en paramètre un Action<ToolStripItem>. A partir de ton code, ça donnerait ça :

    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 static void BrowseMenu(ToolStripItemCollection items, Action<ToolStripItem> action)
        {
          foreach (ToolStripItem item in items)
          {
            action(item);
     
            var ddItem = item as ToolStripDropDownItem;
            if (ddItem == null)
            {
              continue;
            }
            BrowseMenu(ddItem.DropDownItems);
          }
        }
    Pour l'utilisation, c'est tout bête. Par exemple, pour afficher le nom de chaque item dans une MessageBox :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BrowseMenu(toolStripMenu.Items, item => MessageBox.Show(item.Name));
    Ou, si l'action à effectuer est un peu longue pour une expression lambda :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    BrowseMenu(toolStripMenu.Items, DoSomething);
     
    ...
     
    void DoSomething(ToolStripItem item)
    {
        ...
    }

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

Discussions similaires

  1. Parcours récursif des répertoires
    Par Prosis dans le forum Langage
    Réponses: 5
    Dernier message: 29/01/2008, 20h39
  2. [XSLT] Parcours récursif d'une liste
    Par Tueur_a_gage dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 15/06/2007, 14h05
  3. Parcours récursif
    Par Tips dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 24/02/2007, 12h27
  4. Parcours récursif d'arborescence
    Par syl2095 dans le forum Linux
    Réponses: 10
    Dernier message: 12/12/2006, 15h09
  5. parcours récursif de dossiers selon un niveau un niveau de profondeur
    Par terminatorsk8 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 21/08/2006, 20h14

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