private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) { // 对第日期列相同单元格进行合并 if (e.ColumnIndex == 2 && e.RowIndex != -1) { 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); // 画 Grid 边线(仅画单元格的底边线和右边线) // 如果下一行和当前行的数据不同,则在当前的单元格画一条底边线 if (e.RowIndex < dataGridView1.Rows.Count - 1 && dataGridView1.Rows[e.RowIndex + 1].Cells[e.ColumnIndex].Value.ToString() != e.Value.ToString()) { e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1, e.CellBounds.Right - 1, e.CellBounds.Bottom - 1); } //如果是最后一行,画上底线避免一个缺口 if (e.RowIndex == dataGridView1.Rows.Count - 1) { e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1, e.CellBounds.Right - 1, e.CellBounds.Bottom - 1); } // 画右边线 e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right - 1, e.CellBounds.Top, e.CellBounds.Right - 1, e.CellBounds.Bottom); // 画(填写)单元格内容,相同的内容的单元格只填写第一个 if (e.Value != null) { if (e.RowIndex > 0 && dataGridView1.Rows[e.RowIndex - 1].Cells[e.ColumnIndex].Value.ToString() == e.Value.ToString()) { } else { e.Graphics.DrawString((String)e.Value, e.CellStyle.Font, Brushes.Black, e.CellBounds.X + 2, e.CellBounds.Y + 5, StringFormat.GenericDefault); } } e.Handled = true; } } } }