web-dev-qa-db-de.com

Klicken Sie mit der rechten Maustaste, um eine Zeile in einem Datagridview auszuwählen, und zeigen Sie ein Menü zum Löschen an

Ich habe wenige Spalten in meiner DataGridView und in meinen Zeilen sind Daten. Ich habe hier nur wenige Lösungen gesehen, aber ich kann sie nicht kombinieren!

Sie können einfach mit der rechten Maustaste auf eine Zeile klicken, die ganze Zeile auswählen und ein Menü mit einer Option zum Löschen der Zeile anzeigen. Wenn die Option ausgewählt ist, wird die Zeile gelöscht.

Ich habe einige Versuche unternommen, aber keiner funktioniert und es sieht unordentlich aus. Was soll ich machen?

55
Data-Base

Ich habe es endlich gelöst:

  • Erstellen Sie in Visual Studio einen ContextMenuStrip mit einem Element namens "DeleteRow".

  • Dann beim DataGridView-Link den ContextMenuStrip

Die Verwendung des folgenden Codes half mir dabei, dass es funktioniert.

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

Hier ist der coole Teil

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

Um diese Frage zu vervollständigen, sollten Sie lieber ein Grid-Ereignis als eine Maus verwenden.

Legen Sie zunächst Ihre Datagrid-Eigenschaften fest:

SelectionMode zu FullRowSelect Und RowTemplate/ContextMenuStrip zu einem Kontextmenü.

Erstellen Sie das CellMouseDown-Ereignis: -

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. Der einfachste Weg. Für benutzerdefinierte Zellen einfach ein wenig ändern.

8
Cooler

Es ist viel einfacher, nur das Event für Mousedown hinzuzufügen:

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

Das ist einfacher. Natürlich müssen Sie Ihr Mousedown-Event wie bereits erwähnt initiieren mit:

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

in Ihrem Konstruktor.

3
Christian Herz

Alle Antworten auf diese Frage basieren auf einem Mausklickereignis. Sie können Ihrer ContenxtMenuStrip auch eine DataGridview zuweisen und prüfen, ob beim Benutzer RightMouseButtons auf der DataGridView eine Zeile ausgewählt ist, und entscheiden, ob Sie die ContenxtMenuStrip anzeigen möchten. Sie können dies tun, indem Sie den CancelEventArgs.Cancel-Wert im Opening-Ereignis der ContextMenuStrip setzen.

    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;
    }

Wenn Sie jedoch über mehrere Kontextmenüstreifen verfügen, die je nach Auswahl unterschiedliche Optionen enthalten, würde ich mich auch für einen Mausklick-Ansatz entscheiden.

2
Mike de Klerk

basierend auf der @ Data-Base-Antwort funktioniert es erst im Auswahlmodus FullRow

  MyDataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;

wenn Sie es jedoch im CellSelect-Modus aktivieren müssen

 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

Ich habe eine neue Problemumgehung, um das gleiche Ergebnis zu erzielen, aber mit weniger Code . Für Winforms ... Das ist beispielsweise Portugiesisch Folgen Sie Schritt für Schritt

  1. Erstellen Sie in Ihrem Formular einen contextMenuStrip und erstellen Sie ein Element
  2. Einen Ereignisklick (OnCancelarItem_Click) für diesen Kontext unterschreibenMenuStrip  enter image description here
  3. Erstellen Sie ein Ereignis 'UserDeletingRow' in gridview  enter image description here und jetzt ... simulieren Sie auf Tastendruck del vom Benutzer

    vergessen Sie nicht, das Löschen in der Rasteransicht zu aktivieren, oder ?!

 enter image description here  enter image description here und schlussendlich...  enter image description here

0
Marinpietri

Hier können Sie es mit der DataGridViewRowTemplate -Eigenschaft tun.

Hinweis: Dieser Code wird nicht getestet, aber ich habe diese Methode bereits verwendet.

// 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;

Und so geht's!

0
Zach Johnson

Sie können dies auch ein wenig vereinfachen, indem Sie im Ereigniscode Folgendes eingeben:

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