datagridview自绘
来源:互联网 发布:照片恢复软件下载 编辑:程序博客网 时间:2024/06/06 00:30
https://msdn.microsoft.com/zh-cn/library/85kxk29c(v=vs.85).aspx
以上效果实现代码如下,细节部分就由你完善了,这里只是写个小例子:
using System;using System.Data;using System.Drawing;using System.Windows.Forms;namespace PaintGridView{ public partial class Form1 : Form { DataGridView dataGridView = new DataGridView(); public Form1() { InitializeComponent(); SetupControls(); } public void SetupControls() { DataTable dt = new DataTable(); dt.Columns.AddRange(new DataColumn[] { new DataColumn("名称"), new DataColumn("参与者"), new DataColumn("创建日期"), new DataColumn("更新日期"), new DataColumn("隐藏信息列") }); for (int i = 0; i < 5; i++) { DataRow row = dt.NewRow(); row[0] = "名称" + (i + 1); row[1] = i % 2 == 0 ? "超级管理员" : "管理员"; row[2] = DateTime.Now.ToString("yyyy/MM/dd"); row[3] = DateTime.Now.AddDays(i).ToString("yyyy/MM/dd"); row[4] = "客户已经同意与(某某" + (i + 1) + " " + (i + 1) + "小时前)"; dt.Rows.Add(row); } dataGridView.ColumnCount = 5; for (int i = 0; i < 5; i++) { dataGridView.Columns[i].Name = dt.Columns[i].ColumnName; dataGridView.Columns[i].DataPropertyName = dt.Columns[i].ColumnName; dataGridView.Columns[i].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; if (i != 0) dataGridView.Columns[i].Width = 120; else dataGridView.Columns[i].Width = 150; } dataGridView.AutoGenerateColumns = false; dataGridView.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; dataGridView.DataSource = dt; dataGridView.Dock = DockStyle.Fill; this.Controls.Add(dataGridView); //只需要把需要绘制的DataGridView传入DataGridViewRenderer即可, //这里的隐藏列即为需要重新绘制的内容 DataGridViewRenderer render = new DataGridViewRenderer(dataGridView, dataGridView.Columns[dataGridView.ColumnCount - 1]); } } public class DataGridViewRenderer { //行高 private const int ROW_HEIGHT = 70; //目标DataGridView private DataGridView dataGridView; //需要自定义绘制的列 private DataGridViewColumn hiddenColumn; //记录上一次选择的行,用于行索引改变时重绘该行而不是重绘整个控件画面 private int preRowIndex = 0; //小图标 private Bitmap icon1; private Bitmap icon2; public DataGridViewRenderer(DataGridView dataGridView, DataGridViewColumn hiddenColumn = null) { this.dataGridView = dataGridView; this.hiddenColumn = hiddenColumn; SetupControl(); } /// <summary> /// 设置控件属性 /// </summary> private void SetupControl() { if (dataGridView == null) return; if (hiddenColumn != null) { hiddenColumn.Visible = false; } //用户不能调整列标题高度 dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing; //隐藏行标题 dataGridView.RowHeadersVisible = false; //设置行高 dataGridView.RowTemplate.Height = ROW_HEIGHT; //设置内边距大小 Padding newPadding = new Padding(0, 1, 0, ROW_HEIGHT - 30); dataGridView.RowTemplate.DefaultCellStyle.Padding = newPadding; dataGridView.AllowUserToAddRows = false; //设置无单元格边框 dataGridView.CellBorderStyle = DataGridViewCellBorderStyle.None; //单元格选择模式为全选 dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect; dataGridView.AutoResizeRows(DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders); //设置字体样式 dataGridView.DefaultCellStyle.SelectionForeColor = Color.Black; dataGridView.DefaultCellStyle.ForeColor = Color.DimGray; //设置选中行背景色,需要绘制自定义背景应该在RowPrePaint处理,并设置该属性为Color.Transparent; dataGridView.RowTemplate.DefaultCellStyle.SelectionBackColor =Color.Orange; //绑定一些事件实现自定义行绘制 dataGridView.ColumnWidthChanged += new DataGridViewColumnEventHandler(dataGridView_ColumnWidthChanged); dataGridView.RowHeightChanged += new DataGridViewRowEventHandler(dataGridView_RowHeightChanged); dataGridView.CurrentCellChanged += new EventHandler(dataGridView_CurrentCellChanged); dataGridView.RowPostPaint += new DataGridViewRowPostPaintEventHandler(dataGridView_RowPostPaint); //初始化小图标,这里在资源列表获取 icon1 = Properties.Resources._01; icon2 = Properties.Resources._02; } /// <summary> /// 列宽度改变时使控件整个画面无效并导致重绘 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void dataGridView_ColumnWidthChanged(object sender, DataGridViewColumnEventArgs e) { dataGridView.Invalidate(); } /// <summary> /// 列高度改变时调整行内边距大小 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void dataGridView_RowHeightChanged(object sender, DataGridViewRowEventArgs e) { int preHeight = e.Row.GetPreferredHeight( e.Row.Index, DataGridViewAutoSizeRowMode.AllCellsExceptHeader, true) - e.Row.DefaultCellStyle.Padding.Bottom; Padding newPadding = e.Row.DefaultCellStyle.Padding; newPadding.Bottom = e.Row.Height - preHeight; e.Row.DefaultCellStyle.Padding = newPadding; } /// <summary> /// 重绘前一个选择的行 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void dataGridView_CurrentCellChanged(object sender, EventArgs e) { if (preRowIndex != -1) { dataGridView.InvalidateRow(preRowIndex); } preRowIndex = dataGridView.CurrentCellAddress.Y; } /// <summary> /// 处理绘制行内容 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void dataGridView_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) { Rectangle rowBounds = new Rectangle(0, e.RowBounds.Top, dataGridView.Columns.GetColumnsWidth(DataGridViewElementStates.Visible) - dataGridView.HorizontalScrollingOffset + 1, e.RowBounds.Height); SolidBrush brush = null; try { if ((e.State & DataGridViewElementStates.Selected) == DataGridViewElementStates.Selected) brush = new SolidBrush(e.InheritedRowStyle.SelectionForeColor); else brush = new SolidBrush(e.InheritedRowStyle.ForeColor); //获取隐藏列的值 object hiddenObj = dataGridView.Rows[e.RowIndex].Cells[hiddenColumn.Name].Value; if (hiddenObj != null) { String text = hiddenObj.ToString(); //设定内容边界 Rectangle textBounds = rowBounds; textBounds.X -= dataGridView.HorizontalScrollingOffset; textBounds.Width += dataGridView.HorizontalScrollingOffset; textBounds.Y += rowBounds.Height - e.InheritedRowStyle.Padding.Bottom; textBounds.Height -= rowBounds.Height - e.InheritedRowStyle.Padding.Bottom; textBounds.Height = (textBounds.Height / e.InheritedRowStyle.Font.Height) * e.InheritedRowStyle.Font.Height; RectangleF oldClip = e.Graphics.ClipBounds; e.Graphics.SetClip(textBounds); //画图标 e.Graphics.DrawImage(icon1, new Rectangle(textBounds.X + 5, textBounds.Y, icon1.Width, icon1.Height)); e.Graphics.DrawImage(icon2, new Rectangle(textBounds.X + icon1.Width + 10, textBounds.Y, icon2.Width, icon2.Height)); textBounds.X += icon1.Width * 2 + 15; textBounds.Y += 2; //画文字 e.Graphics.DrawString( text, e.InheritedRowStyle.Font, brush, textBounds); e.Graphics.SetClip(oldClip); } } finally { brush.Dispose(); } } }}
0 0
- datagridview自绘
- datagridview自绘效果的实现
- DataGridView自定義列樣式--DataGridViewDateTimeColumn
- DataGridView自定義列樣式--DataGridViewMaskedTextBoxColumn
- Datagridview自動翻頁
- dataGridView设置自增
- Winform为DataGridView添加自增列
- C# 摘录自MSDN。 DataGridView初始值 !
- DataGridView 的重绘
- datagridview单元格重绘
- 重绘DataGridView行
- Datagridview
- DataGridView
- DataGridView
- DataGridView
- DATAGRIDVIEW
- DataGridView
- DataGridView
- 多线程
- C#委托使用详解(Delegates)
- 更新UI
- ThreadPool
- 【C#】面试题整理
- datagridview自绘
- C#调用winhttp组件 POST登录迅雷
- 表达式计算的代码
- 130道C#面试题
- 反编译与调试APK
- 验证码识别技术研究
- 一枚颜值颇高、骨骼清奇的红薯
- 7.AD转换—基于CT117E开发板的STM32库函数编程
- [AHK]读取硬件信息