概述
最近做项目时遇到一个需求----GridView合并单元格,需求结果如下图所示:
在网上找了很多资料,大多是一篇文章转载的,他们的方法貌似只能实现对某一列进行单独合并,合并效果类似下图:
显然,上图的合并结果并不符合实际需要,
栏位2应该是在栏位1的基础上进行合并
栏位3在栏位2的基础上进行合并针
......
针对这个问题,笔者对网上提供的函数进行了修改。
此处以IList<T>型数据绑定为例。将T换成自己的定义的类即可。
1.将要绑定到GridView上的数据集进行排序,按照需要合并的栏位顺序依次排序,
dataSource = dataSource.OrderBy(t => t.A).ThenBy(l => l.B).ThenBy(m => m.C).ThenBy(n => n.D).ToList();
如上,对数据源dataSource按照列A,B,C,D依次排序。
2.调用GridView合并单元格函数 private void GroupRows(GridView gridView, int cellNum)
详细代码已经贴在了文章中。
3.GroupRows(GridView gridView, int cellNum)函数目前只支持同一列中的相同行合并,并且默认从第1列(对应GridView的第0列)开始,
如果不需要从第1列开始合并,则可将程序中 if (cellNum == 0)//中的0,通过参数动态的传入即可。
private void GridViewBind(IList<T> dataSource)
{
// 先对数据源排序,之后才好对GridView进行单元格合并
if (dataSource != null)
{
dataSource = dataSource.OrderBy(t => t.A).ThenBy(l => l.B).ThenBy(m => m.C).ThenBy(n => n.D).ToList();
}
#region 合并单元格(必须从前往后合并)
GridViewInquiry.DataSource = dataSource;
GridViewInquiry.DataBind();
//对GridView第1,2,3,4,5列进行合并
GroupRows(GridViewInquiry, 0);
GroupRows(GridViewInquiry, 1);
GroupRows(GridViewInquiry, 2);
GroupRows(GridViewInquiry, 3);
GroupRows(GridViewInquiry, 4);
#endregion
}
/// <summary>
/// 控制GridView行号合并的方法。
/// 下一列合并结果将在前一列合并的基础上进行合并。
/// 如果GridView有多行需要合并,必须先从需要合并列的最前一列进行依次合并。
/// </summary>
/// <param name="gridView">需要合并的GridView</param>
/// <param name="cellNum">需要合并的第几列,列号从0开始</param>
private void GroupRows(GridView gridView, int cellNum)
{
int p = 0;
int rowSpan = 1;
int rowCount = gridView.Rows.Count;
for (int i = 1; i < rowCount; i++)
{
GridViewRow gvr = gridView.Rows[p];
GridViewRow gvrNext = gridView.Rows[i];
if (cellNum == 0)//针对第一列的情况
{
if (gvr.Cells[cellNum].Text == gvrNext.Cells[cellNum].Text)
{
rowSpan++;
gvrNext.Cells[cellNum].Visible = false;
if (i == rowCount - 1)
{
gvr.Cells[cellNum].RowSpan = rowSpan;
rowSpan = 1;
p = i;
break;
}
}
else
{
gvr.Cells[cellNum].RowSpan = rowSpan;
rowSpan = 1;
p = i;
continue;
}
}
else//针对除了第一列以外的情况
{
if (gvr.Cells[cellNum].Text == gvrNext.Cells[cellNum].Text && gvrNext.Cells[cellNum - 1].Visible == false)
{
rowSpan++;
gvrNext.Cells[cellNum].Visible = false;
if (i == rowCount - 1)
{
gvr.Cells[cellNum].RowSpan = rowSpan;
rowSpan = 1;
p = i;
break;
}
}
else
{
gvr.Cells[cellNum].RowSpan = rowSpan;
rowSpan = 1;
p = i;
continue;
}
}
}
}
笔者水平有限,该方法较为繁琐,如果有更好的方法,欢迎分享。
最后
以上就是长情美女为你收集整理的GridView合并单元格(已更新)的全部内容,希望文章能够帮你解决GridView合并单元格(已更新)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复