Datagridview里的合并单元格和自动换行

priesthgink 2014-04-03 11:11:39
首先我是读取excel然后存在dataset里放进datagridview,然后因为excel文件中有一些合并单元格的列,所以我用了DataGridViewCellPaintingEventArgs 绘制表格,产生合并单元格的效果
给一下我参考的代码

public void dgCellPainting(DataGridView dgStandard, string strColumnName, DataGridViewCellPaintingEventArgs e)
{
if (dgStandard.Rows.Count > 0)
{

if (dgStandard.Rows[0].Cells[0].Value.ToString().Trim() != string.Empty)
{
try
{
if (dgStandard.Columns[strColumnName].Index == e.ColumnIndex && e.RowIndex >= 0)
{
using (
Brush gridBrush = new SolidBrush(dgStandard.GridColor),
backColorBrush = new SolidBrush(e.CellStyle.BackColor))
{
using (Pen gridLinePen = new Pen(gridBrush))
{
// 擦除原单元格背景
e.Graphics.FillRectangle(backColorBrush, e.CellBounds);

if (e.RowIndex != dgStandard.RowCount - 1)
{
if (e.Value.ToString() != dgStandard.Rows[e.RowIndex + 1].Cells[e.ColumnIndex].Value.ToString())
{
e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1,
e.CellBounds.Right - 1, e.CellBounds.Bottom - 1);//下边缘的线
}
}
else
{
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, //x1,y1,x2,y2
e.CellBounds.Top, e.CellBounds.Right - 1,
e.CellBounds.Bottom - 1);

if (e.RowIndex == 0)
{
//绘制值
if (e.Value != null)
{

e.Graphics.DrawString((String)e.Value, e.CellStyle.Font,
Brushes.Crimson,
e.CellBounds.X +(e.CellBounds.Width - e.Graphics.MeasureString(e.Value.ToString().Trim(), e.CellStyle.Font).Width)/2,
e.CellBounds.Y + 2, StringFormat.GenericDefault);
}
}
else
{
if (e.Value.ToString() != dgStandard.Rows[e.RowIndex - 1].Cells[e.ColumnIndex].Value.ToString())
{
//绘制值
if (string.IsNullOrEmpty(e.Value.ToString().Trim()).Equals(false))
{
e.Graphics.DrawString((String)e.Value, e.CellStyle.Font,
Brushes.Crimson, e.CellBounds.X + (e.CellBounds.Width - e.Graphics.MeasureString(e.Value.ToString().Trim(), e.CellStyle.Font).Width) / 2,
e.CellBounds.Y + 2, StringFormat.GenericDefault);
}
}
}

e.Handled = true;
}
}
}
}
catch { }
}
}
}

同时因为某些表格的字数又比较多,所以又用了自动换行

//设置自动换行
this.dataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
//设置自动调整高度
this.dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;


然而这里就产生了一个问题,如果我没有用DataGridViewCellPaintingEventArgs 绘制表格表达合并单元格效果,自动换行是生效的。但是如果我用了绘制表格的效果,行的大小是会改变,但是文字是没有自动换行的,求大神解答。
...全文
428 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
czp_huster 2015-12-18
  • 打赏
  • 举报
回复
楼主,用DevExpress的gridcontrol进行合并单元格的方法能告知一下么
priesthgink 2014-04-16
  • 打赏
  • 举报
回复
引用 7 楼 lyq8376 的回复:
楼主试下在对应DataGridView的CellFormatting方法中设置换行
用了下devexpress的控件gridcontrol,合并单元格算是解决了……但是自动换行还是个坎儿……话说这种控件不是完成度很高了么……也会这么坑么……
  • 打赏
  • 举报
回复
在CellPainting事件对应方法中加上e.CellStyle.WrapMode = DataGridViewTriState.True; Cell被重绘了,不会再去调用DefaultCellStyle.WrapMode
priesthgink 2014-04-15
  • 打赏
  • 举报
回复
没有大神知道么
  • 打赏
  • 举报
回复
楼主试下在对应DataGridView的CellFormatting方法中设置换行
priesthgink 2014-04-15
  • 打赏
  • 举报
回复
表示非常想问一下各位大神,C#有没什么控件可以比较好的实现自动换行和合并单元格,查了很多资料,有在datagridview里的cellpaiting做修改的,要想达到预定效果的合并居中极其麻烦,并且没有看到同时达到自动换行的。又看了下用GDI自己绘制表格的,同样也觉得麻烦不小,而且我之前是把数据存在dataset里的,对GDI画的又不能像datagridview直接数据源导入,又有点复杂
priesthgink 2014-04-15
  • 打赏
  • 举报
回复
引用 4 楼 lyq8376 的回复:
[quote=引用 3 楼 priesthgink 的回复:]
那只能手动换行了: winform \r\n web <br> [/quote] ……………………手动换行………………有没有别的补救方法……有没有别的不是太复杂的,能有合并单元格和自动换行的表格显示方法呢
  • 打赏
  • 举报
回复
引用 3 楼 priesthgink 的回复:
那只能手动换行了: winform \r\n web <br>
priesthgink 2014-04-15
  • 打赏
  • 举报
回复
引用 2 楼 lyq8376 的回复:
在CellPainting事件对应方法中加上e.CellStyle.WrapMode = DataGridViewTriState.True; Cell被重绘了,不会再去调用DefaultCellStyle.WrapMode
在cellpaiting方法里加了这句,还是没用呢

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧