|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Windows.Forms;
|
|
|
|
|
using System.Drawing;
|
|
|
|
|
|
|
|
|
|
namespace Mesnac.Basic
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// DataGridView二维表头实现类
|
|
|
|
|
/// </summary>
|
|
|
|
|
public class DataGridViewHelper
|
|
|
|
|
{
|
|
|
|
|
public DataGridViewHelper(DataGridView gridview)
|
|
|
|
|
{
|
|
|
|
|
gridview.CellPainting += new DataGridViewCellPaintingEventHandler(gridview_CellPainting);
|
|
|
|
|
}
|
|
|
|
|
int top = 0;
|
|
|
|
|
int left = 0;
|
|
|
|
|
int height = 0;
|
|
|
|
|
int width1 = 0;
|
|
|
|
|
public void gridview_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
#region 重绘datagridview表头
|
|
|
|
|
DataGridView dgv = (DataGridView)(sender);
|
|
|
|
|
if (e.RowIndex != -1) return;
|
|
|
|
|
foreach (TopHeader item in Headers)
|
|
|
|
|
{
|
|
|
|
|
if (e.ColumnIndex >= item.Index && e.ColumnIndex < item.Index + item.Span)
|
|
|
|
|
{
|
|
|
|
|
if (e.ColumnIndex == item.Index)
|
|
|
|
|
{
|
|
|
|
|
top = e.CellBounds.Top;
|
|
|
|
|
left = e.CellBounds.Left-1;
|
|
|
|
|
height = e.CellBounds.Height;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (item.Index == 0)
|
|
|
|
|
{
|
|
|
|
|
left = e.CellBounds.Left;
|
|
|
|
|
}
|
|
|
|
|
int width = 0;
|
|
|
|
|
for (int i = item.Index; i < item.Span + item.Index; i++)
|
|
|
|
|
{
|
|
|
|
|
width += dgv.Columns[i].Width;
|
|
|
|
|
}
|
|
|
|
|
Rectangle rect = new Rectangle(left, top, width, e.CellBounds.Height);
|
|
|
|
|
|
|
|
|
|
using (Brush backColorBrush = new SolidBrush(e.CellStyle.BackColor))
|
|
|
|
|
{
|
|
|
|
|
//抹去原来的cell背景
|
|
|
|
|
e.Graphics.FillRectangle(backColorBrush, rect);
|
|
|
|
|
}
|
|
|
|
|
//如果是一列
|
|
|
|
|
if (item.Span == 1)
|
|
|
|
|
{
|
|
|
|
|
using (Pen gridLinePen = new Pen(dgv.GridColor))
|
|
|
|
|
{
|
|
|
|
|
e.Graphics.DrawLine(gridLinePen, left, top, left + width, top);
|
|
|
|
|
width1 = 0;
|
|
|
|
|
e.Graphics.DrawLine(gridLinePen, left, top, left, top + height);
|
|
|
|
|
for (int i = item.Index; i < item.Span + item.Index; i++)
|
|
|
|
|
{
|
|
|
|
|
width1 += dgv.Columns[i].Width;
|
|
|
|
|
//e.Graphics.DrawLine(gridLinePen, left + width1, top + height / 2, left + width1, top + height);
|
|
|
|
|
}
|
|
|
|
|
SizeF sf = e.Graphics.MeasureString(item.Text, e.CellStyle.Font);
|
|
|
|
|
float lstr = (width - sf.Width) / 2;
|
|
|
|
|
float rstr = (height / 2 - sf.Height);
|
|
|
|
|
//画出文本框
|
|
|
|
|
if (item.Text != "")
|
|
|
|
|
{
|
|
|
|
|
//StringFormat drawFormat = new StringFormat();
|
|
|
|
|
//drawFormat.Alignment = StringAlignment.Center;
|
|
|
|
|
e.Graphics.DrawString(item.Text, e.CellStyle.Font,
|
|
|
|
|
new SolidBrush(e.CellStyle.ForeColor),
|
|
|
|
|
left + lstr,
|
|
|
|
|
height / 2,
|
|
|
|
|
StringFormat.GenericDefault);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
width = 0;
|
|
|
|
|
width1 = 0;
|
|
|
|
|
for (int i = item.Index; i < item.Span + item.Index; i++)
|
|
|
|
|
{
|
|
|
|
|
string columnValue = dgv.Columns[i].HeaderText;
|
|
|
|
|
width1 = dgv.Columns[i].Width;
|
|
|
|
|
sf = e.Graphics.MeasureString(columnValue, e.CellStyle.Font);
|
|
|
|
|
lstr = (width1 - sf.Width) / 2;
|
|
|
|
|
rstr = (height / 2 - sf.Height);
|
|
|
|
|
if (columnValue != "")
|
|
|
|
|
{
|
|
|
|
|
e.Graphics.DrawString(columnValue, e.CellStyle.Font,
|
|
|
|
|
new SolidBrush(e.CellStyle.ForeColor),
|
|
|
|
|
left + width + lstr,
|
|
|
|
|
top + height + rstr,
|
|
|
|
|
StringFormat.GenericDefault);
|
|
|
|
|
}
|
|
|
|
|
width += dgv.Columns[i].Width;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
using (Pen gridLinePen = new Pen(dgv.GridColor))
|
|
|
|
|
{
|
|
|
|
|
e.Graphics.DrawLine(gridLinePen, left, top, left + width, top);
|
|
|
|
|
e.Graphics.DrawLine(gridLinePen, left, top + height / 2, left + width, top + height / 2);
|
|
|
|
|
width1 = 0;
|
|
|
|
|
e.Graphics.DrawLine(gridLinePen, left, top, left, top + height);
|
|
|
|
|
for (int i = item.Index; i < item.Span + item.Index; i++)
|
|
|
|
|
{
|
|
|
|
|
width1 += dgv.Columns[i].Width;
|
|
|
|
|
e.Graphics.DrawLine(gridLinePen, left + width1, top + height / 2, left + width1, top + height);
|
|
|
|
|
}
|
|
|
|
|
SizeF sf = e.Graphics.MeasureString(item.Text, e.CellStyle.Font);
|
|
|
|
|
float lstr = (width - sf.Width) / 2;
|
|
|
|
|
float rstr = (height / 2 - sf.Height) / 2;
|
|
|
|
|
//画出文本框
|
|
|
|
|
if (item.Text != "")
|
|
|
|
|
{
|
|
|
|
|
e.Graphics.DrawString(item.Text, e.CellStyle.Font,
|
|
|
|
|
new SolidBrush(e.CellStyle.ForeColor),
|
|
|
|
|
left + lstr,
|
|
|
|
|
top + rstr,
|
|
|
|
|
StringFormat.GenericDefault);
|
|
|
|
|
}
|
|
|
|
|
width = 0;
|
|
|
|
|
width1 = 0;
|
|
|
|
|
for (int i = item.Index; i < item.Span + item.Index; i++)
|
|
|
|
|
{
|
|
|
|
|
string columnValue = dgv.Columns[i].HeaderText;
|
|
|
|
|
width1 = dgv.Columns[i].Width;
|
|
|
|
|
sf = e.Graphics.MeasureString(columnValue, e.CellStyle.Font);
|
|
|
|
|
lstr = (width1 - sf.Width) / 2;
|
|
|
|
|
rstr = (height / 2 - sf.Height) / 2;
|
|
|
|
|
if (columnValue != "")
|
|
|
|
|
{
|
|
|
|
|
e.Graphics.DrawString(columnValue, e.CellStyle.Font,
|
|
|
|
|
new SolidBrush(e.CellStyle.ForeColor),
|
|
|
|
|
left + width + lstr,
|
|
|
|
|
top + height / 2 + rstr,
|
|
|
|
|
StringFormat.GenericDefault);
|
|
|
|
|
}
|
|
|
|
|
width += dgv.Columns[i].Width;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
e.Handled = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
}
|
|
|
|
|
private List<TopHeader> _headers = new List<TopHeader>();
|
|
|
|
|
public List<TopHeader> Headers
|
|
|
|
|
{
|
|
|
|
|
get { return _headers; }
|
|
|
|
|
}
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 列头
|
|
|
|
|
/// </summary>
|
|
|
|
|
public struct TopHeader
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 猎头
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="index">列索引</param>
|
|
|
|
|
/// <param name="span">合并数量</param>
|
|
|
|
|
/// <param name="text">显示内容</param>
|
|
|
|
|
public TopHeader(int index, int span, string text)
|
|
|
|
|
{
|
|
|
|
|
this.Index = index;
|
|
|
|
|
this.Span = span;
|
|
|
|
|
this.Text = text;
|
|
|
|
|
}
|
|
|
|
|
public int Index;
|
|
|
|
|
public int Span;
|
|
|
|
|
public string Text;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|