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 :

[C#.NET2.0] Menu contextuel dans une cellule d'un datagridview


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 46
    Points : 22
    Points
    22
    Par défaut [C#.NET2.0] Menu contextuel dans une cellule d'un datagridview
    Bonjour,

    J'ai un datagridview avec des fichiers listés dedans, dans la 1ere colonne. J'aimerais ajouter un menu contextuel, mais qui serait spécifique a une cellule, et non au datagridview entier (de sorte à editer une valeur concernant seulement le fichier choisi dans la liste).

    Qqun a une idée ?

    Merci d'avance

  2. #2
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 46
    Points : 22
    Points
    22
    Par défaut
    Hm j'ai avancé un peu, j'ai ca pour l'instant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private void myDataGridView_CellContentClick(object sender, DataGridViewMouseEventArgs e)
    {
        if(e.Button == MouseButtons.Right)
        {
              MessageBox.show("Clic Droit !");
        }
     
    }
    Et ca fonctionne ^^
    Maintenant, j'aimerais virer la messagebox, et y mettre un menu contextuel à la place. Comment faire ? :sweat:

  3. #3
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    Salut,

    C'est plutot au niveau des evenements du menu qu'il faut gerer ton probleme
    Regarde ca : DataGridViewRow.ContextMenuStrip, propriété

    tu remplace :

    Citation Envoyé par msdn2
    foreach (DataGridViewColumn column in dataGridView.Columns)
    {

    column.ContextMenuStrip = strip;
    column.ContextMenuStrip.Items.Add(toolStripItem1);
    }
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    dataGridView.Columns[IndexColonne].ContextMenuStrip = strip;
    dataGridView.Columns[IndexColonne].ContextMenuStrip.Items.Add(toolStripItem1);
    et normalment ton probleme sera resolu
    Mehdi Feki : Modérateur .Net

  4. #4
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 46
    Points : 22
    Points
    22
    Par défaut
    Hmm ok je vais tester, maiss si j'ai bien compris ton code, le menu sera relatif à la colonne entiere, et pas à une cellule particulière de cette colonne !

    Moi il me faut un menu contextuel PAR CELLULE, et ce dans la 1ere colonne

  5. #5
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    Citation Envoyé par TheParadoX
    Moi il me faut un menu contextuel PAR CELLULE, et ce dans la 1ere colonne
    Je comprends pas tu veux un menu contextuel different pour chaque cellule de la premiere colonne
    Mehdi Feki : Modérateur .Net

  6. #6
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 46
    Points : 22
    Points
    22
    Par défaut
    Non, le meme, mais il faut qu'il se rapporte à la cellule en question.
    genre si dans la cellule il y a un element "A", que le menu contextuel qui s'affiche ouvre une fonction "fonction(A)"


  7. #7
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    Citation Envoyé par TheParadoX
    Non, le meme, mais il faut qu'il se rapporte à la cellule en question.
    Tu as la reponse. tu recupere la cellule en question lorsque le menu s'ouvre et tu change le texte du menu. Voici le code complet :

    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
    private ToolStripMenuItem toolStripItem1 = new ToolStripMenuItem();
    
    private void Form1_Load(object sender, EventArgs e)
            {
                AddContextMenu();
            }
            private void AddContextMenu()
            {
                toolStripItem1.Click += new EventHandler(toolStripItem1_Click);
                ContextMenuStrip strip = new ContextMenuStrip();
                strip.Opening += new CancelEventHandler(OuvrirStrip);
                dataGridView1.Columns[0].ContextMenuStrip = strip;
               dataGridView1.Columns[0].ContextMenuStrip.Items.Add(toolStripItem1);
            }
    private void toolStripItem1_Click(object sender, EventArgs args)
            {
               //Ton Code
            }
    
    void OuvrirStrip(object sender, CancelEventArgs e)
            {
                int IndexLigne = dataGridView1.CurrentCellAddress.Y;
                object SringCellule = dataGridView1.Rows[IndexLigne].Cells[0].Value as object;
                dataGridView1.Columns[0].ContextMenuStrip.Items[0].Text = SringCellule.ToString();
            }
    Tu remplace biensure as object par le type de la colonne.

    Voila
    Mehdi Feki : Modérateur .Net

  8. #8
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 46
    Points : 22
    Points
    22
    Par défaut
    Merci je vais tenter ca

    En parallele, je suis +/- arrivé a faire ce que je voulais, mais .. je n'en suis pas satisfait. je m'explique:

    Je voulais que la cellule sur laquelle je fais un clic droit devienne selectionnée, et qu'en meme temps, mon menu contextuel s'ouvrait.
    Maintenant, j'ai fait un bidouillage:

    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
     
            // Clic Droit
            private void fenetre_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
            {
                if (e.Button == MouseButtons.Right && e.ColumnIndex == 0)
                {
                    DataGridViewSelectedCellCollection allSelected = fenetre.SelectedCells;
                    foreach(DataGridViewCell tmp in allSelected)
                    {
                        tmp.Selected = false;
                    }
                    fenetre.Rows[e.RowIndex].Cells[0].Selected = true;
                    fenetre.Rows[e.RowIndex].Cells[0].ContextMenuStrip = contextMenuStrip1;
                }
            }
        }
     
    // Action du menu contextuel
            private void einstellungenToolStripMenuItem_Click(object sender, EventArgs e)
            {
                DataGridViewSelectedCellCollection allSelected = fenetre.SelectedCells;
                foreach (DataGridViewCell tmp in allSelected)
                {
                    MessageBox.Show(tmp.Value.ToString());
                }
            }
    "fenetre" est mon datagridView ...

    Mais avec cette solution, il faut cliquer 2 fois du bouton droit pour obtenir un menu contextuel: une fois pour selectionner la cellule, et la deuxiemen fois pour faire afficher le menu...

  9. #9
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    Salut

    tu peux regler ton probleme avec l'evenement CellMouseDown et tu ajoute ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    dataGridView1.CurrentCell = dataGridView1.Rows[ e.RowIndex ].Cells[ e.ColumnIndex ];
    Je te conseille d'utiliser le code que je t'ai fournit, mais si tu trouve ta solution est efficace, dans ce cas tant mieux pour toi
    Mehdi Feki : Modérateur .Net

  10. #10
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 46
    Points : 22
    Points
    22
    Par défaut
    Hm merci, ca allege le code mais il faut toujours cliquer 2 fois ^^
    (a moins que j'aie mal compris: j'ai remplacé mon CellMouseClick par CellMouseDown ... tu me conseillais d'ajouter un cellMouseDown en plus du CellMouseClick ?)

    Je vais tout de meme tenter ton code

  11. #11
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    Citation Envoyé par TheParadoX
    tu me conseillais d'ajouter un cellMouseDown en plus du CellMouseClick ?
    Oui normalment c'est ca
    Mehdi Feki : Modérateur .Net

  12. #12
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 46
    Points : 22
    Points
    22
    Par défaut
    OK j'ai tenté, mais ... ca ne fonctionne qu'une fois que la cellule en question ait ete selectionnée DU BOUTON DROIT une fois ! je m'explique:

    Pour faire marcher le clic droit et selection en meme temps, je selectionne une fois cette cellule DU BOUTON DROIT. Maintenant, je peux la deselectionner, et faire un clic droit dessus, et elle sera selectionnée et le menu aparaitra.

    Mais si je ne l'avais pas selectionnée (ne serait-ce qu'une seule fois) avec un clic droit auparavent, ca ne marche pas d'emblee. Louche, non ?

    En d'autres termes, il faut toujours une selection en clic droit avant de pouvoir fair aparaitre un menu en clic droit.

  13. #13
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    peut-etre que avec un mouseclick ca va causer un probleme de selection,

    Mais avec mon code ca marche à merveil !!

    D'ailleur je ne vais plus insister pour que tu l'utilise
    Mehdi Feki : Modérateur .Net

  14. #14
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 46
    Points : 22
    Points
    22
    Par défaut
    Merci pour ton code, mais il a une chose que je voudrais ajouter: Pourvoir selectionner une cellule avec le clic droit, et sans refaire de clic, que le menu s'ouvre pour la cellule selectionnée.

    Merci en tout cas

  15. #15
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    C'est ptet un peu tard, mais j'ai une autre piste à proposer :
    * ajouter un contexte menu à ta DataGrid.
    * ajouter un handler sur l"évènement "Popup" du menu.
    * quand le menu apparaît, essayer de trouver, en fct de la position de la souris, la cellule clickée.

  16. #16
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    Salut Mose,

    Citation Envoyé par Mose
    C'est ptet un peu tard, mais j'ai une autre piste à proposer :
    * ajouter un contexte menu à ta DataGrid.
    * ajouter un handler sur l"évènement "Popup" du menu.
    * quand le menu apparaît, essayer de trouver, en fct de la position de la souris, la cellule clickée.
    Il veut le menu actif que sur la premiere colonne c'est pour ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    dataGridView1.Columns[0].ContextMenuStrip = strip;
    Sinon pour le reste c'est paraeil à ce que tu propose
    Mehdi Feki : Modérateur .Net

  17. #17
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 46
    Points : 22
    Points
    22
    Par défaut
    Merci à tous

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

Discussions similaires

  1. [WD14] Menu contextuel dans une table
    Par fox1976 dans le forum WinDev
    Réponses: 1
    Dernier message: 29/04/2009, 21h54
  2. Menu contextuel dans une application console
    Par cs_ntd dans le forum C#
    Réponses: 2
    Dernier message: 21/08/2008, 23h21
  3. Menu déroulant dans une cellule
    Par Djohn dans le forum Excel
    Réponses: 2
    Dernier message: 05/02/2008, 20h34
  4. Menu contextuel pour une cellule donnée et non l'ensemble
    Par roudy78 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 17/07/2007, 14h44
  5. Créer un menu contextuel dans une zone de liste
    Par 973thom dans le forum Access
    Réponses: 10
    Dernier message: 13/09/2005, 23h59

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