none
CellMouseClick - anomalie à la sélection RRS feed

  • Question

  • Bonjour,

    J'ai un petit bug qui me fait tourner en rond depuis longtemps.

    J'utilise des DataGridView. Sur ceux-ci, j'utilise l'évènement CellMouseclick pour faire apparaitre un menu contextuel qui a besoin de savoir ce qui est sélectionné.

    Jusque là, tout est OK.

    Mais j'ai remarqué que lorsque je fais un clique-droit directement, je n'ai pas/plus l'effet habituelle qui annule et remplace la sélection précédente par la nouvelle. Les deux se retrouve ainsi sélectionné comme si j'avais appuyé sur la touche contrôle.

    Ce phénomène n'est pas celui que je souhaites bien évidement, d'où mon intervention ici.

    Voici un exemple d'implémentation du MouseClickEvent :

    private void dgv_membres_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
            {
                DataGridView d = (DataGridView)sender;
                ContextMenu c = DataGridViewTool.GenericContextMenu(d, e);
                if (e.Button != MouseButtons.Right && c == null) return;
                c.MenuItems["new"].Click += new EventHandler(AddRecord);
                c.MenuItems["refresh"].Click += new EventHandler(LoadData);
                c.MenuItems["edit"].Click += new EventHandler(Edit);
                c.MenuItems["delete"].Click += new EventHandler(DeleteRecord);
                c.MenuItems["print"].Click += new EventHandler(PrintView);
                c.MenuItems["duplicate"].Click += new EventHandler(Duplicate);
                c.MenuItems["copy"].Click += new EventHandler(Copy);
                c.MenuItems["count"].Click += new EventHandler(Count);
                c.MenuItems["export"].Click += new EventHandler(Export);
                c.MenuItems["search"].Click += new EventHandler(SearchIn);
    
                if (GetSelectedIds().Count() > 1)
                {
                    c.MenuItems["edit"].Visible = false;
                }
    
                c.MenuItems.Add(new MenuItem("-"));
                MenuItem mArchived = new MenuItem("&Archiver / Désarchiver"); mArchived.Name = "reverseArchived"; ;
                mArchived.Click += new EventHandler(reverseArchived);
                c.MenuItems.Add(mArchived);
    
                if (GetSelectedIds().Count() == 1)
                {
                    MenuItem mPret = new MenuItem("&Prêter du matériel"); mPret.Name = "pretDeMateriel"; ;
                    mPret.Click += new EventHandler(preterMateriel);
                    c.MenuItems.Add(mPret);
    
                    c.MenuInscrireViaSaisonAndMembre(GetSelectedIds().First().Item2);
    
                    MenuItem mCompet = new MenuItem("&Analytique Compétitilon"); mCompet.Name = "Acompetition"; ;
                    mCompet.Click += new EventHandler(AnalysisCompet);
                    c.MenuItems.Add(mCompet);
                }
    
                MenuItem c2 = new MenuItem("&Modification par lot");
                c.MenuItems.Add(c2);
    
                MenuItem mSingleBatchCp = new MenuItem("Code Postal"); mSingleBatchCp.Name = "codePostal"; ;
                mSingleBatchCp.Click += new EventHandler(SingleBatchCp);
                c2.MenuItems.Add(mSingleBatchCp);
    
                MenuItem mSingleBatchVille = new MenuItem("Ville"); mSingleBatchVille.Name = "ville"; ;
                mSingleBatchVille.Click += new EventHandler(SingleBatchVille);
                c2.MenuItems.Add(mSingleBatchVille);
    
                MenuItem mSingleBatchBlason = new MenuItem("Blason"); mSingleBatchBlason.Name = "blason"; ;
                mSingleBatchBlason.Click += new EventHandler(SingleBatchBlason);
                c2.MenuItems.Add(mSingleBatchBlason);
    
                c.Display(d, e);
            }

    Voici ce qui se passe en image.

    Avant de faire un clique droit : https://1drv.ms/u/s!AgEbdqIlhPuRkLFxOJry-MtQ_o1NCg

    Après avoir fait un clique droit : https://1drv.ms/u/s!AgEbdqIlhPuRkLF0cJY5eTRqiCyzOw

    Et je souhaiterais le comportement suivant (montage photo) : https://1drv.ms/u/s!AgEbdqIlhPuRkLF1TH-DUhaC2LRa2g

    Bien cordialement à tous,

    Quentin


    Quentin Girandier

    mardi 8 janvier 2019 15:26

Réponses

  • Bonjour Quentin,

    Veuillez consulter la deuxième solution proposée dans ce thread: right click context menu for datagridview.

    Cordialement, 
    Nina


    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    mercredi 9 janvier 2019 14:28
    Modérateur

Toutes les réponses

  • Bonjour Quentin,

    Veuillez consulter la deuxième solution proposée dans ce thread: right click context menu for datagridview.

    Cordialement, 
    Nina


    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    mercredi 9 janvier 2019 14:28
    Modérateur
  • Bonjour,

    Pour être plus précis dans mon cas. J'ai modifié l'idée de base pour

    1) Si une sélection multiple est faite (plusieurs lignes) alors on ne veut pas changer la sélection et juste afficher le menu

    2) Si il n'y a qu'une ligne, on remplace la ligne sélectionné par celle qui est sous le pointeur au moment de l'appel du click droit (mnu contextuel).

    Cela me semble plus intuitif pour l'utilisateur final.

    if (d.SelectedRows.Count == 1)
    {
                    DataGridViewCell c = d[e.ColumnIndex, e.RowIndex];
                    d.ClearSelection();
                    d.CurrentCell = c;
                    c.Selected = true;
    }
    
    if (e.ColumnIndex > -1 && e.RowIndex > -1)
    {
                    Point pCell = d.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true).Location;
                    Point Mouse = new Point(e.X + pCell.X, e.Y + pCell.Y);
                    mnu.Show(d, Mouse);
    }

    Encore merci pour votre aide,

    Bien chaleureusement,

    Quentin


    Quentin Girandier

    jeudi 10 janvier 2019 08:57