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 :

Switch Case avec ToolStripMenu


Sujet :

C#

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2010
    Messages : 125
    Par défaut Switch Case avec ToolStripMenu
    Hello,
    J'ai un ToolStripMenu avec 7 méthodes associés.
    J'aimerai récupéré le nom du ToolStripMenuItem cliqué et le tester dans un switch case.

    Comment faire ?

  2. #2
    Membre émérite Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    617
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 617
    Par défaut
    L'event ItemClicked du menuStrip donne en paramètre l'item clické (e.ClickedItem)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2010
    Messages : 125
    Par défaut
    Merci ppphil,
    J'ai déclaré 1 méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    private void WhatToolStripMenuItem(object send, ToolStripItemClickedEventArgs e)
    {
                ToolStripItemClickedEventArgs var = new ToolStripItemClickedEventArgs(e.ClickedItem);
    }
    Ensuite dans une autre méthode je veux testé var.
    Comment fait-on pour appeler cette variable et l'imbriquer dans un switch case ?

  4. #4
    Membre émérite Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    617
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 617
    Par défaut
    Je ne comprends rien à ce que tu veux faire....
    Attention var est un mot réservé...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2010
    Messages : 125
    Par défaut
    Ok, je vais essayé d'être plus clair.
    Je développe une appli contenant 1 TreeView, et 1 ListView.
    Dans le TreeView il y a une arborescence de dossier, sous-dossier.
    Dans le ListView, il y a les permissions relatives aux dossiers sélectionnés.
    Lorsqu'on clique droit dans l'Item du ListView, on peut modifier les droits NTFS.
    Il y a 7 flags soit 7 méthodes (Contrôle Total, Modification, Lecture...)

    Voici par exemple la fonction qui modifie les permissions en Lecture :

    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
     
    private void ChangeToRead_Click(object sender, System.EventArgs e)
    {
           try
           {
                    DirectoryInfo dInfo = new DirectoryInfo(FoldersView.SelectedNode.FullPath);
                    DirectorySecurity dSecurity = dInfo.GetAccessControl();
     
                    dSecurity.SetAccessRuleProtection(true, false);
     
                    string username = this.UserView.SelectedItems[0].Text;
     
                    dSecurity.AddAccessRule(new FileSystemAccessRule(
                        @username,
                        FileSystemRights.Read,
                        InheritanceFlags.ObjectInherit,
                        PropagationFlags.None,
                        AccessControlType.Allow)
                        );
     
                    dInfo.SetAccessControl(dSecurity);
            }
     
           catch (System.UnauthorizedAccessException)
           {
                    MessageBox.Show("Vos droits sont insuffisants", "Erreur");
           }
    }
    J'aimerai trouver une solution pour éviter d'écrire 7 méthodes quasi identique.
    En effet, il y a juste la propriété du FileSystemRights qui change.

  6. #6
    Membre émérite Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    617
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 617
    Par défaut
    A tous tes ToolStripItem, tu assigne le même gestionnaire Click
    Après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private void ToolStripItem_Click(object sender, System.EventArgs e)
    {
      if ((sender is ToolStrimItem) && ((sender as ToolStripItem).Name = "read")) //ou un truc comme ça
      {
        ChangerDroits("read");
      }
    }
    (Enfin c'est du vite écrit. Ce serait mieux avec un switch et tout ça...)
    A la fonction ChangeDroits tu passe le paramètre indiquant les droits à affecter.
    (et aussi évent. le fichier à modifier)...
    Est-ce que ça t'aide ou je suis complètement à côté ?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2010
    Messages : 125
    Par défaut
    C'est tout à fait ça dans l'esprit. J'ai des soucis de syntaxe :
    Operator '&&' cannot be applied to operands of type 'bool' and 'string'
    No overload for method 'ChangeRights' takes '1' arguments

    J'ai fait cela :
    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
     
    private void ToolStripItem_Click(object sender, System.EventArgs e)
    {
                switch((sender is ToolStripItem) && ((sender as ToolStripItem).Name))
                {
                    case ChangeToFullControl:
                    ChangeRights("FullControl");
                    break;
     
                    case ChangeToRead:
                    ChangeRights("Read");
                    break;
     
                    case ChangeToWrite:
                    ChangeRights("Write");
                    break;
                }
    }
    Et dans ma fonction ChangeRights je ne sais pas comment appeler le paramètre ?

    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
     
    private void ChangeRights(object sender, System.EventArgs e)
    {
                try
                {
                    DirectoryInfo dInfo = new DirectoryInfo(FoldersView.SelectedNode.FullPath);
                    DirectorySecurity dSecurity = dInfo.GetAccessControl();
     
                    dSecurity.SetAccessRuleProtection(true, false);
     
                    string username = this.UserView.SelectedItems[0].Text;
     
                    dSecurity.AddAccessRule(new FileSystemAccessRule(
                        @username,
                        FileSystemRights.PARAMETRE,
                        InheritanceFlags.ObjectInherit,
                        PropagationFlags.None,
                        AccessControlType.Allow)
                        );
     
                    dInfo.SetAccessControl(dSecurity);
                }
     
                catch (System.UnauthorizedAccessException)
                {
                    MessageBox.Show("Vos droits sont insuffisants", "Erreur");
                }
    }

  8. #8
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    N'utilise pas de switch pour ça. Le plus simple est un if ... else if ... else.

    L'avantage c'est que si tu renommes pour une raison X ou Y le contrôle en design (càd changer le nom de la variable), ton code sera automatiquement mis à jour et ça continue de compiler (sous Visual Studio en tout cas). Et dans le pire des cas ça plante à la compilation donc tu dois de toute façon corriger.

    Ce ne sera pas le cas si tu fais un switch sur le nom du contrôle (propriété Name). Si tu changes le nom ça compilera toujours, mais à l'exécution ça risque de te péter à la tronche

    Donc je préconiserais plutôt ceci
    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
    if (sender == monToolStrip1)
    {
    }
    else if (sender == monToolStrip2)
    {
    }
    else if (...)
    {
    }
    ...
    else
    {
        // On a oublié de tester un item si on arrive là.
        // Tu peux afficher un message ou lever une exception histoire de savoir
        // qu'il manque quelque chose.
    }
    Sinon pour la méthode ChangeRights le problème c'est simplement qu'elle ne colle plus à ce qu'elle faisait au début et à ce que tu veux lui faire faire maintenant, sans essayer de réfléchir un petit peu.

    Un peu de bon sens et on arrive à quelque chose comme
    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
    private void ChangeRights(string path, string userName, FileSystemRights rights)
    {
                try
                {
                    DirectoryInfo dInfo = new DirectoryInfo(path);
                    DirectorySecurity dSecurity = dInfo.GetAccessControl();
     
                    dSecurity.SetAccessRuleProtection(true, false);
     
                    dSecurity.AddAccessRule(new FileSystemAccessRule(
                        userName,
                        rights,
                        InheritanceFlags.ObjectInherit,
                        PropagationFlags.None,
                        AccessControlType.Allow)
                        );
     
                    dInfo.SetAccessControl(dSecurity);
                }
     
                catch (System.UnauthorizedAccessException)
                {
                    MessageBox.Show("Vos droits sont insuffisants", "Erreur");
                }
    }
    Et un exemple d'appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ChangeRights(@"C:\SuperRepertoire\LaClasse", "toto", FileSystemRights.Read);

  9. #9
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2005
    Messages : 482
    Par défaut
    salut,
    hum, un switch ca ne marche pas comme ca :/
    déja dans ton switch tu es censé mettre une variable et non des tests;
    de plus il me semble que le switch n'accepte que des type simples : int, string double, bool ... (+ les enum...)

    en plus dans ton code tu compares un booléen avec une chaine de caractère :
    je pourrais presque traduire ca par :
    (si c'est une bagnole) et que ("K2000")

    en plus tu appelles une fonction (changeright) qui demande deux arguments en ne lui en filant qu'un seul (et même pas du bon type)

    ChangeRights ressemble beaucoup a un évennement (que je suppose généré par le concepteur) : crée toi ta propre fonction !

    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
     
    private void ToolStripItem_Click(object sender, System.EventArgs e)
    {
    if (sender is ToolStripItem)
    {
                switch(((ToolStripItem)sender).Name)
                {
                    case ChangeToFullControl:
                    MaNouvelleFonctionQuiPrendEnParametreUneString("FullControl");
                    break;
     
                    case ChangeToRead:
                    MaNouvelleFonctionQuiPrendEnParametreUneString("Read");
                    break;
     
                    case ChangeToWrite:
                    MaNouvelleFonctionQuiPrendEnParametreUneString("Write");
                    break;
                }
    }
    }
    evidemment je considère que ton ChangeToFullControl, ChangeToRead, ChangeToWrite sont des constantes ou variables de type string

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2010
    Messages : 125
    Par défaut
    C'est parfait, merci les gars.

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

Discussions similaires

  1. If /Else & Switch case avec plusieurs paramètres
    Par ralek dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 07/07/2010, 20h28
  2. Utilisation du switch/case avec un StreamReader
    Par hellalaboy dans le forum C#
    Réponses: 9
    Dernier message: 27/08/2009, 16h27
  3. switch case avec variable dans case
    Par lematteur dans le forum C
    Réponses: 5
    Dernier message: 17/04/2009, 13h08
  4. switch case avec code généré
    Par hoyohoyo dans le forum Langage
    Réponses: 7
    Dernier message: 27/08/2008, 09h37
  5. Switch case avec expression réguliere
    Par neptunia dans le forum Langage
    Réponses: 5
    Dernier message: 14/03/2008, 13h51

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