右键单击selectDatagridview中的一行,并显示一个菜单将其删除

我有我的DataGridView中的几列,并有我的行中的数据。 我在这里看到了几个解决scheme,但是我不能把它们组合起来!

简单地说,右键单击一行,它将select整行,并显示一个选项删除行的选项,当select选项将删除该行。

我做了很less的尝试,但都没有工作,看起来很乱。 我该怎么办?

我终于解决了它:

  • 在Visual Studio中,创build一个名为“DeleteRow”的项目的ContextMenuStrip

  • 然后在DataGridView链接ContextMenuStrip

使用下面的代码帮助我得到它的工作。

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

这是最酷的部分

 private void MyDataGridView_MouseDown(object sender, MouseEventArgs e) { if(e.Button == MouseButtons.Right) { var hti = MyDataGridView.HitTest(eX, eY); 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(); } 

我希望代码能够帮助其他人:-)

如果出现错误,我欢迎任何更正。

为了完善这个问题,最好使用Grid事件而不是鼠标。

首先设置你的数据网格属性:

SelectionMode转换为FullRowSelect和RowTemplate / ContextMenuStrip到上下文菜单。

创buildCellMouseDown事件: –

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

塔达:D。 最简单的方法。 对于自定义单元格只需稍微修改即可

只为mousedown添加事件要容易得多:

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

这很容易。 你必须通过以下方法来启动你的mousedown事件:

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

在你的构造函数。

在这个问题中提出的所有答案都是基于鼠标点击事件。 您还可以将ContenxtMenuStrip分配给您的DataGridview并检查在DataGridView上的用户ContenxtMenuStrip是否有选定的行,并决定是否要查看ContenxtMenuStrip 。 您可以通过在ContextMenuStrip的Opening事件中设置CancelEventArgs.Cancel

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

但是,如果你有几个上下文菜单条,每个包含不同的选项,根据select,我也会自己去一个鼠标点击的方法。

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

基于@ Data-Base的答案,它将不会工作,直到select模式FullRow

  MyDataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect; 

但是如果你需要使它在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(eX, eY); 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) { rowToDelete = e.RowIndex; MyDataGridView.Rows.RemoveAt(rowToDelete); MyDataGridView.ClearSelection(); } } 

看到这里可以使用DataGridView RowTemplate属性来完成。

注意:这段代码没有经过testing,但是我之前使用过这个方法。

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

在那里,你就这么简单!