68 votes

Cliquez avec le bouton droit de la souris pour sélectionner une ligne dans un Datagridview et afficher un menu pour la supprimer.

J'ai quelques colonnes dans mon DataGridView, et il y a des données dans mes lignes. J'ai vu quelques solutions ici, mais je ne peux pas les combiner !

Il s'agit simplement d'un moyen de faire un clic droit sur une ligne, de sélectionner toute la ligne et d'afficher un menu avec une option pour supprimer la ligne et, lorsque l'option est sélectionnée, de supprimer la ligne.

J'ai fait quelques tentatives mais aucune ne fonctionne et cela semble désordonné. Que dois-je faire ?

0 votes

Votre question est trop vague. Ajoutez plus de détails là où vous avez un problème. Ce que vous essayez de faire n'est pas très difficile.

117voto

Data-Base Points 1743

J'ai finalement résolu le problème :

  • Dans Visual Studio, créez un ContextMenuStrip avec un élément appelé "DeleteRow".

  • Puis, au niveau du lien DataGridView, le ContextMenuStrip

L'utilisation du code ci-dessous m'a aidé à le faire fonctionner.

this.MyDataGridView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.MyDataGridView_MouseDown);
this.DeleteRow.Click += new System.EventHandler(this.DeleteRow_Click);

Voici la partie la plus cool

private void MyDataGridView_MouseDown(object sender, MouseEventArgs e)
{
    if(e.Button == MouseButtons.Right)
    {
        var hti = MyDataGridView.HitTest(e.X, e.Y);
        MyDataGridView.ClearSelection();
        MyDataGridView.Rows[hti.RowIndex].Selected = true;
    }
}

private void DeleteRow_Click(object sender, EventArgs e)
{
    Int32 rowToDelete = MyDataGridView.Rows.GetFirstRow(DataGridViewElementStates.Selected);
    MyDataGridView.Rows.RemoveAt(rowToDelete);
    MyDataGridView.ClearSelection();
}

0 votes

Bonjour, quel contrôle utilisez-vous dans DeleteRow_Click ?

0 votes

Cette réponse ne semble pas fonctionner lorsqu'un ContextMenuStripNeeded est présent sur la grille. Utilisation de CellMouseDown travaux.

4 votes

Très utile, merci ! Si vous utilisez AllowUserToAddRows vous pouvez vérifier si MyDataGridView.Rows[rowToDelete].IsNewRow avant de faire le RemoveAt() juste au cas où l'utilisateur aurait fait un clic droit sur une nouvelle ligne.

44voto

peteringermany Points 436

Pour que cette question soit complète, il est préférable d'utiliser un événement Grid plutôt que la souris.

Définissez d'abord les propriétés de votre grille de données :

SelectionMode à FullRowSelect et RowTemplate / ContextMenuStrip à un menu contextuel.

Créez l'événement CellMouseDown:-

private void myDatagridView_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        int rowSelected = e.RowIndex;
        if (e.RowIndex != -1)
        {
            this.myDatagridView.ClearSelection();
            this.myDatagridView.Rows[rowSelected].Selected = true;
        }
        // you now have the selected row with the context menu showing for the user to delete etc.
    }
}

0 votes

Cette réponse fonctionne lorsqu'un ContextMenuStripNeeded est présent. Le site MouseDown ne le fait pas.

0 votes

@peter Comment obtenir l'index des lignes si plusieurs lignes sont sélectionnées ?

0 votes

Bonjour vbp, je pense que vous devrez poser une nouvelle question si la réponse n'a pas déjà été donnée, cette question concerne la sélection d'une seule ligne.

3voto

Christian Herz Points 31

Il est beaucoup plus facile d'ajouter seulement l'événement pour le mousedown :

private void MyDataGridView_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        var hti = MyDataGridView.HitTest(e.X, e.Y);
        MyDataGridView.Rows[hti.RowIndex].Selected = true;
        MyDataGridView.Rows.RemoveAt(rowToDelete);
        MyDataGridView.ClearSelection();
    }
}

C'est plus facile. Bien sûr, vous devez initier votre mousedown-event comme déjà mentionné avec :

this.MyDataGridView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.MyDataGridView_MouseDown);

dans votre constructeur.

2voto

Mike de Klerk Points 1606

Toutes les réponses à cette question sont basées sur un événement de clic de souris. Vous pouvez également attribuer un ContenxtMenuStrip à votre DataGridview et vérifier si une ligne est sélectionnée lorsque l'utilisateur Boutons droits de la souris sur le DataGridView et décidez si vous voulez voir le ContenxtMenuStrip ou non. Vous pouvez le faire en définissant l'option CancelEventArgs.Cancel dans le Evénement d'ouverture de la ContextMenuStrip

    private void MyContextMenuStrip_Opening(object sender, CancelEventArgs e)
    {
        //Only show ContextMenuStrip when there is 1 row selected.
        if (MyDataGridView.SelectedRows.Count != 1) e.Cancel = true;
    }

Mais si vous avez plusieurs bandes de menu contextuel, chacune contenant des options différentes, en fonction de la sélection, j'opterais moi aussi pour une approche par clic de souris.

1voto

Nosic Points 11
private void MyDataGridView_MouseDown(object sender, MouseEventArgs e)
{
    if(e.Button == MouseButtons.Right)
    {
        MyDataGridView.ClearSelection();
        MyDataGridView.Rows[e.RowIndex].Selected = true;
    }
}

private void DeleteRow_Click(object sender, EventArgs e)
{
    Int32 rowToDelete = MyrDataGridView.Rows.GetFirstRow(DataGridViewElementStates.Selected);
    MyDataGridView.Rows.RemoveAt(rowToDelete);
    MyDataGridView.ClearSelection();
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X