今天在网上逛的时候,看到了一个童靴提的这个问题,看了帖子,发现楼主最终给出了自己的解决方案,感觉还不错,因此将帖子的内容整理了下,转出来了
解决方案的思路是这样:分别创建三个新的按钮模板列,第一个显示删除图片,第二个显示编辑图片,第三个显示添加图片.看代码
第一个按钮模板列的代码:
using System;
using System.Windows.Forms;
namespace 两列合并重绘列标题头
{
public class DataGridViewButtonColumnDel : DataGridViewColumn
{
public DataGridViewButtonColumnDel()
{
this.CellTemplate = new DataGridViewButtonCellDel();
this.HeaderText = "button";
}
}
}
using System;
using System.Windows.Forms;
using System.Drawing;
namespace 两列合并重绘列标题头
{
public class DataGridViewButtonCellDel : DataGridViewButtonCell
{
protected override void Paint(
Graphics graphics,
Rectangle clipBounds,
Rectangle cellBounds,
int rowIndex,
DataGridViewElementStates cellState,
object value,
object formattedValue,
string errorText,
DataGridViewCellStyle cellStyle,
DataGridViewAdvancedBorderStyle advancedBorderStyle,
DataGridViewPaintParts paintParts)
{
base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);
Image _img = Properties.Resources.imgDelete_x16;
graphics.DrawImage(_img, cellBounds.Location.X + 5, cellBounds.Location.Y+3, _img.Width, _img.Height);
}
}
}
第二个按钮模板列的代码:
using System;
using System.Windows.Forms;
namespace 两列合并重绘列标题头
{
public class DataGridViewButtonColumnEdi : DataGridViewColumn
{
public DataGridViewButtonColumnEdi()
{
this.CellTemplate = new DataGridViewButtonCellEdi();
this.HeaderText = "button";
}
}
}
using System;
using System.Windows.Forms;
using System.Drawing;
namespace 两列合并重绘列标题头
{
public class DataGridViewButtonCellEdi : DataGridViewButtonCell
{
protected override void Paint(
Graphics graphics,
Rectangle clipBounds,
Rectangle cellBounds,
int rowIndex,
DataGridViewElementStates cellState,
object value,
object formattedValue,
string errorText,
DataGridViewCellStyle cellStyle,
DataGridViewAdvancedBorderStyle advancedBorderStyle,
DataGridViewPaintParts paintParts)
{
base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);
Image _img = Properties.Resources.imgEdit_x16;
graphics.DrawImage(_img, cellBounds.Location.X + 5, cellBounds.Location.Y + 3, _img.Width, _img.Height);
}
}
}
第三个按钮模板列的代码:
using System;
using System.Windows.Forms;
namespace 两列合并重绘列标题头
{
public class DataGridViewButtonColumnAdd : DataGridViewColumn
{
public DataGridViewButtonColumnAdd()
{
this.CellTemplate = new DataGridViewButtonCellAdd();
this.HeaderText = "button";
}
}
}
using System;
using System.Windows.Forms;
using System.Drawing;
namespace 两列合并重绘列标题头
{
public class DataGridViewButtonCellAdd : DataGridViewButtonCell
{
protected override void Paint(
Graphics graphics,
Rectangle clipBounds,
Rectangle cellBounds,
int rowIndex,
DataGridViewElementStates cellState,
object value,
object formattedValue,
string errorText,
DataGridViewCellStyle cellStyle,
DataGridViewAdvancedBorderStyle advancedBorderStyle,
DataGridViewPaintParts paintParts)
{
base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);
Image _img = Properties.Resources.imgAdd_x16;
graphics.DrawImage(_img, cellBounds.Location.X + 5, cellBounds.Location.Y + 3, _img.Width, _img.Height);
}
}
}
上面的代码几乎是一样的,就是红色部份载入了不同的图片。
图片是通过资源文件引入项目的。方法是:打开资源管理器,展开“Properties”节点(这个节点默认是隐藏的)。双击Resources.resx,点击"添加资源",选择“添加现有资源”;添加三张图片:imgDelete_x16.png,imgEdit_x16,imgAdd_x16.png,
之后在form1上拖一个DataGridView1,给DataGridView1手动添加两列,分别是上面创建的DataGridViewButtonColumnDel,DataGridViewButtonCellEdi 这两个按钮模板列,ID分别为Column1,Column2;
form1的后台代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace 两列合并重绘列标题头
{
public partial class Form1 : Form
{
int top = 0;
int left = 0;
int height = 0;
int width1 = 0;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
BindDataGridView();
HideCheckBoxCotrol();
HideCheckBoxCotrol1();
}
/// <summary>
/// 给DataGridView绑定测试数据
/// </summary>
private void BindDataGridView()
{
DataTable dt = new DataTable();
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Age", typeof(string));
for (int i = 0; i < 5; i++)
{
DataRow dr = dt.NewRow();
dr[0] = i.ToString();
dr[1] = i.ToString();
dt.Rows.Add(dr);
}
this.dataGridView1.DataSource = dt.DefaultView;
}
/// <summary>
/// 把第一列和第二列的头部重绘一下,绘成一个表头
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
#region 重绘datagridview表头
DataGridView dgv = (DataGridView)(sender);
if (e.RowIndex == -1 && (e.ColumnIndex == 0 || e.ColumnIndex == 1))
{
if (e.ColumnIndex == 0)
{
top = e.CellBounds.Top;
left = e.CellBounds.Left;
height = e.CellBounds.Height;
width1 = e.CellBounds.Width;
}
int width2 = this.dataGridView1.Columns[1].Width;
Rectangle rect = new Rectangle(left, top, width1 + width2, e.CellBounds.Height);
using (Brush backColorBrush = new SolidBrush(e.CellStyle.BackColor))
{
//抹去原来的cell背景
e.Graphics.FillRectangle(backColorBrush, rect);
}
using (Pen pen = new Pen(Color.White))
{
e.Graphics.DrawLine(pen, left + 1, top + 1, left + width1 + width2 - 1, top + 1);
}
using (Pen gridLinePen = new Pen(dgv.GridColor))
{
e.Graphics.DrawLine(gridLinePen, left, top, left + width1 + width2, top);
e.Graphics.DrawLine(gridLinePen, left, top + height - 1, left + width1 + width2, top + height - 1);
e.Graphics.DrawLine(gridLinePen, left, top, left, top + height);
e.Graphics.DrawLine(gridLinePen, left + width1 + width2 - 1, top, left + width1 + width2 - 1, top + height);
//计算绘制字符串的位置
string columnValue = "";
SizeF sf = e.Graphics.MeasureString(columnValue, e.CellStyle.Font);
float lstr = (width1 + width2 - sf.Width) / 2;
float rstr = (height / 2 - sf.Height);
//画出文本框
if (columnValue != "")
{
e.Graphics.DrawString(columnValue, e.CellStyle.Font,
new SolidBrush(e.CellStyle.ForeColor),
left + lstr,
top + rstr,
StringFormat.GenericDefault);
}
}
e.Handled = true;
}
#endregion
}
/// <summary>
/// 最后一行的第一列单元格中的DataGridViewButtonColumnDel按钮模板换
/// 成系统的DataGridViewButtonCellAdd
/// </summary>
private void HideCheckBoxCotrol()
{
DataGridViewButtonCellAdd dvcType1 = new DataGridViewButtonCellAdd();
dataGridView1.Rows[5].Cells["Column1"] = dvcType1;
}
/// <summary>
/// 最后一行的第二列单元格中的DataGridViewButtonColumnEdi按钮模板换
/// 成系统的DataGridViewTextBoxCell
/// </summary>
private void HideCheckBoxCotrol1()
{
DataGridViewCell dvcType = new DataGridViewTextBoxCell();
dataGridView1.Rows[5].Cells["Column2"] = dvcType;
}
}
}
分享到:
相关推荐
在C#的WinForm中,DataGridView控件是一种常见的控件,用于显示和编辑表格数据。下面将对DataGridView控件的操作进行汇总。 一、单元格内容的操作 在DataGridView控件中,可以通过CurrentCell属性来获取当前单元格...
在Windows Forms(Winform)开发中,`DataGridView`控件是一种常用的数据展示工具,它可以方便地展示表格数据并提供交互功能。在这个特定的场景中,我们关注的是如何在`DataGridView`的表头添加一个`CheckBox`,以便...
在实际应用中,我们有时需要在`DataGridView`的每一行中添加一个`Button`列,以便用户可以执行特定操作。本文将深入探讨如何在`DataGridView`中实现这个功能,并详细讲解如何根据需求禁用特定的`Button`。 首先,...
要在DataGridView中添加按钮列,首先需要在设计时或运行时创建一个DataGridViewTextBoxColumn对象,然后将其设置为DataGridViewButtonColumn类型。例如: ```csharp DataGridViewButtonColumn buttonColumn = ...
通过对以上知识点的学习,我们可以看到在C# Winform应用程序中使用DataGridView控件进行数据展示和操作的灵活性。无论是获取或设置单元格内容,还是设置只读属性,甚至是修改行头列头的显示内容,DataGridView都提供...
当你需要创建一个界面,其中用户可以对数据进行单选操作时,可以在`DataGridView`中添加`CheckBox`列来实现这一功能。本篇文章将详细讲解如何在`DataGridView`中设置`CheckBox`列并确保用户只能进行单选。 首先,...
根据给定的信息,本文将对C# WinForm开发中DataGridView控件的各种操作进行详细总结,主要包括单元格操作、属性设置等内容。 ### 一、获取当前单元格信息 在C# WinForm开发中,通过`DataGridView`控件可以方便地...
在Windows Forms应用程序开发中,`DataGridView` 是一个非常强大的数据展示控件,它能够以表格的形式展示数据,并支持多种高级特性如排序、筛选、编辑等。本文将详细介绍`DataGridView`的一些常见用法及其配置方法。...
代码示例演示如何自定义 ... 为了演示此新单元格类型和列类型,父 DataGridView 中的每个 DataGridViewCheckBoxCell 的当前值确定同一行中 DataGridViewDisableButtonCell 的 Enabled 属性是 true 还是 false。
2. 在Form上添加必要的控件,如两个Button(上一页、下一页)、一个Label(当前页码)、一个Label(总页数)、一个TextBox(用户输入页码)和一个NumericUpDown(每页条数)。 3. 为Button的Click事件添加事件处理...
1.在解决方案中添加现有项目DLLFullPrint,然后在主工程中添加引用,引用这个项目。 2.在界面设计中,添加按钮PrintButton,双击它进入代码界面; 在代码文件中,首先使用using DLLFullPrint; 然后按钮点击事件中...
总结,C# WinForm DataGridView 控件的高级特性使其成为一个强大而灵活的工具,能够处理复杂的数据展示和交互需求。开发者可以通过深入理解这些特性,构建出功能丰富、用户体验优良的桌面应用程序。
DataGridView 是一个强大的控件,广泛应用于Windows Forms 应用程序中,用于显示和编辑表格数据。在实际开发中,DataGridView 的属性和方法的正确使用对提高应用程序的用户体验和开发效率非常重要。 取得或修改当前...
在C#编程中,WinForms是一个用于构建桌面应用程序的强大框架。动态添加按钮是常见的功能,尤其是在需要根据用户需求自定义界面或数据驱动的界面设计中。这个“WinForm C# 动态添加按钮”的主题主要涵盖了以下几个...
在基于C#的Windows Forms (WinForm) 应用程序开发中,`DataGridView`控件是一个非常重要的组件,用于展示和编辑表格数据。这个控件提供了丰富的功能,如数据绑定、排序、过滤以及各种自定义操作。下面将详细讲解如何...
在.NET框架中,WinForm是用于创建桌面应用程序的平台,它是C#编程语言的一个重要组成部分。本主题将深入探讨如何使用C#进行WinForm控件编程,帮助开发者掌握创建、自定义以及操作WinForm控件的基本技能。 1. **...
WinForm控件是.NET Framework中的一个组件库,主要用于开发Windows桌面应用程序。这些控件提供了一组丰富的UI元素,可以在Windows环境下创建各种类型的用户界面。 1. **基本控件**:如标签(Label)、文本框...