合并的要点:

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. c# 打乱数组

    有时候得到了一个List,我想把它随机排列一下顺序.而且如果针对不同类型的List都能用,就要用到泛型. 其实思想很简单,就是从原List中每次随机取一项,添加到新的List中,并在原List中删除. ...

  2. Codeforces Round #373 (Div. 2) E. Sasha and Array

    题目链接 分析:矩阵快速幂+线段树 斐波那契数列的计算是矩阵快速幂的模板题,这个也没什么很多好解释的,学了矩阵快速幂应该就知道的东西= =这道题比较巧妙的在于需要用线段树来维护矩阵,达到快速查询区间斐 ...

  3. Java开发工具安装步骤内容如下

    Java开发工具安装步骤内容如下 安装 开发工具 STS 链接下载网址 eclipse 链接下载网址 JDK安装 jdk链接下载地址 Marven环境 marven链接下载地址 Tomcat tomc ...

  4. Windows Store App 图像

    在Windows应用商店应用中可以使用两种方法来显示图片,这两种方法分别为使用Image对象和使用ImageBrush对象.Image对象可以直接呈现一幅图像,而ImageBrush对象则可以用一幅图 ...

  5. EF6 CodeFirst 实践系列文章列表

    2015 Jul.16 EF6 CodeFirst+Repository+Ninject+MVC4+EasyUI实践(一) 来自:wangweimutou 本系列源自对EF6 CodeFirst的探索 ...

  6. 【 2013 Multi-University Training Contest 6 】

    HDU 4655 Cut Pieces 假设n个数构成的总数都分成了n段,总数是n*a1*a2*...*an.但是答案显然不会那么多. 对于相邻的两个ai,ai+1,如果选择相同的颜色,那么就减少了a ...

  7. nginx 页面乱码问题

    在配置nginx时常常遇到网页乱码的问题如图: 这时需要在server段里面添加两行: default_type 'text/html'; charset utf-8; 然后执行测试  重启操作 ng ...

  8. ASP.NET MVC自定义ActionResult实现文件压缩

    有时候需要将单个或多个文件进行压缩打包后在进行下载,这里我自定义了一个ActionResult,方便进行文件下载 using System; using System.Collections; usi ...

  9. Bootstrap <基础二十二>超大屏幕(Jumbotron)

    Bootstrap 支持的另一个特性,超大屏幕(Jumbotron).顾名思义该组件可以增加标题的大小,并为登陆页面内容添加更多的外边距(margin).使用超大屏幕(Jumbotron)的步骤如下: ...

  10. PDA项目介绍

    开发工具:Microsoft Visual Studio 2008 SDK:      Windows Mobile 6 SDK 数据库:     Oracle 开发语言:C#(3.5) 版本控制工具 ...