using System.Collections.Generic; using System.Windows.Forms; using System.Drawing; namespace Mesnac.Basic { /// /// DataGridView二维表头实现类 /// 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 _headers = new List(); public List Headers { get { return _headers; } } /// /// 列头 /// public struct TopHeader { /// /// 猎头 /// /// 列索引 /// 合并数量 /// 显示内容 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; } } }