DataGridView合并单元格(横向合并)
程序员文章站
2022-07-13 14:27:59
...
整理来自于https://blog.csdn.net/huangwenhua5000/article/details/8949638
这里仅进行横向的单元格合并,没有进行纵向的单元格的合并.
合并后的单元格没有点击效果,不过还算理想。代码如下:
private void Form1_Load(object sender, EventArgs e)
{
DataTable dt = new DataTable();
dt.Columns.Add("A");
dt.Columns.Add("B");
dt.Columns.Add("C");
dt.Columns.Add("D");
dt.Rows.Add(new object[] { "A1", "B1", "C1", "D1" });
dt.Rows.Add(new object[] { "A2", "B2", "C2", "D2" });
dt.Rows.Add(new object[] { "A3", "B3", "C3", "D3" });
this.dataGridView1.DataSource = dt;
}
private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
if (e.RowIndex < 0 || e.RowIndex >= this.dataGridView1.Rows.Count - 1 || e.ColumnIndex == -1)
{
return;
}
// 下面合并单元格第3行第2列(B3)与单元格第3行第3列(C3).
if (e.ColumnIndex == 1 && this.dataGridView1[e.RowIndex, e.ColumnIndex + 1].Value.ToString() == "C3")
{
e.Handled = true;
}
if (e.ColumnIndex == 2 && e.Value.ToString() == "C3")
{
//背景颜色
SolidBrush backBrush = new SolidBrush(e.CellStyle.BackColor);
if (this.dataGridView1.Rows[e.RowIndex].Selected)
{
backBrush.Color = e.CellStyle.SelectionBackColor;
}
//画矩形框
DataGridViewCell preCell = this.dataGridView1[e.ColumnIndex - 1, e.RowIndex];
Rectangle re = new Rectangle(e.CellBounds.Left - this.dataGridView1.Columns[e.ColumnIndex - 1].Width
, e.CellBounds.Top,
e.CellBounds.Width + this.dataGridView1.Columns[e.ColumnIndex - 1].Width
, e.CellBounds.Height);
e.Graphics.FillRectangle(backBrush, re);
//画边框
Pen pen = new Pen(this.dataGridView1.BackgroundColor, 1);
pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid;
//底边框
e.Graphics.DrawLine(pen, re.X, re.Y + re.Height - 1, re.X + re.Width, re.Y + re.Height - 1);
//右边框
e.Graphics.DrawLine(pen, re.X + re.Width - 1, re.Y, re.X + re.Width - 1, re.Y + re.Height);
//在矩形框内写入文本
SizeF strSize = e.Graphics.MeasureString(e.Value.ToString(), this.dataGridView1.Font);
e.Graphics.DrawString(e.Value.ToString(), this.dataGridView1.Font, Brushes.Black, re.X + (re.Width - strSize.Width) / 2,
re.Y + (re.Height - strSize.Height) / 2);
e.Handled = true;
}
}
其他:如果需要深入研究,可参考链接https://blog.csdn.net/qq_31510271/article/details/80094792中的RowMergeView控件,
该控件支持横向与纵向的单元格合并,不过测试中有些小问题,在拖动改变行高时会出现重影,选择含有合并单元格的行时背景色无变化.
上一篇: element合并单元格