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

nbshiny 2007-10-21 03:53:01
字段如下:公司名称,公司具体部门,公司具体部门的销售量。差不多就这三个分类。然后要求的是这个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只能有一个页脚,所以如何统计上面的那些小计部分呢,这也是目前项目中碰到的问题,目前还没有解决,如果网上的朋友有人有这个的解决方案,能否告知,谢谢。
...全文
681 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
staryangcb 2010-09-30
  • 打赏
  • 举报
回复
--创建环境
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
staryangcb 2010-09-30
  • 打赏
  • 举报
回复
/* 直接用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
lovelizheng 2007-11-12
  • 打赏
  • 举报
回复
楼主,我对你的表设计不清楚,假设你的表分为:公司表(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即可.其中的排序应该是正常的的,不是太详细,你自己领会吧.
yseet 2007-10-26
  • 打赏
  • 举报
回复
很简单.


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里一行一行增加数据.
yuan74521940 2007-10-24
  • 打赏
  • 举报
回复
我给你贴代码........

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;

}
}
德仔 2007-10-24
  • 打赏
  • 举报
回复
不知你的数据源是否是datatable,我的想法是使用datatable来构建gridview里面的数据,不过这样貌似比较复杂,需要结合楼上几位的思路.

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

以上属个人思路.

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


关注中.

nbshiny 2007-10-22
  • 打赏
  • 举报
回复
michaelowenii ,lovelizheng ,您们好,您们的想法我也都考虑到了。我一直认为gridview是不是只能在页脚的地方增加一行,而在gridview显示数据的中间是不可以加入一行的,但实际可不可以我也想问大家,
但是如果在gridview显示数据的中间无法加入一行小计的话,那么我想要不我在表格里面做手脚,就是在显示之前,我根据不同的要求计算出不同的小计,然后加入到当前这个数据库中,然后在显示的时候,因为这个小计的记录和前面的具体的记录之间应该有部门这个关键字联系着的,所以我在显示的时候,顺便也会从数据库中取出这个小计那一行,然后显示就是,但是这里有一个问题,新出来的这行小计她从某种意思上说是id最大的那条记录,但是我在程序里面并不是按照id大小来排列的,而是按照部门,部门人员什么的进行排序的,所以这种情况可能存在一个问题,就是再显示的时候,“小计”那一行不是显示在最后,而是显示再前面,所以不知道怎么解决了。而且这些加入到这个表内的临时统计数目如何去除他们呢,也是个问题?
当然lovelizheng 您提出的写入到临时表,但是如何把这个临时表内的记录和你的总表内部建立起联系呢。。。如何在gridview中显示完这一部门后,然后就加入这个临时表内的某一个对应的记录呢。请问这个直接怎么保持联系?麻烦请告知。
上面的方法都是利用到了中间的一个辅助环节,但是最好的就是gridview本身就能实现这个,但我不知道怎么实现,如果大家有想法,有建议都可以提,谢谢。
nbshiny 2007-10-22
  • 打赏
  • 举报
回复
请问saqua,您讲的itemTemplate里面涉及到的只是相应的模板列吧,我这里只是想增加一些行,所以请问有何建议,谢谢。
lovelizheng 2007-10-22
  • 打赏
  • 举报
回复
3楼的办法可行,最好在sql里面处理,在存储过程里面加入个临时表,把某类的小计添加到该类的后面.然后返回临时表.最后的合计用楼主的方法即可.
Im大灰狼 2007-10-22
  • 打赏
  • 举报
回复
可以在GridView的ItemTemplate中自己编辑GridView的显示,不用管它原来是什么样的,自己想显示成什么样 就显示成什么样子,然后在EditTemplate中设计GridView在编辑时的显示。
michaelowenii 2007-10-22
  • 打赏
  • 举报
回复
小计还是用sql 实现比较ok
nbshiny 2007-10-21
  • 打赏
  • 举报
回复
分Grid表示,能否说详细点呢。怎么细分呢,每个部门的小计如何通过分grid嵌入进去呢?
richardtsuii 2007-10-21
  • 打赏
  • 举报
回复
分Grid表示 Grid动态和数据绑定以及页脚生成都动态通过编码实现

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧