gridview合并行单元格问题

coln_cheng 2008-07-17 10:42:49
部门名称 一级审批 二级审批 三级审批
部门2 test2(1000.0000)
部门2 啊(2000.0000)
部门2 test2(3000.0000)
部门1-2 coln(1000.0000)
部门1-2 laoyan(2500.0000)


有这样一个GRIDVIEW,我像变成下面那样的改怎么做?如何写代码?
部门名称 一级审批 二级审批 三级审批
部门2 test2(1000.0000) 啊(2000.0000) test2(3000.0000)
部门1-2 coln(1000.0000) laoyan(2500.0000)
...全文
859 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianxiawusuan 2010-02-04
  • 打赏
  • 举报
回复
这个功能怎么在页面里面数据绑定啊???
coln_cheng 2008-07-22
  • 打赏
  • 举报
回复
最后还是得写存储过程.........

alter procedure dbo.PR_GetApprovalPath
as
declare CreateTable_Cursor cursor scroll
for select distinct NodeId,nodeName from
(select dbo.f_getkey(DepartmentId) as deptName,dbo.f_getkey(ProcessId) as proceName,dbo.f_getkey(NodeId) as nodeName,NodeId,
dbo.f_getRemark(ApprovalUserId) as userName,ApprovalAmount as money,DepartmentId as deptID
from dbo.WF_ApprovalPath ) as tb1 order by NodeId
open CreateTable_Cursor
--创建临时表
create table #tempTable
(
部门 varchar(50),
流程名称 varchar(64)
)
declare @ColumnName varchar(64)
declare @Nodeid varchar(64)
fetch next from CreateTable_Cursor into @Nodeid,@ColumnName
if(@@fetch_status=0)
begin
while @@fetch_status=0
begin
--对临时表进行字段添加
exec('alter table #tempTable add '+ @ColumnName+' varchar(1024)')
--print ('alter table #tempTable add '+ @ColumnName+' varchar(1024)')
fetch next from CreateTable_Cursor into @Nodeid,@ColumnName
end
end
close CreateTable_Cursor
deallocate CreateTable_Cursor
--插入表游标开始
declare InsertTable_cursor cursor scroll
for select distinct deptName,deptID ,proceName from
(select dbo.f_getkey(DepartmentId) as deptName,dbo.f_getkey(ProcessId) as proceName,dbo.f_getkey(NodeId) as nodeName,NodeId,
dbo.f_getRemark(ApprovalUserId) as userName,ApprovalAmount as money,DepartmentId as deptID
from dbo.WF_ApprovalPath ) as tb1 order by deptID
open InsertTable_cursor
declare @deptName varchar(64),@deptID varchar(64),@processName varchar(64)
fetch next from InsertTable_cursor into @deptName,@deptID,@processName
if(@@fetch_status=0)
begin
while @@fetch_status=0
begin
insert into #tempTable(部门,流程名称) values(@deptName,@processName)
--修改表游标开始
declare UpdateTable_Cursor cursor scroll
for select nodeName,NodeId from
(select dbo.f_getkey(DepartmentId) as deptName,dbo.f_getkey(ProcessId) as proceName,dbo.f_getkey(NodeId) as nodeName,NodeId,
dbo.f_getRemark(ApprovalUserId) as userName,ApprovalAmount as money,DepartmentId as deptID
from dbo.WF_ApprovalPath ) as tb1 where deptID=@deptID
open UpdateTable_Cursor
--设置变量
declare @Up_nodeName varchar(64),@Up_NodeId varchar(64)
fetch next from UpdateTable_Cursor into @Up_nodeName,@Up_NodeId
if(@@fetch_status=0)
begin
while @@fetch_status=0
begin
declare @userName varchar(20),@money varchar(64),@ColumnValue varchar(64)
select @userName=userName,@money=money from
(select dbo.f_getkey(DepartmentId) as deptName,dbo.f_getkey(ProcessId) as proceName,dbo.f_getkey(NodeId) as nodeName,NodeId,
dbo.f_getRemark(ApprovalUserId) as userName,ApprovalAmount as money,DepartmentId as deptID
from dbo.WF_ApprovalPath ) as tb1 where deptID=@deptID and NodeId=@Up_NodeId
set @ColumnValue=@userName+'('+@money+')'
exec('update #tempTable set '+ @Up_nodeName+'='''+@ColumnValue+''' where 部门='''+@deptName+'''')
fetch next from UpdateTable_Cursor into @Up_nodeName,@Up_NodeId
end
close UpdateTable_Cursor
deallocate UpdateTable_Cursor
end
fetch next from InsertTable_cursor into @deptName,@deptID,@processName
end
end
close InsertTable_cursor
deallocate InsertTable_cursor
--插入表游标结束
select * from #tempTable
wzy_love_sly 2008-07-18
  • 打赏
  • 举报
回复
写过程,动态查询
coln_cheng 2008-07-18
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 wzy_love_sly 的回复:]
create table tb(部门名称 varchar(50),一级审批 varchar(50),二级审批 varchar(50),三级审批 varchar(50))
insert into tb select '部门2','test2(1000.0000)',null,null
insert into tb select '部门2',null,'啊(2000.0000)',null
insert into tb select '部门2',null,null,'test2(3000.0000)'
insert into tb select '部门1-2','coln(1000.0000)',null,null
insert into tb select '部门1-2',null,'laoyan(2500.0000)',null
select 部门名称,
max(case when 一级审批 is not null then 一级审批 else '' end) as 一级审批,
max(case when 二级审批 is not null then 二级审批 else '' end) as 二级审批,
max(case when 三级审批 is not null then 三级审批 else '' end) as 三级审批
from tb
group by 部门名称
[/Quote]
我要有五十级审批是不是要写五十个MAX和五十个CASE???
coln_cheng 2008-07-17
  • 打赏
  • 举报
回复

public void SpanGridView(ref GridView pGv, int pSpanIndex)
{
if (pGv.Rows.Count > 0)
{
TableCell oldTc = pGv.Rows[0].Cells[0];
for (int i = 1; i < pGv.Rows.Count; i++)
{
TableCell tc = pGv.Rows[i].Cells[pSpanIndex];
if (oldTc.Text == tc.Text)
{
tc.Visible = false;
if (oldTc.RowSpan == 0)
{
oldTc.RowSpan = 1;
}
oldTc.RowSpan++;
}
else
{
oldTc = tc;
}
}
}
}

这个就是我合并GV的代码,不行~~效果没达到.
coln_cheng 2008-07-17
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 paulin 的回复:]
引用 9 楼 coln_cheng 的回复:
引用 6 楼 paulin 的回复:
也就是按照部门名称不同,合并相同的单元格是吗?
可以循环对比该列数据
利用 cells 的RowSpan 属性操作即可


那样合并出来的效果会有问题......


那你想要的效果是?
[/Quote]
合并出来的会不再同一行,还会产生行间距不同的问题...........
coln_cheng 2008-07-17
  • 打赏
  • 举报
回复

select DepartmentId as deptID,dbo.f_getkey(DepartmentId) as deptName,dbo.f_getkey(ProcessId) as proceName,
dbo.f_getkey(NodeId) as nodeName,dbo.f_getkey(ApprovalUserId) as userName,ApprovalAmount as [money]
from [TopFounder.FrameWork].[dbo].[WF_ApprovalPath] order by NodeId

执行后的结果:
deptID deptName proceName nodeName userName money
00040020 部门2 XX流程 一级审批 test2 1000.00
00040020 部门2 XX流程 二级审批 啊 2000.00
00040020 部门2 XX流程 三级审批 test2 3000.00
000400100020 部门1-2 YY流程 一级审批 coln 1000.00
000400100020 部门1-2 YY流程 二级审批 laoyan 2500.00
paulin 2008-07-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 coln_cheng 的回复:]
引用 6 楼 paulin 的回复:
也就是按照部门名称不同,合并相同的单元格是吗?
可以循环对比该列数据
利用 cells 的RowSpan 属性操作即可


那样合并出来的效果会有问题......
[/Quote]

那你想要的效果是?
coln_cheng 2008-07-17
  • 打赏
  • 举报
回复
ProcessId
更正一下这一列
ProcessId
10050002
10050002
10050001
10050001
10050001
freeflying1222 2008-07-17
  • 打赏
  • 举报
回复
对,不是合并gridview,是合并数据库!
coln_cheng 2008-07-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 paulin 的回复:]
也就是按照部门名称不同,合并相同的单元格是吗?
可以循环对比该列数据
利用 cells 的RowSpan 属性操作即可
[/Quote]

那样合并出来的效果会有问题......
coln_cheng 2008-07-17
  • 打赏
  • 举报
回复
SQL语句:
select DepartmentId as deptID,dbo.f_getkey(DepartmentId) as deptName,dbo.f_getkey(ProcessId) as proceName,
dbo.f_getkey(NodeId) as nodeName,dbo.f_getkey(ApprovalUserId) as userName,ApprovalAmount as money
from dbo.WF_ApprovalPath order by NodeId
函数:
ALTER FUNCTION [dbo].[f_getkey] (@rscode varchar(64))
RETURNS varchar(200)
AS
BEGIN
DECLARE @rskey varchar(200)
select @rskey = rskey from TfCom_ReSource
where rscode =@rscode and rsuseflg ='1'
RETURN @rskey
END;
dbo.WF_ApprovalPath 表:
DepartmentId ProcessId NodeId ApprovalUserId ApprovalAmount
000400100020 10050002 100500020001 00020006 1000.0000
000400100020 10050002 100500020002 00020008 2500.0000
00040020 10050001 100500020001 00020003 1000.0000
00040020 10050002 100500020002 00020002 5000.0000
00040020 10050003 100500020003 00020004 10000.0000
Chris_thanks 2008-07-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 coln_cheng 的回复:]
一级审批 二级审批 三级审批
这个是根据资源表字段动态生成的...不是固定的几个,资源表里面添加一条就多一列...
[/Quote]
这个没问题的
paulin 2008-07-17
  • 打赏
  • 举报
回复
也就是按照部门名称不同,合并相同的单元格是吗?
可以循环对比该列数据
利用 cells 的RowSpan 属性操作即可
yuelailiu 2008-07-17
  • 打赏
  • 举报
回复
group by 部门
chensuifu 2008-07-17
  • 打赏
  • 举报
回复
对数据源先进行操作,然后再赋给gridview
coln_cheng 2008-07-17
  • 打赏
  • 举报
回复
一级审批 二级审批 三级审批
这个是根据资源表字段动态生成的...不是固定的几个,资源表里面添加一条就多一列...
Chris_thanks 2008-07-17
  • 打赏
  • 举报
回复
贴你的SQL出来 我改改看
Chris_thanks 2008-07-17
  • 打赏
  • 举报
回复
就直接在SQL那里写出来 然后在gridview绑定 不难啊
mengxj85 2008-07-17
  • 打赏
  • 举报
回复
学习了,感觉还是SQL语句来操作好些,对数据集操作麻烦多了
加载更多回复(3)

61,830

社区成员

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

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

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

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