效果
View Code using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } public override string ToString() { return Convert.ToString( base .ToString()); } #region "合并单元格的测试" // private int? nextrow = null; // private int? nextcol = null; // 设置单元格内容显示格式 private void dataGridView1_CellFormatting( object sender, System.Windows.Forms.DataGridViewCellFormattingEventArgs e) { // #region description // if (this.dataGridView1.Columns["description"].Index == e.ColumnIndex && e.RowIndex >= 0) // { // if (this.nextcol != null & e.ColumnIndex == this.nextcol) // { // e.CellStyle.BackColor = Color.LightBlue; // this.nextcol = null; // } // if (this.nextrow != null & e.RowIndex == nextrow) // { // e.CellStyle.BackColor = Color.LightPink; // this.nextrow = null; // } // if (e.RowIndex != this.dataGridView1.RowCount - 1) // { // if (e.Value.ToString() == Convert.ToString(this.dataGridView1.Rows[e.RowIndex + 1].Cells[e.ColumnIndex + 1].Value)) // { // e.CellStyle.BackColor = Color.LightPink; // nextrow = e.RowIndex + 1; // } // } // } // #endregion // if (this.dataGridView1.Columns["name"].Index == e.ColumnIndex && e.RowIndex >= 0) // { // // upd by liu // if (e.Value.ToString() == this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString()) // { // e.CellStyle.BackColor = Color.LightBlue; // nextcol = e.ColumnIndex + 1; // } // } } // ========================== // 记录合并的行数 static int rowcount = 0 ; // 绘制单元格 private void dataGridView1_CellPainting( object sender, System.Windows.Forms.DataGridViewCellPaintingEventArgs e) { // 纵向合并 if ( this .dataGridView1.Columns[ " description " ].Index == e.ColumnIndex && e.RowIndex >= 0 ) { // 初始两个笔刷,表格线设置为颜色为红色 就是我们要画的表格线 using ( Brush gridBrush = new SolidBrush(Color.Red), // this.dataGridView1.GridColor backColorBrush = new SolidBrush(e.CellStyle.BackColor) ) { using (Pen gridLinePen = new Pen(gridBrush)) { // 擦除原单元格背景 e.Graphics.FillRectangle(backColorBrush, e.CellBounds); /**/ /// /绘制线条,这些线条是单元格相互间隔的区分线条, /// /因为我们只对列description做处理,所以datagridview自己会处理左侧和上边缘的线条 /// /相邻单元格的值一样的话,就不在画下边缘的线,实现合并效果 if (e.RowIndex != this .dataGridView1.RowCount - 1 ) { if (e.Value.ToString() != Convert.ToString( this .dataGridView1.Rows[e.RowIndex + 1 ].Cells[e.ColumnIndex].Value)) { e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1 , e.CellBounds.Right - 1 , e.CellBounds.Bottom - 1 ); // 下边缘的线 // 绘制值 if (e.Value != null ) { int heighty = e.CellBounds.Height / 2 * rowcount; e.Graphics.DrawString((String)e.Value, e.CellStyle.Font, Brushes.Crimson, e.CellBounds.X + 2 , e.CellBounds.Y + 2 - heighty, StringFormat.GenericDefault); rowcount = 0 ; } } else { rowcount ++ ; } } else { e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1 , e.CellBounds.Right - 1 , e.CellBounds.Bottom - 1 ); // 下边缘的线 // 绘制值 if (e.Value != null ) { e.Graphics.DrawString((String)e.Value, e.CellStyle.Font, Brushes.Crimson, e.CellBounds.X + 2 , e.CellBounds.Y + 2 , StringFormat.GenericDefault); } } // 右侧的线 e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right - 1 , e.CellBounds.Top, e.CellBounds.Right - 1 , e.CellBounds.Bottom - 1 ); e.Handled = true ; } } } #region // 横向合并 // if (this.dataGridView1.Columns["name"].Index == e.ColumnIndex && e.RowIndex >= 0) // { // using ( // Brush gridBrush = new SolidBrush(this.dataGridView1.GridColor), // backColorBrush = new SolidBrush(e.CellStyle.BackColor)) // { // using (Pen gridLinePen = new Pen(gridBrush)) // { // // 擦除原单元格背景 // e.Graphics.FillRectangle(backColorBrush, e.CellBounds); // if (e.Value.ToString() != this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex + 1].Value.ToString()) // { // // 右侧的线 // e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right - 1, e.CellBounds.Top, // e.CellBounds.Right - 1, e.CellBounds.Bottom - 1); // // 绘制值 // if (e.Value != null) // { // e.Graphics.DrawString((String)e.Value, e.CellStyle.Font, // Brushes.Crimson, e.CellBounds.X + 2, // e.CellBounds.Y + 2, StringFormat.GenericDefault); // } // } // // 下边缘的线 // e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1, // e.CellBounds.Right - 1, e.CellBounds.Bottom - 1); // e.Handled = true; // } // } // } #endregion } #endregion private void Form1_Load( object sender, EventArgs e) { DataTable dt = new DataTable(); dt.Columns.Add( " description " ); dt.Columns.Add( " name " ); dt.Columns.Add( " sex " ); dt.Rows.Add( " A " , " cc " , " 1 " ); dt.Rows.Add( " A " , " dd " , " 1 " ); dt.Rows.Add( " B " , " dd " , " 0 " ); dt.Rows.Add( " A " , " dd " , " 0 " ); dt.Rows.Add( " C " , " dd " , " 0 " ); dt.Rows.Add( " A " , " dd " , " 0 " ); dt.Rows.Add( " C " , " dd " , " 0 " ); // 不允许调整行高 用于合并行居中 this .dataGridView1.AllowUserToResizeRows = false ; this .dataGridView1.DataSource = dt; this .dataGridView1.Sort( this .dataGridView1.Columns[ " description " ],ListSortDirection.Ascending); // 按和并列,排序 // dataGridView1.Columns["Column1"].HeaderCell.SortGlyphDirection = SortOrder.Ascending // this.dataGridView1.Sort(this.dataGridView1.Columns["description"], ListSortDirection.Ascending); bool issort = false ; //暂时只想到这个办法 this .dataGridView1.Sorted += new EventHandler((xx, yy) => { // this.dataGridView1.SortedColumn.SortMode = DataGridViewColumnSortMode.Automatic; // this.dataGridView1.Columns[1].SortMode = DataGridViewColumnSortMode.NotSortable; string col = this .dataGridView1.SortedColumn.Name; if (col == " description " || col == "" ) { col = "" ; } else { col = " , " + col; } // 重新指定排序规则 // 在第一列默认排列顺序下,排列其他列 DataView dv = dt.DefaultView; if (issort) { dv.Sort = " description " + col + " ASC " ; issort = ! issort; } else { dv.Sort = " description " + col + " DESC " ; issort = ! issort; } this .dataGridView1.DataSource = dv; // this.dataGridView1.Columns[0].SortMode = DataGridViewColumnSortMode.Automatic; }); } }}
1. Convert.ToString(this.dataGridView1.Rows[e.RowIndex + 1].Cells[e.ColumnIndex].Value))
原文直接.tostring(). 当datagridview 启动添加行时,比较最后一行时会有错误.
2.不足:当选中单元格,或调整行高或其他操作,合并列的值会显示.
2. 只为简单记录随笔,别无它意.
代码:/Files/dayou123123/合并DataGridView.rar
原文:http://blog.csdn.net/csharp_start/archive/2007/09/30/1808000.aspx
更多:http://www.cnblogs.com/peterzb/archive/2009/05/29/1491891.html
转载于:https://www.cnblogs.com/dayou123123/archive/2011/06/11/2078489.html
相关资源:DataGridView合并单元格(纵向合并及横向合并)