合并的要点:

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. 数字图像处理作业使用OpenCV - 块提取

    今天要记录的是树图第二次作业的第二题,Image Patch Extraction.这个概念真的不难懂,但是如果要我实际写的话,还真的不知道要怎么去遍历图像矩阵来提取块.在此要多谢邓大神的热心帮助,告 ...

  2. loadrunner随笔1

    快捷键: 注释快捷键:  ctrl+alt+c 取消注释快捷键:ctrl+alt+u 开始录制快捷键: ctrl+r 运行时设置快捷键: f4 录制设置: ctrl + f7 查找和替换:ctrl + ...

  3. 简单谈一谈JavaScript中的变量提升的问题

    1,随笔由来 第一天开通博客,用于监督自己学习以及分享一点点浅见,不出意外的话,应该是一周一更或者一周两更.  此博客所写内容主要为前端工作中遇上的一些问题以及常见问题,在此基础上略微发表自己的一点浅 ...

  4. Windows 2008 R2+iis7.5环境下Discuz!X3论坛伪静态设置方法

    2008R2不是那么的普及,加上X3版新出不久,所以伪静态的设置教程比较少,今天搞出来了,其实很简单,那么下面给大家简要说明一下.因为iis7.5集成了url重写,那就就方便多了,首先安装好你的dz论 ...

  5. Android在代码中使用布局文件中的一个组件

    使用前必须要把组件与其父组件的关系断开,比如有一个组件的名称为scrollChildLayout,则可以使用下面的代码进行分离 ((ViewGroup)scrollChildLayout.getPar ...

  6. Node.js 事件循环

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高. Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发. Node.j ...

  7. Maven的配置

  8. 计划任务,机器码与注册码,Web服务

    01.计划任务的客户端配置 TScheduleTask 辅助结构内容: TScheduleRecord<ScheduleTask.pas> TScheduleRecord.Schedule ...

  9. css3选择器详解

    css中除了早先最早的,ID选择器,class选择器一些以外在css3中新加入了新的选择器,新选择器的使用大大的方便了我们的编程,下面我就说一些css3的选择器的使用方法, p       选择了所有 ...

  10. 利用Cayley-Hamilton theorem 优化矩阵线性递推

    平时有关线性递推的题,很多都可以利用矩阵乘法来解决. 时间复杂度一般是O(K3logn)因此对矩阵的规模限制比较大. 下面介绍一种利用利用Cayley-Hamilton theorem加速矩阵乘法的方 ...