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; height = e.CellBounds.Height; } 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); } 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; } } 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; } }
使用:
DataTable dt = new DataTable(); dt.Columns.Add("id", typeof(int)); dt.Columns.Add("sum", typeof(int)); dt.Columns.Add("product", typeof(string)); dt.Rows.Add(1, 2, "milk"); dt.Rows.Add(3, 4, "pig"); dataGridView1.DataSource = dt; DataGridViewHelper rowMergeView = new DataGridViewHelper(dataGridView1); rowMergeView.Headers.Add(new DataGridViewHelper.TopHeader(1, 2, "总计"));
转自http://www.cnblogs.com/tewuapple/archive/2012/09/05/2671560.html