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 ?
Version imprimable
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 ?
L'event ItemClicked du menuStrip donne en paramètre l'item clické (e.ClickedItem)
Merci ppphil,
J'ai déclaré 1 méthode :
Ensuite dans une autre méthode je veux testé var.Code:
1
2
3
4
5 private void WhatToolStripMenuItem(object send, ToolStripItemClickedEventArgs e) { ToolStripItemClickedEventArgs var = new ToolStripItemClickedEventArgs(e.ClickedItem); }
Comment fait-on pour appeler cette variable et l'imbriquer dans un switch case ?
Je ne comprends rien à ce que tu veux faire....
Attention var est un mot réservé...
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 :
J'aimerai trouver une solution pour éviter d'écrire 7 méthodes quasi identique.Code:
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"); } }
En effet, il y a juste la propriété du FileSystemRights qui change.
A tous tes ToolStripItem, tu assigne le même gestionnaire Click
Après :
(Enfin c'est du vite écrit. Ce serait mieux avec un switch et tout ça...)Code:
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"); } }
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é ?
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 :
Et dans ma fonction ChangeRights je ne sais pas comment appeler le paramètre ?Code:
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; } }
Code:
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"); } }
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
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.Code:
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. }
Un peu de bon sens et on arrive à quelque chose comme
Et un exemple d'appelCode:
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"); } }
Code:ChangeRights(@"C:\SuperRepertoire\LaClasse", "toto", FileSystemRights.Read);
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 !
evidemment je considère que ton ChangeToFullControl, ChangeToRead, ChangeToWrite sont des constantes ou variables de type stringCode:
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; } } }
C'est parfait, merci les gars.