在界面上放一个ContextMenuStrip1 设置DataGridView的 ContextMenuStrip属性为你添加的Menu,
添加MenuStrip的选项,在MenuStrip选项单击事件里写你需要的操作。
删除行就是dgViewCustom.Rows.Remove(drow);
添加:Data'GridView设为可编辑就可以了
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
一:用contextMenuStrip控件,添加编辑修改右键菜单,然后右键单击菜单弹出编辑修改窗体,把dataGridView的数据上传到窗体,在进行修改
方案二:或者不用右键菜单,在dataGridView上直接修改数据也是可以的
详细分析:
在winfrom编程中我们经常使用
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
格控件DataGridView的行关联快捷菜单(也称为上下文弹出菜单)ContextMenuStrip,基本步骤如下:
在窗体上
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
ContextMenuStrip快捷菜单控件;
设置DataGridView.RowTemplate.ContextMenuStrip属性为指定的快捷菜单;
在菜单弹出前捕获关联事件DataGridView.RowContextMenuStripNeeded,获得当前行与快捷菜单,并做适当处理。
但是,使用其关联事件DataGridView.RowContextMenuStripNeeded有一个重要的前提:“RowContextMenuStripNeeded 事件仅在设置了DataGridView控件的DataSource属性或者该控件的VirtualMode属性为 true 时发生。”(参考MSDN:RowContextMenuStripNeeded 事件)。
此外,上述
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
还有一个不足之处:在非数据行的地方(如:表格列头或行头)不能使用RowTemplate.ContextMenuStrip快捷菜单,也捕获不到事件DataGridView.RowContextMenuStripNeeded事件。
事实上,DataGridView.ContextMenuStrip是控件本身的快捷菜单。本文介绍的定制DataGridView控件,就是直接应用其ContextMenuStrip属性,定制一个快捷菜单关联事件,实现RowTemplate.ContextMenuStrip类似功能。基本思路如下:
重写DataGridView.MouseDown(MouseEventArgs e)方法,捕获鼠标右击事件;
根据事件参数MouseEventArgs的鼠标位置,计算DataGridView当前位置的行号与列号;
定制关联事件ContextMenuStripMenu,在快捷菜单弹出前获取行号、列号与快捷菜单对象对象。
关键技术
捕获鼠标右击位置(坐标),根据该位置计算当前行号与列号,并引发自定义关联事件。如下代码是捕获鼠标右击事件(定制DataGridView控件中的代码):
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
if (e.Button == MouseButtons.Right)
{
if (this.ContextMenuStrip != null && this.ContextMenuStripNeeded != null)
{
int rowIndex = this.GetRowIndexAt(e.Location); // 计算行号
int colIndex = this.GetColIndexAt(e.Location); // 计算列号
ContextMenuStripNeededEventArgs ee; // 事件参数
ee = new ContextMenuStripNeededEventArgs(this.ContextMenuStrip, rowIndex, colIndex);
this.OnContextMenuStripNeeded(ee); // 引发自定义事件,执行事件方法
}
}
}
只有在ContextMenuStrip属性对象非空,以及定制关联事件ContextMenuStripNeeded非空(即有事件注册者)时,才需要计算行列坐标,并由OnContextMenuStripNeeded引发调用事件处理方法。当前鼠标位置的行/列编号计算方法如下:
private int GetColIndexAt(Point mouseLocation)
{
int colIndex = -1;
int colOffset = 0;
int gridWidth = 1;
int padding = 1;
if (this.RowHeadersVisible)
{
colOffset += this.RowHeadersWidth;
padding = 0;
}
if (colOffset + padding < mouseLocation.X) // 超过表列头的范围(不含顶头的边框)
{
int curCol = this.FirstDisplayedScrollingColumnIndex;
for (int k = 0; k <= this.DisplayedColumnCount(true); k++)
{
if (curCol >= this.Columns.Count)
{
break;
}
if (this.Columns[curCol].Visible)
{
colOffset += this.Columns[curCol].Width;
}
if (colOffset + padding + gridWidth > mouseLocation.X) // x为当前边框位置
{
colIndex = curCol;
break;
}
curCol++;
}
}
return colIndex;
}
private int GetRowIndexAt(Point mouseLocation)
{
int rowIndex = -1;
int rowOffset = 0;
int gridWidth = 1;
int padding = 1;
if (this.ColumnHeadersVisible)
{
rowOffset += this.ColumnHeadersHeight;
padding = 0;
}
if (rowOffset + padding < mouseLocation.Y) // 超过表列头的范围(不含顶头的边框)
{
int curRow = this.FirstDisplayedScrollingRowIndex;
for (int k = 0; k <= this.DisplayedRowCount(true); k++)
{
if (curRow >= this.Rows.Count)
{
break;
}
if (this.Rows[curRow].Visible)
{
rowOffset += this.Rows[curRow].Height;
}
if (rowOffset + padding + gridWidth > mouseLocation.Y) // y为当前边框位置
{
rowIndex = curRow;
break;
}
curRow++;
}
}
return rowIndex;
}
代码中,参数mouseLocation来自MouseEventArgs的Location属性,this.FirstDisplayedScrollingRowIndex表示当前显示的第一行的行号,this.DisplayedRowCount(true)获取显示的全部行数,参数true表示要包括最后部分显示的行。
按照惯例,-1表示当前鼠标位置位于所有行或列之外,如:表的列头、行头等地方。