Winform DataGridView 合并单元格的问题

选中多个单元格、然后点击一个button,能将这些单元格合并成一个、怎么重写DataGridView能实现这个功能最好能有例子或者完整代码... 选中多个单元格、然后点击一个button,能将这些单元格合并成一个、怎么重写DataGridView能实现这个功能
最好能有例子或者完整代码
展开
 我来答
xiangjuan314
2016-03-03 · TA获得超过3.3万个赞
知道大有可为答主
回答量:2.9万
采纳率:0%
帮助的人:2867万
展开全部
DataGridView 没有提供合并单元格的功能,要实现合并单元格的功能就要在CellPainting事件中使用Graphics.DrawLine和 Graphics.DrawString 自己来“画”。
下面的代码可以对DataGridView第1列内容相同的单元格进行合并:
private void dgv_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
// 对第1列相同单元格进行合并
if (e.ColumnIndex == 0 && e.RowIndex != -1)
{
using
(
Brush gridBrush = new SolidBrush(this.dgv.GridColor),
backColorBrush = new SolidBrush(e.CellStyle.BackColor)
)
{
using (Pen gridLinePen = new Pen(gridBrush))
{
// 清除单元格
e.Graphics.FillRectangle(backColorBrush, e.CellBounds);
// 画 Grid 边线(仅画单元格的底边线和右边线)
// 如果下一行和当前行的数据不同,则在当前的单元格画一条底边线
if (e.RowIndex < dgv.Rows.Count - 1 &&
dgv.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);
// 画右边线
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 &&dgv.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;
}
}
}
xyz136299110
推荐于2016-01-27 · 超过60用户采纳过TA的回答
知道小有建树答主
回答量:251
采纳率:100%
帮助的人:147万
展开全部
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
#region 生成列头
if (e.Row.RowType == DataControlRowType.Header)
{
TableCellCollection tcHeader = e.Row.Cells;
tcHeader.Clear();

string sYear1 = Convert.ToDateTime(this.Start.Text.Trim()).Month <= 6 ? "上半年" : "下半年";
string sYear2 = Convert.ToDateTime(this.End.Text.Trim()).Month <= 6 ? "上半年" : "下半年";

tcHeader.Add(new TableHeaderCell());
tcHeader[0].Attributes.Add("bgcolor", "Red");
tcHeader[0].Attributes.Add("colspan", "5");

tcHeader[0].Text = this.Start.Text.Trim().Substring(2, 2) + "年" + sYear1 + "与" + this.End.Text.Trim().Substring(2, 2) + sYear2 + "对比</th></tr><tr>";

//第二行表头
tcHeader.Add(new TableHeaderCell());
tcHeader[1].Attributes.Add("bgcolor", "DarkSeaGreen");
tcHeader[1].Attributes.Add("rowspan", "2");
tcHeader[1].Text = "按销售趋势";
tcHeader.Add(new TableHeaderCell());
tcHeader[2].Attributes.Add("bgcolor", "LightSteelBlue");
tcHeader[2].Attributes.Add("rowspan", "2");
tcHeader[2].Text = "客户数";

tcHeader.Add(new TableHeaderCell());
tcHeader[3].Attributes.Add("bgcolor", "DarkSeaGreen");
tcHeader[3].Attributes.Add("rowspan", "2");
tcHeader[3].Text = "差额";
tcHeader.Add(new TableHeaderCell());
tcHeader[4].Attributes.Add("bgcolor", "LightSteelBlue");
tcHeader[4].Attributes.Add("colspan", "2");
tcHeader[4].Text = "销售金额累计</th></tr><tr>";

//第三行表头
tcHeader.Add(new TableHeaderCell());
tcHeader[5].Attributes.Add("bgcolor", "Khaki");
tcHeader[5].Text = Start.Text.Substring(2, 2) + "年" + sYear1;
tcHeader.Add(new TableHeaderCell());
tcHeader[6].Attributes.Add("bgcolor", "Khaki");
tcHeader[6].Text = End.Text.Substring(2, 2) + "年" + sYear2;
}
#endregion
if (e.Row.RowType == DataControlRowType.DataRow)
{
if (e.Row.RowIndex >= 0)
{
if (e.Row.Cells[0].Text == "1")
{
e.Row.Cells[0].Text = "↑";
}
if (e.Row.Cells[0].Text == "-1")
{
e.Row.Cells[0].Text = "↓";
}
if (e.Row.Cells[2].Text.Trim().Contains("&"))
{
e.Row.Cells[2].Text = "¥0";
}
if (e.Row.Cells[3].Text.Trim().Contains("&"))
{
e.Row.Cells[3].Text = "¥0";
}
if (e.Row.Cells[4].Text.Trim().Contains("&"))
{
e.Row.Cells[4].Text = "¥0";
}
VarAllNum += Convert.ToInt32(e.Row.Cells[1].Text);
SubMoney += Convert.ToDouble(e.Row.Cells[2].Text.Substring(1));
leftMoney += Convert.ToDouble(e.Row.Cells[3].Text.Substring(1));
RightMoney += Convert.ToDouble(e.Row.Cells[4].Text.Substring(1));
}
}
if (e.Row.RowType == DataControlRowType.Footer)
{
e.Row.Cells[0].Text = "合计";
e.Row.Cells[1].Text = (VarAllNum.ToString());
e.Row.Cells[2].Text = string.Format("{0:C0}", SubMoney);
e.Row.Cells[3].Text = string.Format("{0:C0}", leftMoney);
e.Row.Cells[4].Text = string.Format("{0:C0}", RightMoney);
}
}
这个只是其中的一种,还有一种是在GridView1_RowCreated事件里写。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式