当前位置:编程学习 > C#/ASP.NET >>

超难的中国式树型报表, 100分求解决方案(在Web页面上显示出来)

超难的中国式树型报表, 求解决方案(在Web页面上显示出来)
因为查询条件就是WEB页面上的选择(chk)框.实际上就是动态组合查询报表
1、第一种统计查询(按年查询)的时候 ,如下显示      
                                                                 
     年查询                        送审项目数  送审金额  完成项目数  完成送审金额
    2007年                               10         80        6         45
    合计                                 10         80        6         45
2、第二种统计查询(按年及其级别查询)
      年查询     级别查询                          送审项目数  送审金额  完成项目数  完成送审金额
---------------------------------------------------------------------------
          |
          |A                                   6          50        4         30
    2007年|---------------------------------------------------------------------------
          |B                                   4          30        2         15
          |合计                                     10          80        6         45
---------------------------------------------------------------------------
3、第三种统计查询(按年,级别,分类查询)

  3、第三种统计查询(按年,级别,分类查询)

  年查询     级别查询    分类查询                              送审项目数  送审金额  完成项目数  完成送审金额
---------------------------------------------------------------------------
          |      
          |             分类一                             3          25        2         15
          | A           分类二                             2          15        1         10
          |             分类三                             1          10        1         5
          |
          |              合计                              6          50        4         30
    2007年---------------------------------------------------------------------------
          |      
          |             分类一                             2          15        1         10    
          | B           分类二                             1          5         1         5
          |             分类三                             1          10        0         0
          |
          |              合计                              4          30        2         15
          |
          | 合计                                            10         80        6         45  
---------------------------------------------------------------------------
。。。。还有各种查询,以此类推,根据用户的选择继续分组查询下次,相应的单元格也要补上
以上是用户选择第一种方式,第二种方式,第三种方式查询的结果。
其中:送审项目数为SJZB中的数据
      完成送审项目数为WCZB中的数据 --------------------编程问答-------------------- 大虾们,希望你们帮帮忙 --------------------编程问答-------------------- 因为查询条件就是WEB页面上的选择(chk)框.实际上就是动态组合查询报表 
++++++++++++++++++++++++++++++++++
没看出哪特别,最笨的方法,拼接选取值 传入逻辑处理  传值 返回值 ~~细节自己去想 --------------------编程问答-------------------- 就是查询方式,比如说按年,按分类等查询啊。 --------------------编程问答-------------------- select hj=null,a.SSXMS,a.SSZJ,b.WCXMS,b.WCSSZJ,b.WCSDZJ,b.WCSJE,b.WCSJL,c.WWCXMS
from
    (select count(*) SSXMS,isnull(sum(ASSZJ),0) SSZJ from allinfo where sjbh=sjbh)a,
    (select count(*) WCXMS,isnull(sum(Tsszj),0) WCSSZJ,isnull(sum(Tsdzj),0) WCSDZJ,isnull(sum(Tsje),0) WCSJE,
        isnull(sum(Tsje)/sum(Tsszj),0) WCSJL FROM Allcomplete where sjbh=sjbh)b,
    (select count(*) WWCXMS from allnone where sjbh=sjbh)c

以上的数据就是根据这种条件筛选出来的 --------------------编程问答-------------------- 如果你是要 分组式 的显示效果,用GridView,DataList嵌套就可以实现
如果你是想知道,如果设计业务逻辑,你在四楼的内容已经有一定的雏形,但还有问题~
别的,我真不知道你哪不明白? --------------------编程问答-------------------- 是啊,我知道要分组啊,问题是像这些前面添加的列你知道什么时候添加,添加几列?肯定不懂嘛 --------------------编程问答-------------------- 其实因为这个项目,我开了好几个CSDN,但是就没有人答,我又结帐了,重新问。就是希望大家帮忙 --------------------编程问答-------------------- ASP.NET2.0中给GridView动态添加模板列并自动绑定数据 
http://www.cnblogs.com/lmarsy/archive/2007/03/27/564634.html
--------------------编程问答-------------------- 晕哦。还是搞不定。有没有人说一下中。开了那么多,既然一个高手都没有。晕。CSDN难道是假的吗 --------------------编程问答-------------------- 用Repeater控件,table套table的方式。根据选择的分组条件,动态的嵌套table。将没种分组的数据绑定到对应的table中。 --------------------编程问答-------------------- 行列合并.
http://blog.csdn.net/nicewon/archive/2007/08/31/1767185.aspx --------------------编程问答-------------------- 问题是你怎么样动态Table --------------------编程问答-------------------- 关注 --------------------编程问答-------------------- 晕死了,我实在是做不出来了。 --------------------编程问答-------------------- 考虑一下第3中情况,如果先忽略合计,然后每行都加上冗余数据,那么输出看起来就是这样:
年查询           级别查询         分类查询         送审项目数     送审金额     完成项目数     完成送审金额 
--------------------------------------------------------------------------- 
2007年¦             A              分类一          3            25          2              15 
2007年¦             A               分类二         2            15          1              10 
2007年¦             A              分类三          1            10           1               5 
--------------------------------------------------------------------------- 
2007年¦              B             分类一          2            15          1               10         
2007年¦              B            分类二           1            5           1                5 
2007年¦              B             分类三          1           10          0                0 

这个不就是查询出来的原始数据? 
那么现在考虑在什么位置插入合计行. 这里有3层,那么当第1,2层数据改变时应该插入合计.比如 A变到了B,2007变到了2008 or 结束.
要能够检查到这些变化就要记录最后一次处理的行的数据, 比如用last[0]保存年,last[1]保存级别.同时用个变量level记录层数,这里,level=3

伪码:
while (i < level-1) last[i] = ""; // -1是因为最后一层不用合计
对每行数据
{
// 检查哪层数据出了变化
changedColumn = -1;
while(j<level-1)
{
if(last[j]!=currentRow.columns[j]) changedColumn = j;
break;
}
if(数据有变化, changedColumn>=0)
{
计算合计;
输出合计;
保存/重置合计;
}

输出一行数据 (输出这行数据的时候可以根据changedColumn来去除冗余的'2007,A'这样的数据);
保存currentRow到last数组 (last[0]=2007,last[1]=A);
}
思路是这样,懒的写代码了,你参考下吧. 所谓输出一行数据就是write出一些html tag. --------------------编程问答-------------------- 没有写过这些的。能有些代码吗?时间紧。没有时间去研究 --------------------编程问答-------------------- C#

<%@ Page Language="C#" AutoEventWireup="true" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
  ICollection CreateDataSource()
  {
    System.Data.DataTable dt = new System.Data.DataTable();
    System.Data.DataRow dr;
    dt.Columns.Add(new System.Data.DataColumn("学生姓名", typeof(System.String)));
    dt.Columns.Add(new System.Data.DataColumn("语文", typeof(System.Decimal)));
    dt.Columns.Add(new System.Data.DataColumn("数学", typeof(System.Decimal)));
    dt.Columns.Add(new System.Data.DataColumn("英语", typeof(System.Decimal)));
    for (int i = 0; i < 8; i++)
    {
      System.Random rd = new System.Random(Environment.TickCount * i); ;
      dr = dt.NewRow();
      dr[0] = "学生" + i.ToString();
      dr[1] = System.Math.Round(rd.NextDouble() * 100, 2);
      dr[2] = System.Math.Round(rd.NextDouble() * 100, 2);
      dr[3] = System.Math.Round(rd.NextDouble() * 100, 2);
      dt.Rows.Add(dr);
    }
    System.Data.DataView dv = new System.Data.DataView(dt);
    return dv;
  }

  protected void Page_Load(object sender, EventArgs e)
  {
    if (!IsPostBack)
    {

      GridView1.BorderColor = System.Drawing.Color.DarkOrange;
      GridView1.DataSource = CreateDataSource();
      GridView1.DataBind();
    }
  }

  protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
  {
    if (e.Row.RowType == DataControlRowType.Header)
    {
      GridViewRow rowHeader = new GridViewRow(0, 0, DataControlRowType.Header, DataControlRowState.Normal);
      rowHeader.BackColor = System.Drawing.Color.White;
      rowHeader.Font.Bold = true;

      TableCellCollection cells = e.Row.Cells;
      TableCell headerCell = new TableCell();
      headerCell.Text = "";
      rowHeader.Cells.Add(headerCell);

      headerCell = new TableCell();
      headerCell.Text = "学生成绩";
      headerCell.ColumnSpan = cells.Count - 1;
      headerCell.HorizontalAlign = HorizontalAlign.Center;

      rowHeader.Cells.Add(headerCell);
      rowHeader.Visible = true;
      GridView1.Controls[0].Controls.AddAt(0, rowHeader);
    }
  }

  protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
  {
    e.Row.Attributes.Add("style", "background:#FFF");
  }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>合并 GridView 的表头单元格</title>
</head>
<body>
  <form id="Form1" runat="server">
    <asp:GridView ID="GridView1" runat="server" CellSpacing="1" CellPadding="3"
      Font-Size="12px" Width="300px" BackColor="orange" BorderWidth="0"
      OnRowDataBound="GridView1_RowDataBound" OnRowCreated="GridView1_RowCreated">
    </asp:GridView>
  </form>
</body>
</html>


--------------------编程问答-------------------- 代码??? --------------------编程问答-------------------- 兄弟,你根据自己的需求进行改动吧!!!里面的数据都是我在页面创建的,不需要数据库!!! --------------------编程问答-------------------- 是的, --------------------编程问答--------------------

这事另外一种实现方式,你看那种适合你!!!
数据也是自己创建的Table


<%@ Page Language="C#" AutoEventWireup="true" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
// 计算数据,完全可以从数据库取得
ICollection CreateDataSource( )
{
System.Data.DataTable dt = new System.Data.DataTable();
System.Data.DataRow dr;
dt.Columns.Add(new System.Data.DataColumn("学生班级", typeof(System.String)));
dt.Columns.Add(new System.Data.DataColumn("学生姓名", typeof(System.String)));
dt.Columns.Add(new System.Data.DataColumn("语文", typeof(System.Decimal)));
dt.Columns.Add(new System.Data.DataColumn("数学", typeof(System.Decimal)));
dt.Columns.Add(new System.Data.DataColumn("英语", typeof(System.Decimal)));
dt.Columns.Add(new System.Data.DataColumn("计算机", typeof(System.Decimal)));

for (int i = 0; i < 8; i++)
{
System.Random rd = new System.Random(Environment.TickCount * i); ;
dr = dt.NewRow();
dr[0] = "班级" + i.ToString();
dr[1] = "学生" + i.ToString();
dr[2] = System.Math.Round(rd.NextDouble() * 100, 2);
dr[3] = System.Math.Round(rd.NextDouble() * 100, 2);
dr[4] = System.Math.Round(rd.NextDouble() * 100, 2);
dr[5] = System.Math.Round(rd.NextDouble() * 100, 2);
dt.Rows.Add(dr);
}
System.Data.DataView dv = new System.Data.DataView(dt);
return dv;
}

protected void Page_Load( object sender, EventArgs e )
{
if (!IsPostBack)
{
GridView1.BorderColor = System.Drawing.Color.DarkOrange;
GridView1.DataSource = CreateDataSource();
GridView1.DataBind();
}
}

protected void GridView1_RowCreated( object sender, GridViewRowEventArgs e )
{

if (e.Row.RowType == DataControlRowType.Header)
{
//创建一个GridViewRow,相当于表格的 TR 一行
GridViewRow rowHeader = new GridViewRow(0, 0, DataControlRowType.Header, DataControlRowState.Normal);
string HeaderBackColor = "#EDEDED";
rowHeader.BackColor = System.Drawing.ColorTranslator.FromHtml(HeaderBackColor);

//实现确定要显示的表头样式,也可以通过计算生成

// <tr>
// <td rowspan='2'>关键单元格</td>
// <td colspan='2'>表头文字</td>
// <td colspan='2'>表头文字</td>
// <td>表头文字</td>
// </tr>
// <tr bgcolor='#FFF'>
// <td colspan='2'>表头文字</td>
// <td rowspan='2'>表头文字</td>
// <td colspan='2'>表头文字</td>
// </tr>
// <tr bgcolor='#FFF'>
// <td>表头文字</td>
// <td>表头文字</td>
// <td>表头文字</td>
// <td>表头文字</td>
// <td>表头文字</td>";
// </tr>
// 上面的样式可以设置斜线

Literal newCells = new Literal();
newCells.Text = @"表头文字1</th>
<th colspan='2'>表头文字2</th>
<th colspan='2'>表头文字3</th>
<th>表头文字4</th>
</tr>
<tr bgcolor='" + HeaderBackColor + "'>";
newCells.Text += @" 
<th colspan='2'>表头文字5</th>
<th rowspan='2'>表头文字6</th>
<th colspan='2'>表头文字7</th>
</tr>
<tr bgcolor='" + HeaderBackColor + "'>";
newCells.Text += @" 
<th>表头文字8</th>
<th>表头文字9</th>
<th>表头文字10</th>
<th>表头文字11</th>
<th>表头文字12";

TableCellCollection cells = e.Row.Cells;
TableHeaderCell headerCell = new TableHeaderCell();
//下面的属性设置与 <td rowspan='2'>关键单元格</td> 要一致
headerCell.RowSpan = 2;
headerCell.Controls.Add(newCells);
rowHeader.Cells.Add(headerCell);

rowHeader.Cells.Add(headerCell);
rowHeader.Visible = true;

//添加到 GridView1
GridView1.Controls[0].Controls.AddAt(0, rowHeader);
}
}

protected void GridView1_RowDataBound( object sender, GridViewRowEventArgs e )
{
if (e.Row.RowType == DataControlRowType.Header)
{
e.Row.Attributes.Add("style", "background:#9999FF;color:#FFFFFF;font-size:14px");
}
else
{
e.Row.Attributes.Add("style", "background:#FFF");
}
}
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>为 GridView 添加多层表头</title>
</head>
<body>
<form id="Form1" runat="server">
<asp:GridView ID="GridView1" runat="server" CellSpacing="1" CellPadding="3" Font-Size="12px"
Width="600px" BackColor="#000000" BorderWidth="0" OnRowDataBound="GridView1_RowDataBound"
OnRowCreated="GridView1_RowCreated">
</asp:GridView>
</form>
</body>
</html>
--------------------编程问答-------------------- 实在不行,使用REPORT SERVICES,每个空格都是一个查询语句即可。 --------------------编程问答-------------------- 我看不到图片 --------------------编程问答-------------------- 不对,我要求横也要相应的添加行 --------------------编程问答-------------------- 你的理解就是前面那个2007要单元格合并. A,B也再继续合并,这点难度


我原来做的是根据参数读取数据后,看有多少行数据,合并单元格的形式直接构造自己的table. --------------------编程问答-------------------- 是啊。这些都要的。 --------------------编程问答-------------------- 25楼,你的结果是怎么样的呢?还有大家帮忙有那么难吗 --------------------编程问答-------------------- 话说要是完全写死不得 累死啊....到时候业务改一点...哭去吧...
楼主可以找找那种完全自定义的 报表插件....话说我也在找免费的...话说找到了互相分享一下啊 --------------------编程问答-------------------- http://www.cnblogs.com/waxdoll/archive/2006/07/30/463114.html
或许有楼主需要的答案
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,