C#中DataGridView的单元格合并问题

wolfmvp 2008-12-13 09:17:36
本人初学编程,没有经验。想了解一下,C# Windows Form应用程序下的一个问题。DataGridView中合并相同内容的单元格,也就是说,相同的项合并为一条记录显示在一个单元格内。或者,像Excel中“合并单元格”的功能一样,先选定要合并的单元格,然后在添加一个ButtonClick事件去执行操作。
...全文
2137 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
青天流雲 2012-08-27
  • 打赏
  • 举报
回复
学习了,但是不像是我想要的
yelisen 2011-06-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zhengyl79 的回复:]
合并单元格我刚做完,需要重绘单元格。在下面这个事件里写就可以了,下面这个例子只是对第一列中内容相同的数据合并,你可以根据自己的实际情况做调整,我是写了一个控件,可以随时设定合并哪一列,一次合并几行数据。
private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)

如果我的datagridview是通过图形化绑定了数据源来显示数据,我的数据库有一张订单表,两个主键字段:1.主单号字段为:日期+4位流水号,2.序列号;一个主单号可以对应任意多条序列号记录。
datagridview中如何实现同一主单号只显示在一个大的合并了的单元格中,它的右边按正常对应列出各个序列号的记录。
mochencui 2008-12-19
  • 打赏
  • 举报
回复
qiang 这都想地出来
wolfmvp 2008-12-19
  • 打赏
  • 举报
回复
先谢谢这位大哥,明天我去公司调试一下,无论能不能通过,都散分!就冲大家的热情,就应该给!
zhengyl79 2008-12-19
  • 打赏
  • 举报
回复
合并单元格我刚做完,需要重绘单元格。在下面这个事件里写就可以了,下面这个例子只是对第一列中内容相同的数据合并,你可以根据自己的实际情况做调整,我是写了一个控件,可以随时设定合并哪一列,一次合并几行数据。
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;
}
}

}
}
gsmlove 2008-12-19
  • 打赏
  • 举报
回复
Up,mark
wolfmvp 2008-12-19
  • 打赏
  • 举报
回复
现在做合并的是DataGridView控件,不是GridView控件,它们两者有差别。并且,我想了解一下,在Windows Forms下DataGridView的合并问题,谢谢各位的指导!
gxlqssjf 2008-12-15
  • 打赏
  • 举报
回复
可以用数据库进行实现,就是用SQL语句然后再显示出来。其它的不懂,关注中
wolfmvp 2008-12-15
  • 打赏
  • 举报
回复
对这个控件不了解,在网上查到的资料也有限。中间代码写出来总错,能不能提供点关键代码,谢谢了!
泡面之夏 2008-12-15
  • 打赏
  • 举报
回复
效果图:

后台代码:
public partial class _Default : System.Web.UI.Page
{
SqlConnection sqlcon;
SqlCommand sqlcom;
string strCon = "Data Source=(local);Database=北风贸易;Uid=sa;Pwd=sa";
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
bind();

}
}
protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
GridView1.EditIndex = e.NewEditIndex;
bind();
}
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
sqlcon = new SqlConnection(strCon);
string sqlstr = "update 飞狐工作室 set 姓名='"
+ ((TextBox)(GridView1.Rows[e.RowIndex].Cells[1].Controls[0])).Text.ToString().Trim() + "',家庭住址='"
+ ((TextBox)(GridView1.Rows[e.RowIndex].Cells[3].Controls[0])).Text.ToString().Trim() + "' where 身份证号码='"
+ GridView1.DataKeys[e.RowIndex].Value.ToString() + "'";
sqlcom=new SqlCommand(sqlstr,sqlcon);
sqlcon.Open();
sqlcom.ExecuteNonQuery();
sqlcon.Close();
GridView1.EditIndex = -1;
bind();
}
protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
GridView1.EditIndex = -1;
bind();
}
public void bind()
{
string sqlstr = "select top 10 * from 飞狐工作室";
sqlcon = new SqlConnection(strCon);
SqlDataAdapter myda = new SqlDataAdapter(sqlstr, sqlcon);
DataSet myds = new DataSet();
sqlcon.Open();
myda.Fill(myds, "飞狐工作室");
GridView1.DataSource = myds;
GridView1.DataKeyNames = new string[] { "身份证号码" };
GridView1.DataBind();
sqlcon.Close();
}
//这里就是解决方案
protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
{
switch (e.Row.RowType)
{
case DataControlRowType.Header:
//第一行表头
TableCellCollection tcHeader = e.Row.Cells;
tcHeader.Clear();
tcHeader.Add(new TableHeaderCell());
tcHeader[0].Attributes.Add("rowspan", "3"); //跨Row
tcHeader[0].Attributes.Add("bgcolor", "white");
tcHeader[0].Text = "";
tcHeader.Add(new TableHeaderCell());
//tcHeader[1].Attributes.Add("bgcolor", "Red");
tcHeader[1].Attributes.Add("colspan", "6"); //跨Column
tcHeader[1].Text = "全部信息</th></tr><tr>";
//第二行表头
tcHeader.Add(new TableHeaderCell());
tcHeader[2].Attributes.Add("bgcolor", "DarkSeaGreen");
tcHeader[2].Text = "身份证号码";
tcHeader.Add(new TableHeaderCell());
tcHeader[3].Attributes.Add("bgcolor", "LightSteelBlue");
tcHeader[3].Attributes.Add("colspan", "2");
tcHeader[3].Text = "基本信息";
tcHeader.Add(new TableHeaderCell());
tcHeader[4].Attributes.Add("bgcolor", "DarkSeaGreen");
tcHeader[4].Text = "福利";
tcHeader.Add(new TableHeaderCell());
tcHeader[5].Attributes.Add("bgcolor", "LightSteelBlue");
tcHeader[5].Attributes.Add("colspan", "2");
tcHeader[5].Text = "联系方式</th></tr><tr>";
//第三行表头
tcHeader.Add(new TableHeaderCell());
tcHeader[6].Attributes.Add("bgcolor", "Khaki");
tcHeader[6].Text = "身份证号码";
tcHeader.Add(new TableHeaderCell());
tcHeader[7].Attributes.Add("bgcolor", "Khaki");
tcHeader[7].Text = "姓名";
tcHeader.Add(new TableHeaderCell());
tcHeader[8].Attributes.Add("bgcolor", "Khaki");
tcHeader[8].Text = "出生日期";
tcHeader.Add(new TableHeaderCell());
tcHeader[9].Attributes.Add("bgcolor", "Khaki");
tcHeader[9].Text = "薪水";
tcHeader.Add(new TableHeaderCell());
tcHeader[10].Attributes.Add("bgcolor", "Khaki");
tcHeader[10].Text = "家庭住址";
tcHeader.Add(new TableHeaderCell());
tcHeader[11].Attributes.Add("bgcolor", "Khaki");
tcHeader[11].Text = "邮政编码";
break;
}
}
}
前台:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>GridView合并多重表头表头 清清月儿http://blog.csdn.net/21aspnet </title>
</head>
<body >
<form id="form1" runat="server">
<div >
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" CellPadding="3" OnRowEditing="GridView1_RowEditing"
OnRowUpdating="GridView1_RowUpdating" OnRowCancelingEdit="GridView1_RowCancelingEdit" BackColor="White" BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px" Font-Size="12px" OnRowCreated="GridView1_RowCreated" >
<FooterStyle BackColor="White" ForeColor="#000066" />
<Columns>
<asp:CommandField HeaderText="编辑" ShowEditButton="True" />
<asp:BoundField DataField="身份证号码" HeaderText="编号" ReadOnly="True" />
<asp:BoundField DataField="姓名" HeaderText="姓名" />
<asp:BoundField DataField="出生日期" HeaderText="邮政编码" />
<asp:BoundField DataField="起薪" HeaderText="起薪" />
<asp:BoundField DataField="家庭住址" HeaderText="家庭住址" />
<asp:BoundField DataField="邮政编码" HeaderText="邮政编码" />

</Columns>
<RowStyle ForeColor="#000066" />
<SelectedRowStyle BackColor="#669999" Font-Bold="True" ForeColor="White" />
<PagerStyle BackColor="White" ForeColor="#000066" HorizontalAlign="Left" CssClass="ms-formlabel DataGridFixedHeader"/>
<HeaderStyle BackColor="#006699" Font-Bold="True" ForeColor="White" />
</asp:GridView>
</div>
</form>
</body>
</html>
heshl 2008-12-15
  • 打赏
  • 举报
回复
先用RowFilter筛选出相同行,或者用table.select()方法,选出来后,把选出来的第一行,也就0行保留,其他行的内容循环加到0行相应的Cell上就是了
yuyu622 2008-12-15
  • 打赏
  • 举报
回复
只能把单元格重绘了自己画上去。
呦呦 2008-12-14
  • 打赏
  • 举报
回复
学习学习
zoOoz 2008-12-14
  • 打赏
  • 举报
回复
no way!

111,097

社区成员

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

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

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