合并的要点:

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. Java_ToolKit用法

    转自:http://blog.sina.com.cn/s/blog_9e4556250100z5kv.html 此类是所有 Abstract Window Toolkit 实际实现的抽象超类.Tool ...

  2. 对HTML5校验 自定义验证信息

    在HTML5中,表单可以定义一个属性required来触发默认的校验机制,比如: <input type="text" required /> 弹出的错误提示默认为英文 ...

  3. php 保存到mysql数据库中的中文乱码

    近期又php项目,乱码是个头痛的问题 解决方法: 1,php 文件中 添加 header(“Content-Type: text/html; charset=utf-8"); 2,需要做数据 ...

  4. Python’s SQLAlchemy vs Other ORMs[转发 7] 比较结论

    Comparison Between Python ORMs For each Python ORM presented in this article, we are going to list t ...

  5. json转实体类

    VS快速生成JSON数据格式对应的实体 Json生成类在线生成工具 http://tool.sufeinet.com/Creater/JsonClassGenerator.aspx http://js ...

  6. HTML 表格<table><caption><th><tr><td><thead><tbody><tfoot><col><colgroup>

    <table>标签: 定义和用法: <table>标签定义HTML表格. 简单的HTML表格由table元素以及一个或多个tr.th或td元素组成. tr元素定义表格行,th元 ...

  7. b/s 读取多个FTP文件(图片,视频)压缩到服务器 下载到客户端

    其实需求是这样, 要做一键导出, 有图片,有照片,youhtml,存在不同的文件夹,每次下载都必须下载最新数据,因为FTP是随时更新的. 1.这要是一直下载下载,浏览器一直跳窗口,蛋疼的我都看不下去. ...

  8. ORBSLAM2与OPENCV3.1.0出错解决办法

    用opencv3.1.0做ORBSLAM2运行一下命令时cd ORB_SLAM2 chmod +x build.sh ./build.sh出错:/usr/bin/ld: CMakeFiles/mono ...

  9. oracle 存储过程访问其他用户的表

    用户user2想在存储过程中查询用户User1的表table1, 在PL/SQL中用user1登陆,执行以下语句即可: grant select on User1.table1 to user2;

  10. Qt:Drag-Drop操作在QGraphicsView及Model/View框架下的实现

    最近使用到Qt的Drag Drop功能,结合自己的例子写下来给大家分享一下.实现从QTreeView拖动Node到QGraphicsView上,以及QGraphicsView上item之间的拖动. 先 ...