合并的要点:

1.datagid的单元格合并原理是table中tr,td的布局实现;

2.合并的时机实在其datagridcreate事件中实现;

3.认识一个对象TableCellCollection,它是由TableCell组成的集合,TableCell可以看成一个标题.

实现下面的效果;

前台只有一个空DataGrid,后台源码如下:

 private DataTable dt = null;
protected void Page_Load(object sender, EventArgs e)
{
//数据源
dt = new DataTable();
dt.Columns.Add("姓名");
dt.Columns.Add("年龄");
dt.Columns.Add("住址");
dt.Columns.Add("公司");
dt.Columns.Add("邮件");
dt.Columns.Add("电话"); //绑定数据源
mydg.DataSource = dt;
mydg.DataBind(); } protected void mydg_ItemCreated(object sender, DataGridItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Header)
{
List<CellRule> ils = new List<CellRule>(); TableCellCollection tcc = e.Item.Cells;
tcc.Add(new TableCell());
tcc[].Text = dt.Columns[].ColumnName;
tcc[].Attributes.Add("rowspan", "");
tcc.Add(new TableCell());
tcc[].Text = dt.Columns[].ColumnName;
tcc[].Attributes.Add("rowspan", "");
tcc.Add(new TableCell());
tcc[].Attributes.Add("colspan", "");
tcc[].Text = "详细信息</th></tr><tr>";
tcc[].HorizontalAlign = HorizontalAlign.Center; tcc.Add(new TableCell());
tcc[].Text = dt.Columns[].ColumnName;
tcc.Add(new TableCell());
tcc[].Text = dt.Columns[].ColumnName;
tcc.Add(new TableCell());
tcc[].Text = dt.Columns[].ColumnName;
tcc.Add(new TableCell());
tcc[].Text = dt.Columns[].ColumnName; //ils.Add(new CellRule(2, 4, "详细信息"));
//OganizeTcc(e.Item.Cells, ils, dt);
}
}

再将合并表头单元格封装成通用的方法:

优化后的代码如下:

 private DataTable dt = null;
protected void Page_Load(object sender, EventArgs e)
{
//数据源
dt = new DataTable();
dt.Columns.Add("姓名");
dt.Columns.Add("年龄");
dt.Columns.Add("住址");
dt.Columns.Add("公司");
dt.Columns.Add("邮件");
dt.Columns.Add("电话"); //绑定数据源
mydg.DataSource = dt;
mydg.DataBind(); } protected void mydg_ItemCreated(object sender, DataGridItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Header)
{
List<CellRule> ils = new List<CellRule>(); //TableCellCollection tcc = e.Item.Cells;
//tcc.Add(new TableCell());
//tcc[0].Text = dt.Columns[0].ColumnName;
//tcc[0].Attributes.Add("rowspan", "2");
//tcc.Add(new TableCell());
//tcc[1].Text = dt.Columns[1].ColumnName;
//tcc[1].Attributes.Add("rowspan", "2");
//tcc.Add(new TableCell());
//tcc[2].Attributes.Add("colspan", "4");
//tcc[2].Text = "详细信息</th></tr><tr>";
//tcc[2].HorizontalAlign = HorizontalAlign.Center; //tcc.Add(new TableCell());
//tcc[3].Text = dt.Columns[2].ColumnName;
//tcc.Add(new TableCell());
//tcc[4].Text = dt.Columns[3].ColumnName;
//tcc.Add(new TableCell());
//tcc[5].Text = dt.Columns[4].ColumnName;
//tcc.Add(new TableCell());
//tcc[6].Text = dt.Columns[5].ColumnName; ils.Add(new CellRule(, , "详细信息"));
OganizeTcc(e.Item.Cells, ils, dt);
}
} private void OganizeTcc(TableCellCollection tcc, List<CellRule> ils, DataTable dt)
{
tcc.Clear();
ils = ils.OrderBy(p => p.iStart).ToList();
List<string> secHeaders = new List<string>();
//第一行
for (int i = , j = ; j < dt.Columns.Count;)
{
if (i >= ils.Count || ils[i].iStart != j)
{
tcc.Add(new TableCell());
tcc[tcc.Count - ].Text = dt.Columns[j].ColumnName;
tcc[tcc.Count - ].Attributes.Add("rowspan", "");
j++;
if (j == dt.Columns.Count)
tcc[tcc.Count - ].Text = tcc[tcc.Count - ].Text + "</th></tr><tr>";
}
else
{
for (int iSec = ; iSec < ils[i].iCount; iSec++)
{
secHeaders.Add(dt.Columns[j + iSec].ColumnName);
}
tcc.Add(new TableCell());
tcc[tcc.Count-].Text = ils[i].strHeaderText;
tcc[tcc.Count - ].Attributes.Add("colspan", ils[i].iCount.ToString());
tcc[tcc.Count - ].HorizontalAlign = HorizontalAlign.Center;
j = j + ils[i].iCount;
i++;
if(j == dt.Columns.Count)
tcc[tcc.Count-].Text = tcc[tcc.Count-].Text+"</th></tr><tr>";
} }
//第二行
foreach (string str in secHeaders)
{
tcc.Add(new TableCell());
tcc[tcc.Count - ].Text = str;
}
}

设定合并规则的实体类:

 public class CellRule
{
public int iStart { get; set; }
public int iCount { get; set; }
public string strHeaderText { get; set; }
public CellRule(int iStart, int iCount, string strHeaderText)
{
this.iStart = iStart;
this.iCount = iCount;
this.strHeaderText = strHeaderText;
}
}

现在只有一阶转二阶的方法,如果在搞成N阶通用的方法,我是暂时想不到了.就这样.

asp.net使用控件datagrid实现表头单元格合并的更多相关文章

  1. 【原创】Silverlight DataGrid对核心控件DataGrid的任意单元格进行获取和设置分析。

    前几天,公司同事有个需求需要对系统中的DataGrid控件的指定单元格(如图,申请人ID)进行禁用设置,尝试了很多次总是 整行整列的 禁用 没实现效果. 网上资料较少,没找到解决措施. 尽管silve ...

  2. ASP.NET数据绑定控件简介

    •数据绑定分为数据源和数据绑定控件两部分(①数据绑定控件通过数据源获取和修改数据②数据绑定控件通过数据源隔离数据提供者和数据使用者)数据绑定控件→数据源→数据库•数据源:SqlDataSource(连 ...

  3. 浅析五大ASP.NET数据控件

    转自:http://kb.cnblogs.com/page/69207/ 摘要:ASP.NET中有不少的控件,在这当中有一部分是用来处理数据的控件.在这里我们正要讨论的就是ASP.NET数据控件,希望 ...

  4. 【转】通用分页用户控件(DataGrid,DataList,Repeater都可以用它来分页)

    通用分页控件(DataGrid,DataList,Repeater都可以用它来分页) 1.建立用户控件Pager.ascx 1.1 html </ASP:LABEL></TD> ...

  5. 将ASP.NET用户控件转化为自定义控件

    将ASP.NET用户控件转化为自定义控件 作者:Kevin Cheng (程建和) 最后修改时间:2006-03-14 概述:如何将ASP.NET用户控件移植为ASP.NET自定义控件 关键字:Asp ...

  6. asp.net分页控件

    一.说明 AspNetPager.dll这个分页控件主要用于asp.net webform网站,现将整理代码如下 二.代码 1.首先在测试页面Default.aspx页面添加引用 <%@ Reg ...

  7. asp.net ajax控件tab扩展,极品啊,秒杀其它插件

    说明:asp.net ajax控件tab要设置width和height,而且在线文本编辑器放能够放入tab中,也必须是asp.net的控件型在线文本,例如fckeditor,下面是我设置好的配置. & ...

  8. javascript获取asp.net服务器端控件的值

    代码如下: <%@ Page Language="C#" CodeFile="A.aspx.cs" Inherits="OrderManage_ ...

  9. ASP.NET控件<ASP:Button /> html控件<input type="button">区别联系

    ASP.NET控件<ASP:Button />-------html控件<input type="button">杨中科是这么说的:asp和input是一样 ...

随机推荐

  1. 揭开Socket编程的面纱

    对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问: 1. 什么是TCP/IP.UDP? 2. Socket在哪里呢? 3. Sock ...

  2. 基础算法之插入排序Insertion Sort

    原理 通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元 ...

  3. SQL SERVER 2005 DBCC PAGE命令说明

    夏日福利: 小泽玛利亚的“专业摄影”性感写真集:http://947kan.com/video/player-52475-0-0.html ------------------------------ ...

  4. C++ map的遍历

    一般使用迭代器遍历比较方便. map<string,int> m; map<string,int>::iterator it; it = m.begin(); while(it ...

  5. Java—网络技术

    1  TCP Sockets基础 Sockets是一个编程抽象概念,它是网络上与另一个应用程序通信连接的句柄.Sockets编程将用户代码与TCP/IP协议堆栈的底层实现隔离开,允许用户灵活地实现自己 ...

  6. AngularJS-UI-Router

    涉及知识点: $stateProvider,$urlRouteProvider ui-href $stateParams,$state 1.如何引用依赖angular-ui-router angula ...

  7. iOS/OSX学习资源

    https://www.raywenderlich.com/  (Ray视频教学) http://wiki.jikexueyuan.com/project/swift/  (swift中文学习网站)

  8. asp.net链接数据库问题,设置收藏本站,设置主页

    SQL Server 2008附加数据库失败:无法打开物理文件拒绝访问解决方法 无法打开物理文件 "E:\SQLDATA\EMSXDB.mdf".操作系统错误 5:"5( ...

  9. FastReport4.6 组件安装

    要完整版不是官方版的试用版.下面包括有的文件 安装前请册除原有的FR控件. 1. "Tools|Environmet options..."中的"Library" ...

  10. win764位下安装mysql-5.6.22-x64启动服务报 系统错误 1067的解决办法

    本人电脑win7,64位,需要安装mysql服务器.版本:mysql-5.6.22-x64.安装完成后,在服务里面并没有mysql.于是在百度上搜了下,好多信息,最后把解决方法自己总结下. 在${pr ...