高手帮忙啊,问一个关于treeview的简单问题!!!!!!!!!!!!!!!!!!!!!!!!!!在线等待!!
表的字段为
ID NAME FULLPATH
**************************
001 海运出口一 HYCK.CK1
002 第一组 HYCK.CK1.CK11
003 第二组 HYCK.CK1.CK12
004 海运出口二 HYCK.CK2
005 财务部 CW
006 财务一部 CW.TR
007 海运出口部 HYCK
008 电脑部 IT
*************************
在窗体OPEN的时候,我想让树以下面的形式展开
*************************************
-财务部
财务一部
-电脑部
-海运出口部
-海运出口一
第一组
第二组
海运出口二
************************************
树的层数是不固定的,好象应该用循环递归,哪位高手帮小弟写一下代码好吗,谢谢!!!!!!!!!!!
问题点数:0、回复次数:32Top
1 楼klbt(快乐白兔)回复于 2004-08-03 19:44:50 得分 0
树的层数是不固定的,所以你缺少一个层次列,或者用编码表达层次。Top
2 楼pb2005(无名小卒)回复于 2004-08-04 09:42:36 得分 0
上面所列举的数据只是一部分,那些部门是在另一个窗口里添加的,数据表已经固定了,不可能再加一个字段,高手们帮忙啊Top
3 楼pb2005(无名小卒)回复于 2004-08-04 10:03:03 得分 0
upTop
4 楼pb2005(无名小卒)回复于 2004-08-04 10:16:14 得分 0
up
Top
5 楼js00224(无名小卒)回复于 2004-08-04 10:20:48 得分 0
可以根据字段 “FULLPATH”字段来建树.用递归循环做.
先建个DATASTORE,然后从DATASTORE里提取数据,利用字符串函数,寻找到第一层,不包含“.“的字段,然后递归调用,寻找第二层的,以此类推,应该可以建出来。例如
建立一个窗口函数 tree_additem()//参数可以设置,或不可设置,根据具体的情况而定
datastore datatree
datatree = create datatree
datatree.dataobject = '数据窗口名'
datatree.settransobject(sqlca)
datatree.retrieve
long ll_count
for ll_count = 1 to datatree.rowcount()
中间过程简单,自己可以搞定的
next
post tree_additem()Top
6 楼pb2005(无名小卒)回复于 2004-08-04 10:27:06 得分 0
谢谢楼上大哥指点,大概思路我知道的,但代码怎么写啊,大哥,你可不可以帮我写一下啊??????Top
7 楼pb2005(无名小卒)回复于 2004-08-04 10:41:37 得分 0
upTop
8 楼pb2005(无名小卒)回复于 2004-08-04 10:57:05 得分 0
up
Top
9 楼jp2k(深蓝)回复于 2004-08-04 11:08:16 得分 0
表的字段为
ID LEVELNAME FULLPATH
**************************
001 海运出口一 HYCK.CK1
002 第一组 HYCK.CK1.CK11
003 第二组 HYCK.CK1.CK12
004 海运出口二 HYCK.CK2
005 财务部 CW
006 财务一部 CW.TR
007 海运出口部 HYCK
008 电脑部 IT
*************************Top
10 楼jp2k(深蓝)回复于 2004-08-04 11:10:45 得分 0
建议分级,个体做法:
表的字段改为
ID LEVEL NAME FULLPATH
**************************
001 2 海运出口一 HYCK.CK1
002 3 第一组 HYCK.CK1.CK11
003 3 第二组 HYCK.CK1.CK12
004 2 海运出口二 HYCK.CK2
005 1 财务部 CW
006 2 财务一部 CW.TR
007 1 海运出口部 HYCK
008 1 电脑部 IT
*************************Top
11 楼pb2005(无名小卒)回复于 2004-08-04 11:14:37 得分 0
不可能改表的结构啊,而且级别也不固定,肯定要用递归遍历的,可我数据结构没学好,不知道怎么写这样的算法啊Top
12 楼tiantanglyz(wuyou88)回复于 2004-08-04 11:19:54 得分 0
再加点分我帮你写!Top
13 楼pb2005(无名小卒)回复于 2004-08-04 11:42:42 得分 0
好的,分不是问题,可是我这个帐号的分就剩下10分了,等问题搞定后,我多申请几个ID号,然后给你好吗,我现在好着急啊,我绝不食言Top
14 楼Hanson_bati_zhu(欺世盗名之徒)回复于 2004-08-04 11:59:54 得分 0
楼主如果用的是PFC就比较简单了
这棵树用PFC中的u_tvs很好实现
Top
15 楼pb2005(无名小卒)回复于 2004-08-04 12:10:44 得分 0
可惜我用的不是PFC啊Top
16 楼mmkill(蒙松雨kill)回复于 2004-08-04 12:36:17 得分 0
很简单,就是用递归,我写过一个。可惜你给的分太少Top
17 楼pb2005(无名小卒)回复于 2004-08-04 12:59:05 得分 0
我说过了,我现在就剩下10分了,等问题一解决,我一定另外再给你分 的Top
18 楼pb2005(无名小卒)回复于 2004-08-04 13:09:16 得分 0
upTop
19 楼pb2005(无名小卒)回复于 2004-08-04 13:25:55 得分 0
upTop
20 楼tiantanglyz(wuyou88)回复于 2004-08-04 14:09:14 得分 0
好!
我开始帮你写了!Top
21 楼pb2006()回复于 2004-08-04 14:18:56 得分 0
好的,把代码贴在下面的帖子里,我给了100分
http://community.csdn.net/Expert/topic/3241/3241493.xml?temp=.2543909Top
22 楼pb2005(无名小卒)回复于 2004-08-04 15:08:47 得分 0
各位高手,我已经开了100分的帖子啊,http://community.csdn.net/Expert/topic/3241/3241493.xml?temp=.2543909
Top
23 楼pb2006()回复于 2004-08-04 16:15:17 得分 0
我出了100分怎么没人回答呢?????????????????????Top
24 楼pb2006()回复于 2004-08-04 17:12:51 得分 0
我顶!!!!!!!!!!!!Top
25 楼sun1976(嫁给我,你就是我的一妾)回复于 2004-08-04 17:21:15 得分 0
数据存储:
select id,name ,FULLPATH,1 as level
from talble
//窗口函数:
uf_get_level()//参数:string as_code
//返回:long ll_level
long ll_level
long ll_pos
ll_level=1
ll_pos=pos(as_code,'.')
do while ll_pos>0
ll_level++
ll_pos=pos(as_code,'.',ll_pos+1)
loop
return ll_level
//树的数据
lds_1.retrieve()
for i=1 to lds_1.rowcount()
ls_code=lds_1.getitemstring(i,'FULLPATH')
lds_1.setitem(i,'level',uf_get_level(ls_code))
next
uf_draw_tv(0,0,'',lds_1)
//树绘制函数uf_draw_tv(long al_parenthandle,long al_parentlevel,string
as_parentcode,datastroe ads_1)
treevievitem ltv_1
long ll_newhandle
long ll_newlevle
string ls_newcode
//设置图片等属性
ltv_1.xxxxx=xxx
//------------
ll_newlevel=al_parentlevel+1
ads.setfilter("(FULLPATH like '"+as_parentcode+"%') and leve="+string(ll_newlevel))
ads.filter()
for i=1 to ads_1.rowcount()
ltv_1.data=ads.getitemstring(i,'FULLPATH')
ltv_1.label=ads_1.getitemstring(i,'name')
ll_newhandle=tv_1.InsertItemLast ( al_parenthandle, ltv_1 )
uf_draw_tv(ll_newhandle,ll_newlevel,ltv_1.data,ads_1)
next
//说明:所有函数的所有参数都用值传递[value]
Top
26 楼liujiaqiang(阿毛)回复于 2004-08-04 17:37:55 得分 0
//-----------------------------------------------------------------
// 功能:把数据窗口中的记录以节点加入树形中
// 参数:1.al_handle 要加入的父节点句柄 就是你的FULLPATH
// 2.al_parent_id 要加入的父节点号
// 返回值:1.true 加入完毕正常展开
// 2.false 数据窗口中没有要加入的节点或加入中出现错误
//-------------------------------------------------------------------
istr_pass 是一个结构,含有l1,s1,l2,s2,l3,s3等一些属性。
treeviewitem ltvi_new
integer li_rowcount
integer li_i
string ls_name
datastore ds_1
ds_1 = create datastore
ds_1.dataobject = "数据窗口对象"
ds_1.settransobject(sqlca)
li_rowcount = ds_1.retrieve(al_parent_id)
if li_rowcount = 0 or isnull(li_rowcount) then return false
//开始在树形中加入节点
for li_i = 1 to li_rowcount
ls_name = ds_1.object.name[li_i]
ltvi_new.label = ls_name
ltvi_new.pictureindex = 2
ltvi_new.selectedpictureindex = 3
istr_pass.pass_l1 = ds_1.object.id[li_i]
istr_pass.pass_s1 = ls_name
istr_pass.pass_l2 = al_parent_id
istr_pass.pass_s2 = ds_1.object.parent_path[li_i]
istr_pass.pass_s3 = ds_1.object.remark_memo[li_i]
If this.event ue_has_children(istr_pass.pass_l1) Then
ltvi_new.Children = True
Else
ltvi_new.Children = False
End If
ltvi_new.data = istr_pass
if not(tv_1.insertitemlast(al_handle,ltvi_new) > 0) then return false
next
this.setredraw(true)
return true
//-------------------------------------------
// 名称:ue_has_children
// 功能: 一个区域下面是否还有下属区域
// 参数: al_area_id FULLPATH , 其格式例为:‘HYCK.CK1%’
// 返回: boolean true 有下级区域
// false 没有下级区域
//--------------------------------------------
long ll_count
ll_count = 0
SELECT count(T_Area.ID)
INTO :ll_count
FROM 表
WHERE 表.FULLPATH like :al_area_id using sqlca ;
if sqlca.sqlcode = 0 and ll_count > 0 then
commit using sqlca;
return true
else
rollback using sqlca;
return false
end ifTop
27 楼liujiaqiang(阿毛)回复于 2004-08-04 17:39:09 得分 0
如果实在还搞不定,给个E-Mail ,我穿一个例子给你。Top
28 楼sun1976(嫁给我,你就是我的一妾)回复于 2004-08-05 10:16:01 得分 0
liujiaqiang(阿毛)
研究研究,跟你学两招
你的ds_1的数据窗口对象怎么定义的,贴出来好不好?Top
29 楼liujiaqiang(阿毛)回复于 2004-08-05 12:36:31 得分 0
SELECT ID , NAME , FULLPATH
FROM 表
WHERE ( FULLPATH like :al_parent_id )Top
30 楼pb2005(无名小卒)回复于 2004-08-05 13:00:17 得分 0
TO sun1976(关羽观雨) :您写的不对啊,只能把2条记录检索出来,后面的没有了Top
31 楼sun1976(嫁给我,你就是我的一妾)回复于 2004-08-05 16:01:38 得分 0
到楼主开的另外那个贴子找去
在函数里create一个数据存储lds,取传入的数据存储的dataobject,然后rowscopy所有数据,然后过滤lds,用lds画节点
Top
32 楼tiantanglyz(wuyou88)回复于 2004-08-11 10:52:56 得分 0
不好意思,早两天出差了,昨天才回来
刚刚已写玩,而且经过了测试
你要的话就加我qq:279393842
或E_Mail:homerlyz@yahoo.com.cn
全天在线Top




