GridView显示带有中国式报表表头的方法

来源:互联网 发布:设计大师知乎 编辑:程序博客网 时间:2024/05/17 01:22

   最近在做的项目包含报表,报表的显示可以用水晶报表的推/拉模式轻松解决,报表的录入这一部分采用的是GridView使用模板列进行录入,但用户提出录入页面要和报表的形式一样,但由于报表采用的是中国式表头,比较复杂。刚开始想到用Div做一个固定表头,在表头下面放置隐藏Header的GridView,并通过JS来控制表头的单元宽度随着GV的单元格大小改变的改变而改变,但这样做比较繁琐。后来发现GridView本身就可以设置多层表头。

方法如下:

   比如要做如下的报表表头

   [图片过宽,建议使用Chrome浏览器]

   


代码如下:

 

   protected void grvTest1_RowCreated(object sender, GridViewRowEventArgs e)    {        if (e.Row.RowType == DataControlRowType.Header)        {                //第一行表头,从左到右依次数单元格(只数第一行的单元格,不管它跨了几行还是几列)                    TableCellCollection tcHeader = targetHeader.Cells;                    tcHeader.Clear();                    tcHeader.Add(new TableHeaderCell());                     tcHeader.Add(new TableHeaderCell());                    tcHeader[0].Attributes.Add("rowspan", "3"); //设置单元格属性为竖跨三行                    tcHeader[0].Text = "";                    tcHeader.Add(new TableHeaderCell());                    tcHeader[1].Attributes.Add("rowspan", "3");                    tcHeader[1].Text = "编号";                    tcHeader.Add(new TableHeaderCell());                    tcHeader[2].Attributes.Add("colspan", "3"); //设置单元格属性为横跨三列                    tcHeader[2].Text = "占地面积(平方米)";                    tcHeader.Add(new TableHeaderCell());                    tcHeader[3].Attributes.Add("colspan", "2");                    tcHeader[3].Text = "图书(万册)";                    tcHeader.Add(new TableHeaderCell());                    tcHeader[4].Attributes.Add("colspan", "2");                    tcHeader[4].Text = "计算机数(台)";                    tcHeader.Add(new TableHeaderCell());                    tcHeader[5].Attributes.Add("rowspan", "3");                    tcHeader[5].Text = "多媒体教师座位数(个)";                    tcHeader.Add(new TableHeaderCell());                    tcHeader[6].Attributes.Add("rowspan", "3");                    tcHeader[6].Text = "语音实验室座位数(个)";                    tcHeader.Add(new TableHeaderCell());                    tcHeader[7].Attributes.Add("colspan", "5");                    tcHeader[7].Text = "固定资产总值(万元)</th></tr><tr>"; //“</th></tr><tr>”在每一行到最后一个单元格时                                                                             // 需要加上这个标记表示换下一行                     //第二行表头                    tcHeader.Add(new TableHeaderCell());                    tcHeader[8].Attributes.Add("rowspan", "2");                    tcHeader[8].Text = "计";                    tcHeader.Add(new TableHeaderCell());                    tcHeader[9].Attributes.Add("colspan", "2");                    tcHeader[9].Text = "其中:";                    tcHeader.Add(new TableHeaderCell());                    tcHeader[10].Attributes.Add("rowspan", "2");                    tcHeader[10].Text = "计";                    tcHeader.Add(new TableHeaderCell());                    tcHeader[11].Attributes.Add("rowspan", "2");                    tcHeader[11].Text = "其中:当年新增";                    tcHeader.Add(new TableHeaderCell());                    tcHeader[12].Attributes.Add("rowspan", "2");                    tcHeader[12].Text = "计";                    tcHeader.Add(new TableHeaderCell());                    tcHeader[13].Attributes.Add("rowspan", "2");                    tcHeader[13].Text = "其中:教学用计算机";                    tcHeader.Add(new TableHeaderCell());                    tcHeader[14].Attributes.Add("rowspan", "2");                    tcHeader[14].Text = "计";                    tcHeader.Add(new TableHeaderCell());                    tcHeader[15].Attributes.Add("colspan", "2");                    tcHeader[15].Text = "其中:教学、科研仪器设备资产值";                    tcHeader.Add(new TableHeaderCell());                    tcHeader[16].Attributes.Add("colspan", "2");                    tcHeader[16].Text = "其中:信息化设备资产值</th></tr><tr>";                      //第三行表头                    tcHeader.Add(new TableHeaderCell());                    tcHeader[17].Text = "绿化用地面积";                    tcHeader.Add(new TableHeaderCell());                    tcHeader[18].Text = "运动场地面积";                    tcHeader.Add(new TableHeaderCell());                    tcHeader[19].Text = "计";                    tcHeader.Add(new TableHeaderCell());                    tcHeader[20].Text = "其中:当年新增";                    tcHeader.Add(new TableHeaderCell());                    tcHeader[21].Text = "计";                    tcHeader.Add(new TableHeaderCell());                    tcHeader[22].Text = "其中:软件<th></tr><tr>";                     //第四行表头                    tcHeader.Add(new TableHeaderCell()); ;                    tcHeader[23].Text = "甲";                    tcHeader.Add(new TableHeaderCell());                    tcHeader[24].Text = "乙";                    for (int i = 25; i <= 38; i++)                    {                        tcHeader.Add(new TableHeaderCell());                        tcHeader[i].Text = (i - 24).ToString();                    }        }    }


运行效果如下:

[图片过宽,建议使用Chrome浏览器]

 

注意:在设值第一行第一列的单元格属性为N的话,那么“</th></tr><tr>"出现的次数应该也为N次