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

gridview中增加统计行碰到的问题求救?

字段如下:公司名称,公司具体部门,公司具体部门的销售量。差不多就这三个分类。然后要求的是这个gridview不仅仅只是显示的效果,而且具有统计的功能,最后的效果想达到这样。
公司      部门        人员    销售量
Company1 computer    pp1      200
           Computer    pp2      400
           Computer    pp3      200
           Computer    小计    800
           Huoyun     pp4       400
           Huoyun     小计      400
           Xinxiao     pp5       600
           Xinxiao     pp6        700
           Xinxiao     小计       1300
Company1              总计      sum(上面小计之和)
 从网上找了一些文章,发现都是在gridview的页脚部分进行总计操作,但是一个gridview只能有一个页脚,所以如何统计上面的那些小计部分呢,这也是目前项目中碰到的问题,目前还没有解决,如果网上的朋友有人有这个的解决方案,能否告知,谢谢。
--------------------编程问答-------------------- 分Grid表示 Grid动态和数据绑定以及页脚生成都动态通过编码实现 --------------------编程问答-------------------- 分Grid表示,能否说详细点呢。怎么细分呢,每个部门的小计如何通过分grid嵌入进去呢? --------------------编程问答-------------------- 小计还是用sql 实现比较ok --------------------编程问答-------------------- 可以在GridView的ItemTemplate中自己编辑GridView的显示,不用管它原来是什么样的,自己想显示成什么样 就显示成什么样子,然后在EditTemplate中设计GridView在编辑时的显示。 --------------------编程问答-------------------- 3楼的办法可行,最好在sql里面处理,在存储过程里面加入个临时表,把某类的小计添加到该类的后面.然后返回临时表.最后的合计用楼主的方法即可. --------------------编程问答-------------------- 请问saqua,您讲的itemTemplate里面涉及到的只是相应的模板列吧,我这里只是想增加一些行,所以请问有何建议,谢谢。 --------------------编程问答-------------------- michaelowenii ,lovelizheng ,您们好,您们的想法我也都考虑到了。我一直认为gridview是不是只能在页脚的地方增加一行,而在gridview显示数据的中间是不可以加入一行的,但实际可不可以我也想问大家,
但是如果在gridview显示数据的中间无法加入一行小计的话,那么我想要不我在表格里面做手脚,就是在显示之前,我根据不同的要求计算出不同的小计,然后加入到当前这个数据库中,然后在显示的时候,因为这个小计的记录和前面的具体的记录之间应该有部门这个关键字联系着的,所以我在显示的时候,顺便也会从数据库中取出这个小计那一行,然后显示就是,但是这里有一个问题,新出来的这行小计她从某种意思上说是id最大的那条记录,但是我在程序里面并不是按照id大小来排列的,而是按照部门,部门人员什么的进行排序的,所以这种情况可能存在一个问题,就是再显示的时候,“小计”那一行不是显示在最后,而是显示再前面,所以不知道怎么解决了。而且这些加入到这个表内的临时统计数目如何去除他们呢,也是个问题?
当然lovelizheng 您提出的写入到临时表,但是如何把这个临时表内的记录和你的总表内部建立起联系呢。。。如何在gridview中显示完这一部门后,然后就加入这个临时表内的某一个对应的记录呢。请问这个直接怎么保持联系?麻烦请告知。
上面的方法都是利用到了中间的一个辅助环节,但是最好的就是gridview本身就能实现这个,但我不知道怎么实现,如果大家有想法,有建议都可以提,谢谢。
--------------------编程问答-------------------- 不知你的数据源是否是datatable,我的想法是使用datatable来构建gridview里面的数据,不过这样貌似比较复杂,需要结合楼上几位的思路.

使用datable来构建出gridview或datalist,通过宣州datatable的row跟column这样来达到你的表数据显示形式,至于数据统计方面应该可以分离出来吧.

以上属个人思路.

建议看一下这个:
如何通过动态生成Html灵活实现DataGrid分类统计的界面显示功能
http://www.dezai.cn/Article_Show.asp?ArticleID=20428


关注中.

--------------------编程问答-------------------- 我给你贴代码........

 protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.Footer)
        {
            //……在页脚中显示统计数据……
            decimal inout_amount = 0;  //进退货单
           
            for (int i = 0; i <= GridView1.Rows.Count - 1; i++)
            {
                // value += Convert.ToInt64(GridView1.Rows[i].Cells[5].Text);
                GridViewRow row = this.GridView1.Rows[i];
                inout_amount += Convert.ToDecimal(row.Cells[5].Text.ToString());
               
//Cells[5]这里被我写死掉了 ..你自己看看在那哪一列哦.....呵呵...
            }
            e.Row.Cells[5].Text =  inout_amount.ToString("0.00");  //进退货单
            e.Row.Cells[5].HorizontalAlign = HorizontalAlign.Right;
          
        }
    }
--------------------编程问答-------------------- 很简单.


1\每条SQL语句通计出一个部门的销售额.

假设 a是销售量  B为总额计算  c1为部门1   ,c2为部门2

sql="Selet 部门,人员,a, sum(a) as b  From 表 where 部门=c1"

dataset ds=sql结果


//加入一列计算总额的行.
DataRow NR = ds.Tables[0].NewRow();
ds.Tables[0].Rows.Insertat(NR);
        ds.Tables[0].Rows[1]["部门"] =ds2.table[0].rows["部门"] ;    //相应部门
        ds.Tables[0].Rows[2]["人员"] ="小计" ;     //人员对应列为小计
        ds.Tables[0].Rows[2]["销售"] =ds2.table[0].rows["b"] ;   //加入总额


//以下取得第二个部门的数据,循环再写入ds

sql2="Selet 部门,人员,a, sum(a) as b From 表 where 部门=c2"
ds2=sql2的结果

for(ds2.rows.count  --具体自己写)
{
        ds.Tables[0].Rows.Insertat(NR);
        ds.Tables[0].Rows[1]["部门"] =ds2.table[0].rows["部门"] ;
        ds.Tables[0].Rows[2]["人员"] =ds2.table[0].rows["人员"] ;
        ds.Tables[0].Rows[2]["销售量"] =ds2.table[0].rows["a"] ;
}
gridview.dataxxx=ds.table[0];
gridview.databind()


以上的做法是二个部门了,在Foot脚部加统计很简单,网上有就不多说了.上面的代码是方案,写法请在VS2005中再调试吧.

当然,这取决于你们的部门数量,如果只有二三个,就这样就解决了.


其实方法原理就是:读取多次数据出来,再重新往Dataset里一行一行增加数据. --------------------编程问答-------------------- 楼主,我对你的表设计不清楚,假设你的表分为:公司表(Tabcompany),公司部门表(TabDep),部门人员销售明细表(Tabsaler),我把我的思路解说如下:
在存储过程中做如下处理,代码如下:
declare Table @temp (ID int,Company nvarchar(256),depName nvarchar(256),pepole nvarchar(256),salenum int,totalDep as int)
declare cursor @curTemp 
select a.id,b.id from  Tabcompany as a, TabDep as b group by a.id,b.id

Open @curTemp 
Declare @temCOMID INT
DECLARE @tempDEPID INT
SET @tempCOMID =0
SET @tempDEPID = 0

DECLARE @IFChangeDEPID INT
SET @IFCHANGEDEPID = 0

FETCH NEXT FROM CursorPclassCopy INTO @tempCOMID,@tempDEPID


insert into @temp (id,company,depName,pepole,salenum)
select a.id as id , a.部门名称 as company,b.name as depName,c.people as pepole, c.salenum as salenum 
from Tabcompany as a
inner join TabDep as b on b.Commid = a.ID
INNER JOIN Tabsaler as c ON C.DepID = B.ID
where ......(条件你自己根据需要来.) AND A.ID = @tempCOMID AND B.ID = @tempDEPID
group by a.id,a.部门名称,b.id,b.name ,c.id,c.people 

@IFCHANGEDEPID = @tempDEPID

WHILE (@@FETCH_STATUS = 0 )
BEGIN 
IF(@IFCHANGEDEPID <> @tempDEPID AND @IFCHANGEDEPID <> 0)
 Begin
   insert into @temp (id,company,depName,pepole,salenum)
   SELECT '这个ID你自己把握如何处理',a.name,b.name,c.name,'小计',fnk_Total(a.id,b.id,c.id)(为自定义函数,用来统计部门小计) as salenum from ..............

 END

END 

select id,company,depName,pepole,salenum,totalDep from @temp

这样返回的就是个集合,你直接将dataTable返回,直接赋值给Gridview即可.其中的排序应该是正常的的,不是太详细,你自己领会吧.
  --------------------编程问答-------------------- /* 直接用SQL实现 */
--创建环境
drop table tt
create table tt(mydate datetime,busNum varchar(10),goodsNum varchar(10),goodsName varchar(10),XF int,TF int,tel varchar(10))
    insert into tt  select '2007/10/8','K123','aaa111','XO',1000,0,'5849568'
              union select '2007/10/8','K123','aaa222','篮球',0,200,'2849598'
              union select '2007/10/8','D333','aaa333','自行车',0,200,'5946785'
              union select '2007/10/8','D333','aaa555','苹果',0,100,'6584795'
              union select '2007/10/8','F555','aaa598','法拉里',100,0,'3359468'
              union select '2007/10/8','F555','aaa123','科比战靴',0,2500,'3462159'

--初始数据
select * from tt
日期                       车号   货物编号    货物名称 现付     提付     电话  
------------------------------------------------------------------------
2007-10-08 00:00:00.000    D333    aaa333    自行车    0    200    5946785
2007-10-08 00:00:00.000    D333    aaa555    苹果    0    100    6584795
2007-10-08 00:00:00.000    F555    aaa123    科比战靴    0    2500    3462159
2007-10-08 00:00:00.000    F555    aaa598    法拉里    100    0    3359468
2007-10-08 00:00:00.000    K123    aaa111    XO    1000    0    5849568
2007-10-08 00:00:00.000    K123    aaa222    篮球    0    200    2849598

--执行SQL语句
select a.mydate,a.busNum,a.goodsNum,a.goodsName,a.XF,a.TF,a.tel from
(
select convert(varchar(10),mydate,111) as mydate,busNum,goodsNum,goodsName,XF,TF,tel,1 as myTemp,busNum as bn from tt 
union
select '小计',null,null,null,sum(XF),sum(TF),null,2 as myTemp,max(busNum) as bn from tt group by busNum
union
select '总计',null,null,null,sum(XF),sum(TF),null,3 as myTemp,max(busNum) as bn from tt
) a order by a.bn,a.myTemp

--查询结果
日期              车号   货物编号    货物名称 现付     提付     电话  
------------------------------------------------------------------------
2007/10/08    D333    aaa333    自行车    0    200    5946785
2007/10/08    D333    aaa555    苹果    0    100    6584795
小计             NULL    NULL    NULL    0    300    NULL
2007/10/08    F555    aaa123    科比战靴    0    2500    3462159
2007/10/08    F555    aaa598    法拉里    100    0    3359468
小计             NULL    NULL    NULL    100    2500    NULL
2007/10/08    K123    aaa111    XO    1000    0    5849568
2007/10/08    K123    aaa222    篮球    0    200    2849598
小计             NULL    NULL    NULL    1000    200    NULL
总计             NULL    NULL    NULL    1100    3000    NULL


--如果你不想显示NULL,可以执行以下代码

select a.mydate,isnull(a.busNum,''),isnull(a.goodsNum,''),isnull(a.goodsName,''),a.XF,a.TF,isnull(a.tel,'') from
(
select convert(varchar(10),mydate,111) as mydate,busNum,goodsNum,goodsName,XF,TF,tel,1 as myTemp,busNum as bn from tt 
union
select '小计',null,null,null,sum(XF),sum(TF),null,2 as myTemp,max(busNum) as bn from tt group by busNum
union
select '总计',null,null,null,sum(XF),sum(TF),null,3 as myTemp,max(busNum) as bn from tt
) a order by a.bn,a.myTemp


--查询结果

日期              车号   货物编号    货物名称 现付     提付     电话  
------------------------------------------------------------------------
2007/10/08    D333    aaa333    自行车    0    200    5946785
2007/10/08    D333    aaa555    苹果    0    100    6584795
小计                         0    300    
2007/10/08    F555    aaa123    科比战靴    0    2500    3462159
2007/10/08    F555    aaa598    法拉里    100    0    3359468
小计                         100    2500    
2007/10/08    K123    aaa111    XO    1000    0    5849568
2007/10/08    K123    aaa222    篮球    0    200    2849598
小计                         1000    200    
总计                         1100    3000    
--------------------编程问答--------------------
--创建环境
drop table tt
create table tt(mydate datetime,busNum varchar(10),goodsNum varchar(10),goodsName varchar(10),XF int,TF int,tel varchar(10))
    insert into tt  select '2007/10/8','K123','aaa111','XO',1000,0,'5849568'
              union select '2007/10/8','K123','aaa222','篮球',0,200,'2849598'
              union select '2007/10/8','D333','aaa333','自行车',0,200,'5946785'
              union select '2007/10/8','D333','aaa555','苹果',0,100,'6584795'
              union select '2007/10/8','F555','aaa598','法拉里',100,0,'3359468'
              union select '2007/10/8','F555','aaa123','科比战靴',0,2500,'3462159'

--初始数据
select * from tt
日期                       车号   货物编号    货物名称 现付     提付     电话  
------------------------------------------------------------------------
2007-10-08 00:00:00.000    D333    aaa333    自行车    0    200    5946785
2007-10-08 00:00:00.000    D333    aaa555    苹果    0    100    6584795
2007-10-08 00:00:00.000    F555    aaa123    科比战靴    0    2500    3462159
2007-10-08 00:00:00.000    F555    aaa598    法拉里    100    0    3359468
2007-10-08 00:00:00.000    K123    aaa111    XO    1000    0    5849568
2007-10-08 00:00:00.000    K123    aaa222    篮球    0    200    2849598

--执行SQL语句
select a.mydate,a.busNum,a.goodsNum,a.goodsName,a.XF,a.TF,a.tel from
(
select convert(varchar(10),mydate,111) as mydate,busNum,goodsNum,goodsName,XF,TF,tel,1 as myTemp,busNum as bn from tt 
union
select '小计',null,null,null,sum(XF),sum(TF),null,2 as myTemp,max(busNum) as bn from tt group by busNum
union
select '总计',null,null,null,sum(XF),sum(TF),null,3 as myTemp,max(busNum) as bn from tt
) a order by a.bn,a.myTemp

--查询结果
日期              车号   货物编号    货物名称 现付     提付     电话  
------------------------------------------------------------------------
2007/10/08    D333    aaa333    自行车    0    200    5946785
2007/10/08    D333    aaa555    苹果    0    100    6584795
小计             NULL    NULL    NULL    0    300    NULL
2007/10/08    F555    aaa123    科比战靴    0    2500    3462159
2007/10/08    F555    aaa598    法拉里    100    0    3359468
小计             NULL    NULL    NULL    100    2500    NULL
2007/10/08    K123    aaa111    XO    1000    0    5849568
2007/10/08    K123    aaa222    篮球    0    200    2849598
小计             NULL    NULL    NULL    1000    200    NULL
总计             NULL    NULL    NULL    1100    3000    NULL


--如果你不想显示NULL,可以执行以下代码

select a.mydate,isnull(a.busNum,''),isnull(a.goodsNum,''),isnull(a.goodsName,''),a.XF,a.TF,isnull(a.tel,'') from
(
select convert(varchar(10),mydate,111) as mydate,busNum,goodsNum,goodsName,XF,TF,tel,1 as myTemp,busNum as bn from tt 
union
select '小计',null,null,null,sum(XF),sum(TF),null,2 as myTemp,max(busNum) as bn from tt group by busNum
union
select '总计',null,null,null,sum(XF),sum(TF),null,3 as myTemp,max(busNum) as bn from tt
) a order by a.bn,a.myTemp


--查询结果

日期              车号   货物编号    货物名称 现付     提付     电话  
------------------------------------------------------------------------
2007/10/08    D333    aaa333    自行车    0    200    5946785
2007/10/08    D333    aaa555    苹果    0    100    6584795
小计                         0    300    
2007/10/08    F555    aaa123    科比战靴    0    2500    3462159
2007/10/08    F555    aaa598    法拉里    100    0    3359468
小计                         100    2500    
2007/10/08    K123    aaa111    XO    1000    0    5849568
2007/10/08    K123    aaa222    篮球    0    200    2849598
小计                         1000    200    
总计                         1100    3000    
补充:.NET技术 ,  ASP.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,