我们.net俱乐部的一位朋友需要一个gridview的多表头实现,现给出两种实现
方法一:
转自:http://blog.youkuaiyun.com/ankoe/archive/2007/10/29/1854361.aspx
表头定义说明:
表头定义方法:相邻父列头之间用'#'分隔,上级行与下级行用空格(' ')分隔,相邻未级子列头用逗号分隔(',').
表头定义示例:
A.两层

烟叶等级#级别#保山市 保山,小计#楚雄州 姚安,小计#大理州 宾川,大理,小计#红河州 建水,泸西,弥勒,石屏,小计#昆明市 富民,禄劝,小计#丽江市 华坪,宁蒗,小计#临沧市 沧源,凤庆,耿马,临翔,双江,永德,云县,镇康,小计#普洱市 景东,思茅,镇沅,小计#曲靖市 富源,陆良,罗平,师宗,宣威,小计#文山州 文山,小计#玉溪市 玉溪,小计#总计
B.三层

等级#级别#上期结存 件数,重量,比例#本期调入 收购调入 件数,重量,比例#本期发出 车间投料 件数,重量,比例#本期发出 产品外销百分比 件数,重量,比例#平均值
调用说明:使用时在GridView的RowCreated事件中加入下面代码调用
if
(e.Row.RowType
==
DataControlRowType.Header)

...
{
DynamicTHeaderHeplerdHelper=newDynamicTHeaderHepler();
stringheader="等级#级别#上期结存件数,重量,比例#本期调入收购调入件数,重量,比例#本期发出车间投料件数,重量,"
+"比例#本期发出产品外销百分比件数,重量,比例#平均值";

dHelper.SplitTableHeader(e.Row,header);
}
表头生成类:
//
//
***********************************************************************
//
Created:2007-10-29Author:ruijc
//
File:DynamicTHeaderHepler.cs
//
Description:动态生成复合表头帮助类
//
相邻父列头之间用'#'分隔,父列头与子列头用空格('')分隔,相邻子列头用逗号分隔(',').
//
***********************************************************************
using
System;
using
System.Data;
using
System.Configuration;
using
System.Web;
using
System.Web.Security;
using
System.Web.UI;
using
System.Web.UI.WebControls;
using
System.Web.UI.WebControls.WebParts;
using
System.Web.UI.HtmlControls;
using
System.Collections.Generic;
using
System.Collections;
public
class
DynamicTHeaderHepler

...
{
publicDynamicTHeaderHepler()

...{
//
//TODO:Addconstructorlogichere
//
}


/**////<summary>
///重写表头
///</summary>
///<paramname="targetHeader">目标表头</param>
///<paramname="newHeaderNames">新表头</param>
///<remarks>
///等级#级别#上期结存件数,重量,比例#本期调入收购调入件数,重量,比例#本期发出车间投料件数,重量,
///比例#本期发出产品外销百分比件数,重量,比例#平均值
///</remarks>

publicvoidSplitTableHeader(GridViewRowtargetHeader,stringnewHeaderNames)...{
TableCellCollectiontcl=targetHeader.Cells;//获得表头元素的实例
tcl.Clear();//清除元素
introw=GetRowCount(newHeaderNames);
intcol=GetColCount(newHeaderNames);
string[,]nameList=ConvertList(newHeaderNames,row,col);
intRowSpan=0;
intColSpan=0;
for(intk=0;k<row;k++)

...{
stringLastFName="";
for(inti=0;i<col;i++)

...{
if(LastFName==nameList[i,k]&&k!=row-1)

...{
LastFName=nameList[i,k];
continue;
}
else

...{
LastFName=nameList[i,k];
}
intbFlag=IsVisible(nameList,k,i,LastFName);
switch(bFlag)

...{
case0:
break;
case1:
RowSpan=GetSpanRowCount(nameList,row,k,i);
ColSpan=GetSpanColCount(nameList,row,col,k,i);
tcl.Add(newTableHeaderCell());//添加表头控件
tcl[tcl.Count-1].RowSpan=RowSpan;
tcl[tcl.Count-1].ColumnSpan=ColSpan;
tcl[tcl.Count-1].HorizontalAlign=HorizontalAlign.Center;
tcl[tcl.Count-1].Text=LastFName;
break;
case-1:

string[]EndColName=LastFName.Split(newchar[]...{','});

foreach(stringeNameinEndColName)...{
tcl.Add(newTableHeaderCell());//添加表头控件
tcl[tcl.Count-1].HorizontalAlign=HorizontalAlign.Center;
tcl[tcl.Count-1].Text=eName;
}
break;
}
}
if(k!=row-1)

...{//不是起始行,加入新行标签
tcl[tcl.Count-1].Text=tcl[tcl.Count-1].Text+"</th></tr><tr>";
}
}
}


/**////<summary>
///如果上一行已经输出和当前内容相同的列头,则不显示
///</summary>
///<paramname="ColumnList">表头集合</param>
///<paramname="rowIndex">行索引</param>
///<paramname="colIndex">列索引</param>
///<returns>1:显示,-1:含','分隔符,0:不显示</returns>
privateintIsVisible(string[,]ColumnList,introwIndex,intcolIndex,stringCurrName)

...{

if(rowIndex!=0)...{

if(ColumnList[colIndex,rowIndex-1]==CurrName)...{
return0;

}else...{
if(ColumnList[colIndex,rowIndex].Contains(","))

...{
return-1;

}else...{
return1;
}
}
}
return1;
}


/**////<summary>
///取得和当前索引行及列对应的下级的内容所跨的行数
///</summary>
///<paramname="ColumnList">表头集合</param>
///<paramname="row">行数</param>
///<paramname="rowIndex">行索引</param>
///<paramname="colIndex">列索引</param>
///<returns>行数</returns>
privateintGetSpanRowCount(string[,]ColumnList,introw,introwIndex,intcolIndex)

...{
stringLastName="";
intRowSpan=1;
for(intk=rowIndex;k<row;k++)

...{

if(ColumnList[colIndex,k]==LastName)...{
RowSpan++;

}else...{
LastName=ColumnList[colIndex,k];
}
}
returnRowSpan;
}


/**////<summary>
///取得和当前索引行及列对应的下级的内容所跨的列数
///</summary>
///<paramname="ColumnList">表头集合</param>
///<paramname="row">行数</param>
///<paramname="col">列数</param>
///<paramname="rowIndex">行索引</param>
///<paramname="colIndex">列索引</param>
///<returns>列数</returns>

privateintGetSpanColCount(string[,]ColumnList,introw,intcol,introwIndex,intcolIndex)...{
stringLastName=ColumnList[colIndex,rowIndex];

intColSpan=ColumnList[colIndex,row-1].Split(newchar[]...{','}).Length;
ColSpan=ColSpan==1?0:ColSpan;

for(inti=colIndex+1;i<col;i++)...{
if(ColumnList[i,rowIndex]==LastName)

...{

ColSpan+=ColumnList[i,row-1].Split(newchar[]...{','}).Length;
}
else

...{
LastName=ColumnList[i,rowIndex];
break;
}
}
returnColSpan;
}


/**/