ContextMenuStrip texte de la cellule cliqué

Signaler
Messages postés
48
Date d'inscription
mercredi 26 décembre 2012
Statut
Membre
Dernière intervention
22 novembre 2015
-
Messages postés
16143
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
5 août 2021
-
Bonjour, je cherche a avoir le texte de la cellule cliqué je n'ai pas réussi a la trouvé la propriété.
Merci

15 réponses

Messages postés
16143
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
5 août 2021
559
Bonjour,

ta question manque un peu de précision, il n'y a pas de cellules dans un contextMenuStrip, mais des menus.
Alors si c'est le texte d'un menu que tu veux alors c'est comme ça:

L'événement Click de ces 3 menus est abonné à la méthode en dessous

Je me sers de l'objet sender, casté en control pour en obtenir la propriété Text
        private void menuToolStripMenuItem_Click(object sender, EventArgs e)
        {
           string monTexte = ((Control)sender).Text;
        }

Messages postés
48
Date d'inscription
mercredi 26 décembre 2012
Statut
Membre
Dernière intervention
22 novembre 2015

Salut ! Merci pour ta réponse.
Alors oui c'est ca que je voulais faire, par contre ton code ne marche pas j'ai du le modifier donc ca donne ça :

string monTexte = ((ToolStripMenuItem)sender).Text;


Mais moi j'utilise l'événement Click pour tout le contextmenustrip et la ca ne marche pas.
Messages postés
16143
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
5 août 2021
559
J'ai transformé ton commentaire (qui est plutôt destiné à la digression sur une réponse) en réponse.
Et plus bas je réponds
Messages postés
16143
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
5 août 2021
559
Mais moi j'utilise l'événement Click pour tout le contextmenustrip et la ca ne marche pas.
C'est normal, par comparaison, si tu as un bouton sur une form et que tu mets le code dans l'événement Click de la form, il ne s'exécutera pas quand tu cliqueras sur le bouton.

Il faut que tu abonnes l'événement Click de chaque ToolStripMenuItem de ton contextmenustrip.
tu peux le faire par le code comme ça:
            foreach (ToolStripMenuItem item in contextMenuStrip1.Items)
                item.Click += new EventHandler(menuToolStripMenuItem_Click);

Messages postés
48
Date d'inscription
mercredi 26 décembre 2012
Statut
Membre
Dernière intervention
22 novembre 2015

Le probleme c'est que je ne peux pas faire l'événement Click de chaque ToolStripMenuItem car les items sont ajoutés a l'ouverture de ma form
Messages postés
16143
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
5 août 2021
559
Je me'n doutais, pourquoi t'avoir mis le code qui abonne les événements avec une boucle sinon?
Messages postés
48
Date d'inscription
mercredi 26 décembre 2012
Statut
Membre
Dernière intervention
22 novembre 2015

J'ai essayé de faire plusieurs choses mais impossible, j'ai quelque chose qui ressemble a ca
http://prntscr.com/3zx3rq
Messages postés
16143
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
5 août 2021
559
Ce serais bien que tu utiles le bouton répondre quand tu réponds et non les commentaires, si la discussion se prolonge se sera illisible sinon.

Merci de poster le code sur le forum, c'est mieux pour les copier coller. Voir ici comment utiliser la coloration syntaxique.
Messages postés
16143
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
5 août 2021
559
Quand à ton image, tu veux abonner les événements click dans la procédure à abonner ça ne peut pas marcher.
AU chargement de ton formulaire, juste après avoir créer tes menus (ou au moment de les créer, il faudrait que tu mettes le code pour que je puisse te dire), c'est là qu'il faut abonner les événements à ta procédure.
Messages postés
48
Date d'inscription
mercredi 26 décembre 2012
Statut
Membre
Dernière intervention
22 novembre 2015

Ok donc la j'ai mis le code au moment ou je créer les items ca donne ca :

private void test()
        {
            
            using (FtpConnection ftp = new FtpConnection(Properties.Settings.Default.ip, "", ""))
            {

                ftp.Open();
                ftp.Login();

                if (ftp.DirectoryExists("/dev_hdd0/GAMES"))
                    ftp.SetCurrentDirectory("/dev_hdd0/GAMES");

                foreach (var dir in ftp.GetDirectories("/dev_hdd0/GAMES"))
                {
                    if (dir.Name.Length > 4)
                    {
                        string s = dir.Name;

                        foreach (ToolStripMenuItem item in contextMenuStrip1.Items)
                            item.Click += new EventHandler(contextMenuStrip1_Click);
                        {
                            contextMenuStrip1.Items.Add(s);
                        }
                    }
                }
            }
        }


Mais j'ai toujours une erreur
Messages postés
16143
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
5 août 2021
559
Ok

on décompose

 using (FtpConnection ftp = new FtpConnection(Properties.Settings.Default.ip, "", ""))
            {

                ftp.Open();
                ftp.Login();

                if (ftp.DirectoryExists("/dev_hdd0/GAMES"))
                    ftp.SetCurrentDirectory("/dev_hdd0/GAMES");
//jusqu'ici tu te connectes à ton serveur ftp et tu récupères une liste de répertoire

                foreach (var dir in ftp.GetDirectories("/dev_hdd0/GAMES"))
                {
                    if (dir.Name.Length > 4)
                    {
                        string s = dir.Name;
//là avec une boucle tu va parcourir ces répertoires et ne traiter que ceux dont la taille dépasse 4 caractères

foreach (ToolStripMenuItem item in contextMenuStrip1.Items)
                            item.Click += new EventHandler(contextMenuStrip1_Click);//maintenant tu abonnes des objets que tu n'as pas encore créé.

                        {
                            contextMenuStrip1.Items.Add(s);//et maintenant tu ajoutes tes menus.
                        }


            


donc c'est bien là qu'il faut agir, mais dans le bon sens

                foreach (var dir in ftp.GetDirectories("/dev_hdd0/GAMES"))
                {
                    if (dir.Name.Length > 4)
                    {
                          ToolStripMenuItem nouveau = new ToolStripMenuItem(dir.Name);//je crée un menu avec le nom du répertoire
                          contextMenuStrip1.Items.Add(nouveau);//j'ajoute le menu au contextmenu
                          nouveau.Click+= new EventHandler(menuToolStripMenuItem_Click);//j'abonne ce menu à la bonne méthode, pas la meme que le click du contexte menu, sinon ça plantera à nouveau
                   }
               }


Messages postés
48
Date d'inscription
mercredi 26 décembre 2012
Statut
Membre
Dernière intervention
22 novembre 2015

D'accord j'essaye avec ton code mais j'ai une erreur ici :

(menuToolStripMenuItem_Click)


C'est une erreur d'événement non ?
Messages postés
16143
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
5 août 2021
559
Et c'est quoi le texte de l'erreur?
Messages postés
48
Date d'inscription
mercredi 26 décembre 2012
Statut
Membre
Dernière intervention
22 novembre 2015

Le nom "(menuToolStripMenuItem_Click)" n'existe pas dans le contexte actuel
Messages postés
16143
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
5 août 2021
559
Oui c'est le nom de ma méthode, que j'ai essayé chez moi....(voir ce message)
Je n'ai pas mis le tien pour bien appuyer le fait qu'il doit s'agir d'une méthode différente de celle qui est abonnée au click du contextmenustrip
Messages postés
48
Date d'inscription
mercredi 26 décembre 2012
Statut
Membre
Dernière intervention
22 novembre 2015

Bon j'ai fais ca :

 foreach (var dir in ftp.GetDirectories("/dev_hdd0/GAMES"))
                {
                    if (dir.Name.Length > 4)
                    {
                        ToolStripMenuItem nouveau = new ToolStripMenuItem(dir.Name);//je crée un menu avec le nom du répertoire
                        contextMenuStrip1.Items.Add(nouveau);//j'ajoute le menu au contextmenu
                        nouveau.Click += new EventHandler(contextMenuStrip1_Click);//j'abonne ce menu à la bonne méthode, pas la meme que le click du contexte menu, sinon ça plantera à nouveau
                    }
                }


Je n'ai pas d'erreur, par contre après comment je peux avoir le texte du menu cliqué ?
Messages postés
16143
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
5 août 2021
559
Et bien tu mets ce code
string monTexte = ((ToolStripMenuItem)sender).Text;
dans la méthode que tu as abonné.
Messages postés
48
Date d'inscription
mercredi 26 décembre 2012
Statut
Membre
Dernière intervention
22 novembre 2015

Donc j'ai fais ca :

foreach (var dir in ftp.GetDirectories("/dev_hdd0/GAMES"))
                {
                    if (dir.Name.Length > 4)
                    {
                        ToolStripMenuItem nouveau = new ToolStripMenuItem(dir.Name);//je crée un menu avec le nom du répertoire
                        contextMenuStrip1.Items.Add(nouveau);//j'ajoute le menu au contextmenu
                        nouveau.Click += new EventHandler(contextMenuStrip1_Click);//j'abonne ce menu à la bonne méthode, pas la meme que le click du contexte menu, sinon ça plantera à nouveau
                        string monTexte = ((ToolStripMenuItem)sender).Text;
                        MessageBox.Show(monTexte);
                    }
                }


Mais j'ai une erreur sur le sender :/
Messages postés
16143
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
5 août 2021
559
J'ai dit dans la méthode que tu as abonné.
Pas dans la méthode ou tu crées l'abonnement.

En mode création, quand tu double cliques sur un bouton, Visual Studio t'envoies dans une méthode toute neuve ou tu mets le code dont tu as besoin quand l'utilisateur cliquera sur le bouton. Et sans sans que tu t'en aperçoive, Visual studio écrit pour toi, le code d'abonnement dans le fichier NomDeMaForm.Designer.cs

Si tu ouvres ce fichier tu verras tout le descriptif de ta form.

La il faut faire de même, à un endroit tu crées te menu et abonne un événement à une méthode spécifique.
C'est dans cette méthode et pas ailleurs que tu dois mettre le code dont tu as besoin pour extraire le texte .

Relis ma première réponse, il y a une méthode dédiée, avec en paramètre un object senseur.
Messages postés
48
Date d'inscription
mercredi 26 décembre 2012
Statut
Membre
Dernière intervention
22 novembre 2015

Je l'ai mis dans cet événement :

private void contextMenuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {
            string monTexte = ((Control)sender).Text;
            MessageBox.Show(monTexte);
        }


Pas d'erreur mais le messagebox est vide
Messages postés
16143
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
5 août 2021
559
Est tu bien sûr que seul les menuitems sont abonnés à cette méthode?
Messages postés
48
Date d'inscription
mercredi 26 décembre 2012
Statut
Membre
Dernière intervention
22 novembre 2015

Je comprends par trop l'histoire d'abonnés
Messages postés
16143
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
5 août 2021
559
C'est la base de la programmation objet.
Il va te falloir les réviser ou les apprendre si tu veux aller plus loin.

Chaque objet envoie des événements à qui veut l'entendre, mais encore faut il que quelque chose écoute.
Messages postés
48
Date d'inscription
mercredi 26 décembre 2012
Statut
Membre
Dernière intervention
22 novembre 2015

C'est juste que j'emploi pas souvent ce genre de vocabulaire
Messages postés
16143
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
5 août 2021
559
Messages postés
48
Date d'inscription
mercredi 26 décembre 2012
Statut
Membre
Dernière intervention
22 novembre 2015

Donc ce code :

string test = ((ToolStripMenuItem)sender).Text;
            MessageBox.Show(test);


il faudrait le mettre ou parce que le messagebox est vide
Messages postés
16143
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
5 août 2021
559
ceci au moment de l'initialisation (le tableau simule la connexion à ton ftp) Attention c'est avec mes noms de contrôle et de méthode.
            string[] noms = { "nom 1", "nom 2", "nom 3" };

            foreach (string n in noms)
            {
                ToolStripMenuItem nouveau = new ToolStripMenuItem(n);
                contextMenuStrip1.Items.Add(nouveau);
                nouveau.Click += new EventHandler(menuToolStripMenuItem_Click);
            }


et la méthode menuToolStripMenuItem_Click
        private void menuToolStripMenuItem_Click(object sender, EventArgs e)
        {
            string monTexte = ((ToolStripMenuItem)sender).Text;
            MessageBox.Show(monTexte);
        }


Ça fonctionne chez moi.

je te conseille de mettre un point d'arrêt à l'initialisation pour voir si les dir.Name ne sont pas vides; et un autre dans la méthode pour regarder le contenu des variables