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 :

disabled un sub menu item depuis une classe


Sujet :

C#

  1. #1
    Invité
    Invité(e)
    Par défaut disabled un sub menu item depuis une classe
    Bonjour

    Depuis le form principal j appelle CacheMenu() dans une lka classe My_Fonctions ajoutée depuis le menu de visual studio afin de rendre disabled un item d un sous menu du menu principal dont le nom est "menu_ouvrir".
    Dans la classe My_Fonctions j ai aussi CachePanels qui fonctionne parfaitement ce qui me fait dire que le form est bien passé.
    Le pb vient donc de mon code que j ai adapté de CachePanels().


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     private static Form1 form = null;
            public Form1()
            {
                InitializeComponent();
                form = this;
                My_Fonctions.CachePanels(form);
                My_Fonctions.CacheMenu(form, "ouvrir");
            }


    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
     public static class My_Fonctions
        {
              public static void CachePanels(Form1 frm)
            {
                foreach (var control in frm.Controls)
                {
                    if (control is Panel)
                    {
                        ((Panel)control).Visible = false;
                    }
                }
            }
     
            public static void CacheMenu(Form1 frm, string nom)
            {
                foreach (var control in frm.Controls)
                {
                    if (control is ToolStripMenuItem)
                    {
                        if (((ToolStripMenuItem)control).Name.ToLower() == "menu_"+nom)
                        {
                            ((ToolStripMenuItem)control).Enabled = false;
                        }
                    }
                }
            }
        }

    Pouvez vous m indiquer s il vous plait où est mon erreur et éventuellement s'il y a une façon plus elegante de coder cette action de façon comprehensible pour un débutant comme moi.
    Je vous en remercie par avance

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 656
    Points : 5 213
    Points
    5 213
    Par défaut
    Déjà, pourquoi déclarer une classe et une méthode statiques si tu te concentre uniquement sur une seule fiche.
    Autant déclarer le code directement dans Form1.

    Ensuite, ton menu n'est pas un contrôle direct de Form1, son parent est un MenuStrip, donc ta boucle ne le trouvera pas.
    Enfin, puisque tu pars de Form1 et que tu ne peux pas avoir deux menu nommé de la même façon, autant y accéder directement plutôt que de boucler sur les contrôles.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci d avoir pris le temps de me répondre

    Citation Envoyé par popo Voir le message
    Déjà, pourquoi déclarer une classe et une méthode statiques si tu te concentre uniquement sur une seule fiche.
    Autant déclarer le code directement dans Form1.
    Parceque je débute et que jh essaie de séparer au maximum mon code pour ne conserver dans le from 1 que la gestion des évènements

    Citation Envoyé par popo Voir le message
    Ensuite, ton menu n'est pas un contrôle direct de Form1, son parent est un MenuStrip, donc ta boucle ne le trouvera pas.
    Enfin, puisque tu pars de Form1 et que tu ne peux pas avoir deux menu nommé de la même façon, autant y accéder directement plutôt que de boucler sur les contrôles.
    Si tu veux dire nomdusousmenu.enabled = false; parce que je souhaite faire quelque chose de générique que je comprendrais si tu ne parles pas de ça dsl, je n ai pas compris
    Dernière modification par Invité ; 07/12/2021 à 20h15. Motif: Ajout des balises [C] … [/C]

  4. #4
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 656
    Points : 5 213
    Points
    5 213
    Par défaut
    Citation Envoyé par AbsoluteRooky Voir le message
    jh essaie de séparer au maximum mon code pour ne conserver dans le from 1 que la gestion des évènements
    La séparation du code est un excellent principe mais il ne faut pas tomber dans l'excès.
    Ici, ce n'est pas vraiment un excès, c'est simplement que tu n'as pas réalisé que tu avais en réalité un événement.
    En effet, ce code masque d'office les panels et ton menu dans le constructeur de ta fiche.
    Si par défaut ces éléments ne doivent pas apparaitre dans la fiche, alors autant les masquer directement via le designer et les afficher au besoin.
    Ce "au besoin" se traduit par un évènement sur ta fiche ou l'un de ses composants et entre donc dans le cadre de la gestion d'évènements de cette fiche.


    Citation Envoyé par AbsoluteRooky Voir le message
    Si tu veux dire nomdusousmenu.enabled = false; parce que je souhaite faire quelque chose de générique que je comprendrais si tu ne parles pas de ça dsl, je n ai pas compris
    C'est exactement ce que je veux dire.
    Faire des boucles pour trouver un composant sur une fiche bien précise est contre productif car si tu connais cette fiche, tu connais ses composants.

    Tu pourrais éventuellement faire un code générique en demandant une instance de Form au lieu de Form1.
    Mais cela va impliquer une hiérarchie et un nommage très stricts des composants de chacune des fiches.

    L'exemple du menu est typique de la complexité d'une telle généricité.
    Ici tu as un unique Menu qui contient une collection de sous menu (dont "ouvrir").
    Et pour y accéder tu dois boucler sur tous les items du menu jusqu'à trouver "menu_ouvrir".

    Mais si tu as un menu "Affichage" avec un sous-menu "Encodage" et des sous-sous menu "UTF-8", "Ansi", etc.
    Pour y accéder tu devras connaître le premier "Affichage" mais également le sous-menu "Encodage", puis enfin retrouver le menu UTF-8.
    Ta procédure devra donc parcourir un certain nombre de sous-menus et de sous-sous menus.
    Tu devras donc avoir une procédure du style My_Fonctions.CacheMenu(form, ["Affichage", "Encodage", "UTF8"]) et parcourir tes menus de manière récursive.
    En plus tu devras veiller à ce que le nom de chaque menu ou sous-menu commence par "menu_".
    C'est très contraignant et cela va être très gourmand en terme de temps et de ressources pour simplement désactiver un menu bien précis dans une fiche bien précise.

    Donc, oui.
    Il est plus simple, plus productif et moins hasardeux (à mon avis) de gérer l'activation ton menu directement dans la fiche qui le contient avec MonMenu.Enabled = false;.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Je te remercie pour cette réponse on ne peut plus détaillée.

    Moi j imaginais plutôt pouvoir accéder à un sous menu avec quelque chose comme ça : menu.items[0].items[1]....

    Alors plutôt que de réinventer la roue, je vais suivre tes conseils en prenant soin de nommer le plus clairement possible mes sous menus.

    Merci encore.

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

Discussions similaires

  1. Comment faire appel à une sub depuis une class vb
    Par Dashil dans le forum VB.NET
    Réponses: 8
    Dernier message: 31/07/2021, 21h48
  2. Réponses: 4
    Dernier message: 08/03/2006, 20h07
  3. acces a uneressource bitmap depuis une classe
    Par firejocker dans le forum MFC
    Réponses: 9
    Dernier message: 03/02/2006, 22h48
  4. Réponses: 14
    Dernier message: 15/12/2005, 19h46
  5. Référence à un objet existant depuis une classe
    Par Adrenalys dans le forum ASP
    Réponses: 2
    Dernier message: 21/07/2005, 01h44

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