构建Asp.Net2.0 GridView复合多层表头的几种方法

我们.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;
}


/**/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值