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 :

Menu Contextuel dans un datagridview


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Menu Contextuel dans un datagridview
    Bonjour

    J'ai l'habitude de jouer avec des ContextMenu sur des PictureBox ou des Pannel

    Jamais sur des DGV

    Dans un picturebox je gere la position de la souris dans les handler d'event Du Contextmenu

    Donc avant de me lancer et (peut etre) faire des erreur je me demandais s'il y avait quelques astuce

    - Comment recuperer la cellule cliquée ? :
    faut il jouer avec la position de la souris ou bien le click dans la cellule du DGV est-il intercepté AVANT l'ouverture du ContextMenu
    - Comment eviter d'ouvrir le ContextMenu sur certaines zones (Header par exemple)

    Dans un PB, je gere une proprieté DisableCtx
    Et j'ai abonné un handler a l'event Opening du Ctx

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          ctxmnuPB.Opening += delegate(object sender, CancelEventArgs args)
          {
            args.Cancel = DisableCtx;
          };
    Donc avant de trop chipoter, si qq a un peu d'expérience a partager sur le sujet, elle est bienvenue

    Merci

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2008
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 337
    Par défaut
    Bonjour ,

    En utilisant l'évènement cellClick tu récupère un argument de type DataGridViewCellEventArgs

    Cette argument contient RowIndex et ColumnIndex qui te permettront de savoir qu'elle cellule a été cliquée.

    Pour ne pas déclenché l'évènement sur les headerCell, il faudra simplement vérifier que e.RowIndex est différent de -1.

    Bonne continuation a+

  3. #3
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Merci mais ce n'est pas si simple !!

    En fait quand le ContexMenu est assigné au Dgv le Open du ContextMenu se fait AVANT le MouseClick

    Une maniere de contourner et d'utiliser l'event CellMouseEnter pour memoriser la position de la cellule courante

  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
    J'ai testé un truc comme ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    private void dgv_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
        {
          if (e.Button == MouseButtons.Right)
          {
            dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].ContextMenuStrip = contextMenuStrip1;
            contextMenuStrip1.Tag = dgv.Rows[e.RowIndex].Cells[e.ColumnIndex];
          }
        }
     
        private void afficherToolStripMenuItem_Click(object sender, EventArgs e)
        {
          MessageBox.Show(((DataGridViewCell)contextMenuStrip1.Tag).Value.ToString());
        }
    C'est peut-être un peu capilo-tracté mais ça fonctionne.
    Ce que je ne sais pas c'est si il y a un autre moyen de récupérer la cellule autrement que de passer par la prop Tag...

  5. #5
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    C'est effectivement un peu capilo-tracté
    Pour partager les idées, Voici en définitive un exemple des méthodes que j'ai mis en place

    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
    29
    30
    31
    32
        // ************************************************************************************************
        private DataRow GetContextRow()
        {
          if (mouseLocation.RowIndex < 0)
          {
            return null;
          }
          DataGridViewRow dRow = dgvResult.Rows[mouseLocation.RowIndex];
          DataRow cRow = ((DataRowView)dRow.DataBoundItem).Row;
          return cRow;
        }
        // ************************************************************************************************
        private void dgvResult_CellMouseEnter(object sender, DataGridViewCellEventArgs location)
        {
          mouseLocation = location;
          DisableCtx = location.ColumnIndex != 1;
        }
        // ************************************************************************************************
        private void ctxMnuDgv_Opening(object sender, CancelEventArgs e)
        {
          if (DisableCtx)
          {
            e.Cancel = DisableCtx;
            return;
          }
          CtxOpenRow = GetContextRow();
          bool isZI = (!CtxOpenRow[C_Match.ZIKEY].Equals(DBNull.Value));
          ctxMnuDgv.Items["TS_RemoveHRK"].Enabled = !isZI;
          ctxMnuDgv.Items["TS_PatchAlias"].Enabled = !isZI;
          ctxMnuDgv.Items["TS_FindHRK"].Enabled = !isZI;
          ctxMnuDgv.Items["TS_NewHRK"].Enabled = !isZI;
        }

  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
    Ou alors comme 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
    17
    18
    19
    20
    21
    22
    DataGridViewCell CtxOpenRow;
     
        private void dgvResult_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
        {
          CtxOpenRow = null;
          if ((e.Button == MouseButtons.Right) && (e.ColumnIndex == 1) && (e.RowIndex >= 0))
          {
            CtxOpenRow = dgvResult.Rows[e.RowIndex].Cells[e.ColumnIndex];
          }
        }
     
        private void ctxMnuDgv_Opening(object sender, CancelEventArgs e)
        {
          if (CtxOpenRow != null)
          {
            bool isZI = (!CtxOpenRow[C_Match.ZIKEY].Equals(DBNull.Value));
            ctxMnuDgv.Items["TS_RemoveHRK"].Enabled = !isZI;
            ctxMnuDgv.Items["TS_PatchAlias"].Enabled = !isZI;
            ctxMnuDgv.Items["TS_FindHRK"].Enabled = !isZI;
            ctxMnuDgv.Items["TS_NewHRK"].Enabled = !isZI;
          }
        }

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

Discussions similaires

  1. [C#.NET2.0] Menu contextuel dans une cellule d'un datagridview
    Par TheParadoX dans le forum Windows Forms
    Réponses: 16
    Dernier message: 28/08/2006, 10h08
  2. Menu contextuel dans un treeview
    Par Racob dans le forum IHM
    Réponses: 2
    Dernier message: 07/06/2006, 22h26
  3. Supprimer la barre de menu contextuel dans un état
    Par soso78 dans le forum Access
    Réponses: 2
    Dernier message: 07/10/2005, 00h05
  4. 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
  5. menu contextuel dans treeview
    Par GAGNON dans le forum IHM
    Réponses: 6
    Dernier message: 08/04/2005, 18h11

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