背景:最近在项目中有需求需要在DataGridView中添加“删除”、“修改”按钮,用来对数据的操作以及显示。
首先在DataGridView中添加需要的列,此列是用来存放按钮的。
然后在代码中“画”按钮。
if (e.ColumnIndex >= 0 && e.RowIndex >= 0)
{
if (this.dgvwProdCode.Columns[e.ColumnIndex].Name == "act")
{
StringFormat sf = StringFormat.GenericDefault.Clone() as StringFormat;//设置重绘入单元格的字体样式
sf.FormatFlags = StringFormatFlags.DisplayFormatControl;
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Center;
sf.Trimming = StringTrimming.EllipsisCharacter;
e.PaintBackground(e.CellBounds, true);//重绘边框
//设置要写入字体的大小
System.Drawing.Font myFont = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
SizeF sizeDel = e.Graphics.MeasureString("删除", myFont);
SizeF sizeMod = e.Graphics.MeasureString("修改", myFont);
SizeF sizeIsEnable = e.Graphics.MeasureString("启用/禁用", myFont);
float fDel = sizeDel.Width / (sizeDel.Width + sizeMod.Width + sizeIsEnable.Width); //
float fMod = sizeMod.Width / (sizeDel.Width + sizeMod.Width + sizeIsEnable.Width);
float fIsEnable = sizeIsEnable.Width / (sizeDel.Width + sizeMod.Width+ sizeIsEnable.Width);
//设置每个“按钮的边界”
RectangleF rectDel = new RectangleF(e.CellBounds.Left, e.CellBounds.Top, e.CellBounds.Width * fDel, e.CellBounds.Height);
RectangleF rectMod = new RectangleF(rectDel.Right, e.CellBounds.Top, e.CellBounds.Width * fMod, e.CellBounds.Height);
RectangleF rectIsEnable = new RectangleF(rectMod.Right, e.CellBounds.Top, e.CellBounds.Width* fIsEnable, e.CellBounds.Height);
e.Graphics.DrawString("删除", myFont, Brushes.Black, rectDel, sf); //绘制“按钮”
e.Graphics.DrawString("修改", myFont, Brushes.Black, rectMod, sf);
e.Graphics.DrawString("启用/禁用", myFont, Brushes.Black, rectIsEnable, sf);
e.Handled = true;
}
}
以上代码是在DataGridView中可以显示需要的按钮。
使用CellMouseClick方法来去执行事件。
private void dgvwProdCode_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.ColumnIndex >= 0 && e.RowIndex >= 0)
{
Point curPosition = e.Location;//当前鼠标在当前单元格中的坐标
if (this.dgvwProdCode.Columns[e.ColumnIndex].Name == "act")
{
Graphics g = this.dgvwProdCode.CreateGraphics();
System.Drawing.Font myFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
SizeF sizeDel = g.MeasureString("删除", myFont);
SizeF sizeMod = g.MeasureString("修改", myFont);
SizeF sizeIsEnable = g.MeasureString("启用/禁用", myFont);
float fDel = sizeDel.Width / (sizeDel.Width + sizeMod.Width + sizeIsEnable.Width);
float fMod = sizeMod.Width / (sizeDel.Width + sizeMod.Width + sizeIsEnable.Width);
float fIsEnable = sizeIsEnable.Width / (sizeDel.Width + sizeMod.Width + sizeIsEnable.Width);
Rectangle rectTotal = new Rectangle(0, 0, this.dgvwProdCode.Columns[e.ColumnIndex].Width, this.dgvwProdCode.Rows[e.RowIndex].Height);
RectangleF rectDel = new RectangleF(rectTotal.Left, rectTotal.Top, rectTotal.Width * fDel, rectTotal.Height);
RectangleF rectMod = new RectangleF(rectDel.Right, rectTotal.Top, rectTotal.Width * fMod, rectTotal.Height);
RectangleF rectIsEnable = new RectangleF(rectMod.Right, rectTotal.Top, rectTotal.Width * fIsEnable, rectTotal.Height);
//判断当前鼠标在哪个“按钮”范围内
if (rectDel.Contains(curPosition))//删除
{
IProduct product = new ProductImpl();
ProductInfoEntity productInfo = new ProductInfoEntity();
productInfo.recipe = dgvwProdCode.Rows[e.RowIndex].Cells[1].Value.ToString();
if (product.Delete(productInfo) > 0)
{
this.dgvwProdCode.Rows.RemoveAt(e.RowIndex);
MessageBox.Show("删除成功");
}
dgvwProdCode.Refresh();//刷新显示
}
else if (rectMod.Contains(curPosition))//修改
{
// FormProductOperate formProductOperate = new FormProductOperate();
FormProductOperate formProductOperate = FormProductOperate.GetInstance();
formProductOperate.Text = "修改产品";
formProductOperate.btnAdd.Visible = false;
formProductOperate.btnConfirm.Visible = true;
formProductOperate.recipe = dgvwProdCode.Rows[dgvwProdCode.CurrentRow.Index].Cells[1].Value.ToString();
formProductOperate.Show();
dgvwProdCode.Refresh();//刷新显示
}
else if (rectIsEnable.Contains(curPosition))
{
IProduct product = new ProductImpl();
//获取选中产品记录产品id
string recipe = dgvwProdCode.Rows[dgvwProdCode.CurrentRow.Index].Cells[1].Value.ToString();
if (product.UpdateStatus(recipe) > 0)
{
UpDataViewSource();
MessageBox.Show("状态更改成功");
}
}
}
}}
使用CellMouseMove方法
private void dgvwProdCode_CellMouseMove(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.ColumnIndex >= 0 && e.RowIndex >= 0)
{
Point curPosition = e.Location;//当前鼠标在当前单元格中的坐标
if (this.dgvwProdCode.Columns[e.ColumnIndex].Name == "act")
{
this.Cursor = Cursors.Hand;
//解决绘图时画面闪烁
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲
}
}
}
这样在DataGridView中完整的按钮和操作就完成。以及样式上的修改。