C#DataGridView怎么合并单元格
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#DataGridView怎么合并单元格相关的知识,希望对你有一定的参考价值。
参考技术A 需要重绘单元格。在下面这个事件里写就可以了,下面这个例子只是对第一列中内容相同的数据合并,你可以根据自己的实际情况做调整,可以写了一个控件,可以随时设定合并哪一列,一次合并几行数据。private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
// 对第1列相同单元格进行合并
if (e.ColumnIndex == 0 && 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+2,
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+2,
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);
// 画左边线
e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left +2,
e.CellBounds.Top, e.CellBounds.Left +2,
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;
本回答被提问者和网友采纳
C#Winform中DataGridView合并单元格的问题?
我合并4列单元格位1列,合并好后,当点击前面3个单元格时,会出现如下情况:原来单元格中的内容会显示出来,并且此单元格位选中状态,请问该如何解决,谢谢
代码:if (e.ColumnIndex == 3)
Rectangle re = new Rectangle(e.CellBounds.Left - dataGridView2.Columns[0].Width - dataGridView2.Columns[1].Width - dataGridView2.Columns[2].Width,
e.CellBounds.Top, e.CellBounds.Width + dataGridView2.Columns[0].Width + dataGridView2.Columns[01].Width + dataGridView2.Columns[2].Width,
e.CellBounds.Height);
e.Graphics.FillRectangle(Brushes.Yellow, re);
Pen pen = new Pen(dataGridView2.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(dataGridView2.Rows[e.RowIndex].Cells[0].Value.ToString(), dataGridView2.Font);
e.Graphics.DrawString(dataGridView2.Rows[e.RowIndex].Cells[0].Value.ToString(), dataGridView2.Font,
Brushes.Black, re.X + (re.Width - strSize.Width) / 2, re.Y + (re.Height - strSize.Height) / 2); e.Handled = true;
请注意:我合并的不是表头列,是数据列
只会在第三列触发的Paint事件中调用,也就是说,如果点击ColumnIndex =2的单元格触发Paint时,你的代码不起作用,会实用dataGridView2的默认样式绘制.
e.CellBounds,因为上面是第三列所以e.CellBounds始终是第三列的Bounds
--参考
if(e.ColumnIndex>=0&&e.ColumnIndex < 4 && e.RowIndex == 2)
Rectangle re =dataGridView1.GetCellDisplayRectangle(0,e.RowIndex,false);
re.Width = re.Width + dataGridView1.Columns[1].Width + dataGridView1.Columns[2].Width + dataGridView1.Columns[3].Width;
e.Graphics.FillRectangle(Brushes.Yellow,re);
Pen pen = new Pen(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(dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString(),dataGridView1.Font);
e.Graphics.DrawString(dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString(),dataGridView1.Font,
Brushes.Black,re.X + (re.Width - strSize.Width) / 2,re.Y + (re.Height - strSize.Height) / 2); e.Handled = true;
追问
可以了,非常感谢
本回答被提问者采纳以上是关于C#DataGridView怎么合并单元格的主要内容,如果未能解决你的问题,请参考以下文章
在DataGridView Windows窗体C#中合并标题和单元格
c#winfrom中datagridview控件如何自定义一个datagridview的列。主要是想实现类似EXCEL中的合并单元格