读书人

datagridview从绘效果的实现

发布时间: 2013-09-28 10:01:20 作者: rapoo

datagridview自绘效果的实现

[解决办法]

引用:
以上效果实现代码如下,细节部分就由你完善了,这里只是写个小例子:

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();
}
}
}
}



这个例子挺好的,推荐下这个帖子。

读书人网 >C#

热点推荐