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?
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();
}
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.
}
}
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.
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.
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.
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();
}
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();
}
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
vergessen Sie nicht, das Löschen in der Rasteransicht zu aktivieren, oder ?!
Hier können Sie es mit der DataGridView
RowTemplate
-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!
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();
}
}