自定义单元格绘制组件DataGridViewCellPainter
来源:互联网 发布:淘宝中权重是什么意思 编辑:程序博客网 时间:2024/05/17 06:38
Author: Alex Leo; Email: mailto:alexleo321@hotmail.com; Blog: http://blog.csdn.net/ConExpress/
本示例演示如何在DataGridView的CellPainting事件中自定义单元格的绘制,实现自定义边框、背景和文本格式。边框可定义宽度、颜色以及绘制位置;背景可定义单色背景或图片背景;文本可定义字体、颜色、大小、对齐方式、截断方式等。
组件源码及示例代码:http://download.csdn.net/source/833346
示例效果如下:
绘制行标题和列标题,蓝色背景:
绘制行标题和内容,图像背景:
绘制列标题和内容,图像背景:
绘制行标题、列标题和内容,图像背景:
类图如下:
类详细信息:
组件的实现比较简单。首先添加一个DataGridView类型的属性TargetControl,设置该属性后指定控件CellPainting事件处理方法TargetControl_CellPainting,在其中实现自定义绘制。
- private DataGridView m_TargetControl = null;
- [Category(c_ControlCategory), Description("要编辑的目标 DataGridView 控件。"), DefaultValue(null)]
- public DataGridView TargetControl
- {
- get { return m_TargetControl; }
- set
- {
- if (m_TargetControl != value)
- {
- if (m_TargetControl != null)
- {
- m_TargetControl.CellPainting -= new DataGridViewCellPaintingEventHandler(TargetControl_CellPainting);//移除之前的自定义绘制
- m_TargetControl.Refresh();
- }
- m_TargetControl = value;
- if (m_TargetControl != null)
- {
- TargetControl.CellPainting += new DataGridViewCellPaintingEventHandler(TargetControl_CellPainting);//设置自定义绘制方法
- }
- this.OnPropertyChanged("TargetControl");
- }
- }
- }
在CellPainting方法中处理单元格的绘制:
- void TargetControl_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
- {
- if (this.Container == null)//移除组件后移除自定义绘制
- {
- this.m_TargetControl.CellPainting -= new DataGridViewCellPaintingEventHandler(TargetControl_CellPainting);
- this.m_TargetControl.Refresh();
- return;
- }
- if (this.m_Enable)
- {
- bool blnDrawFlag = false;
- if (e.ColumnIndex < 0)//行标题
- {
- blnDrawFlag = ((e.RowIndex < 0) ? this.m_DrawHeaderCorner : this.m_DrawRowHeader);
- }
- else
- {
- blnDrawFlag = ((e.RowIndex < 0) ? this.m_DrawColumnHeader : this.m_DrawContentCell);
- }
- if (blnDrawFlag)//判断是否绘制当前单元格
- {
- //考虑加入事件,这样用户可以进行更灵活的控制
- this.DrawBackground(e);//绘制背景
- this.DrawBorder(e);//绘制边框
- this.DrawHeaderText(e);//绘制文本
- e.Handled = true;//标记为已处理
- }
- }
- }
这里把绘制背景,绘制边框和绘制文本分开处理,条理更清晰。
- /// <summary>
- /// 绘制背景
- /// </summary>
- /// <param name="e"></param>
- private void DrawBackground(DataGridViewCellPaintingEventArgs e)
- {
- Brush BackBrush = null;
- if (BackImage != null)//如果指定背景图片则用TextureBrush,否则用SolidBrush
- BackBrush = new TextureBrush(BackImage, m_WrapMode);
- else
- BackBrush = new SolidBrush(BackColor);
- e.Graphics.FillRectangle(BackBrush, e.CellBounds);//填充背景
- }
- /// <summary>
- /// 绘制边框
- /// </summary>
- /// <param name="e"></param>
- private void DrawBorder(DataGridViewCellPaintingEventArgs e)
- {
- //绘制边框
- int intXLeft, intXRight, intYTop, intYBottom;
- intXLeft = e.CellBounds.Location.X;
- intXRight = e.CellBounds.Location.X + e.CellBounds.Width - 1;
- intYTop = e.CellBounds.Location.Y;
- intYBottom = e.CellBounds.Location.Y + e.CellBounds.Height - 1;
- //用绘制矩形的方式绘制边框更容易控制
- //绘制边框线条,上左右下的顺序
- e.Graphics.FillRectangle(new SolidBrush(BorderTopColor), new Rectangle(e.CellBounds.Location, new Size(e.CellBounds.Width, BorderWidth)));//top
- e.Graphics.FillRectangle(new SolidBrush(BorderLeftColor), new Rectangle(e.CellBounds.Location, new Size(BorderWidth, e.CellBounds.Height)));//left
- e.Graphics.FillRectangle(new SolidBrush(BorderRightColor), new Rectangle(intXRight - BorderWidth + 1, intYTop, BorderWidth, e.CellBounds.Height));//right
- e.Graphics.FillRectangle(new SolidBrush(BorderBottomColor), new Rectangle(intXLeft, intYBottom - BorderWidth + 1, e.CellBounds.Width, BorderWidth));//bottom
- }
- /// <summary>
- /// 绘制标题文本
- /// </summary>
- /// <param name="e"></param>
- private void DrawHeaderText(DataGridViewCellPaintingEventArgs e)
- {
- if (e.Value == null || e.Value == DBNull.Value || e.Value.ToString().Length == 0)
- return;
- //设置文本格式
- StringFormat myStringFormat = new StringFormat();
- myStringFormat.Alignment = Align;//水平对齐方式
- myStringFormat.LineAlignment = VAlign;//垂直对齐方式
- myStringFormat.Trimming = TrimType;//截断方式
- myStringFormat.FormatFlags = StringFormatFlags.DisplayFormatControl;
- e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
- e.Graphics.DrawString(e.Value.ToString(), m_Font, new SolidBrush(ForeColor), e.CellBounds, myStringFormat);//绘制文字
- }
其他相关的属性就不在这里详细介绍,都是控制绘制方式的。可以根据需要添加相关的控制属性,比如四个边框的颜色都可以不一样,标题和内容的字体不一样,奇偶行的样式不一样等等,然后在绘制方法中相应调整就很容易实现了。注意在用背景图片的时候尽量采用小尺寸的图片,否则会影响绘制效率。
组件源码及示例代码:http://download.csdn.net/source/833346
- 自定义单元格绘制组件DataGridViewCellPainter
- 自定义组件-绘制时钟
- vue 封装自定义组件--tabal列表编辑单元格组件
- 为自定义ViewGroup组件绘制边框
- 自定义单元格
- 自定义单元格
- 单元格中绘制斜线
- 表格(单元格放置组件)
- SuperMap IObjects C++组件学习笔记(三) - 利用组件绘制的回调方法控制自定义绘制
- phpExcel中多个单元格边框绘制
- Asp.net导出Excel续章(自定义合并单元格,非Office组件)
- 【Android 应用开发】 自定义组件 宽高适配方法, 手势监听器操作组件, 回调接口维护策略, 绘制方法分析 -- 基于 WheelView 组件分析自定义组件
- 【Android 应用开发】 自定义组件 宽高适配方法, 手势监听器操作组件, 回调接口维护策略, 绘制方法分析 -- 基于 WheelView 组件分析自定义组件
- 【Android 应用开发】 自定义组件 宽高适配方法, 手势监听器操作组件, 回调接口维护策略, 绘制方法分析 -- 基于 WheelView 组件分析自定义组件
- 【Android 应用开发】 自定义组件 宽高适配方法, 手势监听器操作组件, 回调接口维护策略, 绘制方法分析 -- 基于 WheelView 组件分析自定义组件
- swing jTable 自定义单元格
- 自定义的单元格合并
- 自定义JTable单元格
- Spring输入验证与数据绑定
- Ajax世界的变焦
- 计算余数
- 各大型网站架构分析收集
- MBR的读取
- 自定义单元格绘制组件DataGridViewCellPainter
- eclipse技巧学习
- SQL Server Security
- 搜索引擎优化的7点注意要点
- 怀念在CSDN的这段时光
- C# 3.0语言详解之基本的语言增强1
- 解决TIME_WAIT过多问题
- 关于scanf 输入数据格式与格式化字符串不匹配的困惑
- Rails源代码分析(19):ActionController::Caching(3) PageCache