web-dev-qa-db-fra.com

Faites un clic droit pour sélectionner une ligne dans une vue de données 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 peu de solutions ici, mais je ne peux pas les combiner!

Un simple moyen de cliquer avec le bouton droit sur une ligne permet de sélectionner la ligne entière et d'afficher un menu avec une option permettant de supprimer la ligne. Lorsque l'option sélectionnée sera sélectionnée, elle supprimera la ligne.

J'ai fait quelques tentatives mais aucune ne fonctionne et ça a l'air sale. Que devrais-je faire?

55
Data-Base

Je l'ai finalement résolu:

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

  • Ensuite, au niveau du 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 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();
}
93
Data-Base

Pour compléter cette question, il est préférable d’utiliser un événement Grid plutôt que de la souris.

Commencez par définir vos propriétés de grille de données:

SelectionMode to FullRowSelect Et RowTemplate/ContextMenuStrip dans 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.
    }
}
31
peterincumbria
private void dgvOferty_CellContextMenuStripNeeded(object sender, DataGridViewCellContextMenuStripNeededEventArgs e)
    {
        dgvOferty.ClearSelection();
        int rowSelected = e.RowIndex;
        if (e.RowIndex != -1)
        {
            this.dgvOferty.Rows[rowSelected].Selected = true;
        }
        e.ContextMenuStrip = cmstrip;
    }

TADA: D. La période la plus simple. Pour les cellules personnalisées, il suffit de modifier un peu.

8
Cooler

Il est beaucoup plus facile d'ajouter uniquement l'événement pour 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 événement de souris comme déjà mentionné avec:

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

dans votre constructeur.

3
Christian Herz

Toutes les réponses à cette question sont basées sur un événement de clic de souris. Vous pouvez également affecter une ContenxtMenuStrip à votre DataGridview et vérifier si une ligne est sélectionnée lorsque l'utilisateur RightMouseButtons sur la DataGridView et décider si vous souhaitez afficher la ContenxtMenuStrip. Vous pouvez le faire en définissant la valeur CancelEventArgs.Cancel dans l'événement Opening 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 différentes options, en fonction de la sélection, je choisirais moi aussi une approche clic-souris.

2
Mike de Klerk

base sur la réponse @ Data-Base cela ne fonctionnera pas tant que le mode de sélection FullRow n’aura pas

  MyDataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;

mais si vous devez le faire fonctionner en mode CellSelect

 MyDataGridView.SelectionMode = DataGridViewSelectionMode.CellSelect;

 // for cell selection
 private void MyDataGridView_MouseDown(object sender, MouseEventArgs e)
 {
  if(e.Button == MouseButtons.Right)
    {
       var hit = MyDataGridView.HitTest(e.X, e.Y);
       MyDataGridView.ClearSelection();

       // cell selection
       MyDataGridView[hit.ColumnIndex,hit.RowIndex].Selected = true;
   }
}

private void DeleteRow_Click(object sender, EventArgs e)
{
   int rowToDelete = MyDataGridView.Rows.GetFirstRow(DataGridViewElementStates.Selected);
   MyDataGridView.Rows.RemoveAt(rowToDelete);
   MyDataGridView.ClearSelection();
}
2
Hisham
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();
}
1
Nosic

J'ai une nouvelle solution de contournement pour arriver au même résultat, mais avec moins de code . Pour Winforms ... Cet exemple est en portugais Suivi étape par étape

  1. Créez un contextMenuStrip dans votre formulaire et créez un élément
  2. Signer un événement clic (OnCancelarItem_Click) pour ce contextMenuStrip  enter image description here
  3. Créez un événement 'UserDeletingRow' sur gridview  enter image description here et maintenant ... vous simulez en appuyant sur la touche del de l'utilisateur

    vous n’oubliez pas d’activer la suppression sur gridview, non?!

 enter image description here  enter image description here et enfin...  enter image description here

0
Marinpietri

Voir ici cela peut être fait en utilisant la propriété DataGridViewRowTemplate.

Remarque: Ce code n'a pas été testé, mais j'ai déjà utilisé cette méthode auparavant.

// Create DataGridView
DataGridView gridView = new DataGridView();
gridView.AutoGenerateColumns = false;
gridView.Columns.Add("Col", "Col");

// Create ContextMenu and set event
ContextMenuStrip cMenu = new ContextMenuStrip();
ToolStripItem mItem = cMenu.Items.Add("Delete");
mItem.Click += (o, e) => { /* Do Something */ };           

// This makes all rows added to the datagridview use the same context menu
DataGridViewRow defaultRow = new DataGridViewRow();
defaultRow.ContextMenuStrip = cMenu;

Et voilà, aussi simple que cela!

0
Zach Johnson

Vous pouvez également simplifier un peu les choses en utilisant ce qui suit dans le code de l'événement:

private void MyDataGridView_MouseDown(object sender, MouseEventArgs e) 
{     
    if (e.Button == MouseButtons.Right)     
    {         
        rowToDelete = e.RowIndex;
        MyDataGridView.Rows.RemoveAt(rowToDelete);         
        MyDataGridView.ClearSelection();     
    } 
}
0
JoBaxter