欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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控件,

该控件支持横向与纵向的单元格合并,不过测试中有些小问题,在拖动改变行高时会出现重影,选择含有合并单元格的行时背景色无变化.