2010-06-14 9 views
48

J'ai quelques colonnes dans mon DataGridView, et il y a des données dans mes rangées. J'ai vu quelques solutions ici, mais je ne peux pas les combiner!Cliquez avec le bouton droit pour sélectionner une ligne dans une vue Datagrid et afficher un menu pour la supprimer

Simplement un moyen de cliquer avec le bouton droit sur une ligne, elle sélectionnera toute la ligne et affichera un menu avec une option pour supprimer la ligne et lorsque l'option sélectionnée supprimera la ligne.

J'ai fait quelques tentatives mais aucune ne fonctionne et il semble malpropre. Que devrais-je faire?

+0

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. – leppie

Répondre

84

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

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

  • ensuite sur le lien DataGridView le ContextMenuStrip

aide le 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(); 
} 

J'espère que le code aider les autres :-)

Je me félicite de toute correction en cas d'erreur.

+0

Salut quel contrôle utilisez-vous dans DeleteRow_Click? – Crimsonland

+0

yes c'est click –

+0

Cette réponse ne semble pas fonctionner quand un événement 'ContextMenuStripNeeded' est présent sur la grille. L'utilisation de 'CellMouseDown' fonctionne. –

1
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(); 
} 
3

Il est beaucoup plus facile d'ajouter que 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(); 
    } 
} 

Cela est plus facile. De cource vous devez initer votre événement mousedown comme déjà mentionné avec:

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

dans votre constructeur.

28

Pour compléter cette question, mieux vaut utiliser un événement Grid plutôt que la souris.

premier ensemble de vos propriétés DataGrid:

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

Créer 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.Rows[rowSelected].Selected = true; 
     } 
     // you now have the selected row with the context menu showing for the user to delete etc. 
    } 
} 
+0

Cette réponse fonctionne quand un 'ContextMenuStripNeeded' est présent. Les solutions basées sur 'MouseDown' ne le font pas. –

+0

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

+0

Salut vbp, je pense que vous devrez soulever une nouvelle question si pas déjà répondu, cette question se réfère à la sélection de seulement 1 ligne. – peterincumbria

0

Vous pouvez aussi faire un peu plus simple en utilisant les éléments suivants 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

Cela supprimerait simplement la ligne sans avertissement ni confirmation. Je suis sûr que le PO ne le veut pas. – ProfK

0

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

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 ça!

2

Toutes les réponses à cette question sont basées sur un clic de souris. Vous pouvez également affecter un ContenxtMenuStrip à votre DataGridview et vérifier s'il y a une ligne sélectionnée lorsque l'utilisateur RightMouseButtons sur le DataGridView et décider si vous voulez voir le ContenxtMenuStrip ou non. Vous pouvez le faire en définissant la valeur CancelEventArgs.Cancel dans le la Opening event du 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, chacun contenant des options différentes, en fonction de la sélection, je pencherais pour un souris- cliquez-approche moi aussi.

6
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 facile. Pour les cellules personnalisées, modifiez juste un peu.

+1

Meilleure méthode, fonctionne également lorsque vous utilisez uniquement le clavier. Cependant soyez prévenus: ne fonctionne que si une source de données est attachée. MSDN about DataGridView.CellContextMenuStripNeeded Evénement: "L'événement CellContextMenuStripNeeded se produit uniquement lorsque la propriété DataSource DataGridView control est définie ou sa propriété VirtualMode est true." –

+0

Quel est le référencement de la variable 'cmstrip'? – reformed

1
base de

sur @ réponse de la base de données, il ne fonctionnera pas jusqu'à faire le mode de sélection FullRow

MyDataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect; 

mais si vous avez besoin pour 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(); 
} 
0

J'ai une nouvelle solution de contournement à venir dans le même résultat, mais, avec moins de code. pour Winforms ... C'est par exemple est en portugais suivi étape par étape

  1. Créer un ContextMenuStrip dans votre formulaire et créer un élément
  2. signe un événement clic (OnCancelarItem_Click) pour cette ContextMenuStrip enter image description here
  3. Créer un événement « UserDeletingRow » sur gridview enter image description here et maintenant ... vous avez simuler appuyer sur la touche de l'utilisateur del

    vous ne oubliez pas d'activer supprimer sur le gridview, non?!

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