treeview和datawindows相关联的例子,treeview不能正确更新,请大家帮忙看看!!

wwwww_wang 2002-06-25 11:01:07
我有数个数据窗口对象(都是静态数据),我想把他们合成treeview的形式,我的总的思路是,
1.窗口打开时,插入一个数据窗口名,再把里面相应的数据插到第二层,再插入第二个,,,
2.窗口放一个数据窗口,显示在treeview中点击的内容.

目前可实现正确插入,现在我在数据窗口改完数据后,想先把treeview里的数据全删掉再重新插入.可这样更新后的数据是乱的.而如果我不先删掉原来的,确能将正确的更新插进来.
(这时treeview里上一半是旧的下一半是新的,高手们帮我看看问题何在啊!!!!!!!
窗口的open事件里是这样插入数据的:

tv_1.insertitemlast (0,name,1) //插入根节点
tv_1.hasbuttons=true
lds_1= create datastore
lds_1.dataobject=dwname
lds_1.settransobject (SQLCA)
rowcount=lds_1.retrieve()
ll_lev2=ll_lev+1
for i=1 to rowcount
tv1_data.label=lds_1.GetItemString(i,"declaring")
tv1_data.data =lds_1.Getitemstring(i,"code")
ll_lev=tv_1.insertitemlast(ll_lev2,tv1_data) //记录最后一个数据的句柄
tv1_data.PictureIndex=3
tv1_data.SelectedPictureIndex=4
next
destroy lds_1

保存时是这样更新treeview的
tv_1.DeleteItem(0)
窗口.triggerevent (open!)
谁帮帮我啊!?!?!?!
...全文
65 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwwww_wang 2002-06-26
  • 打赏
  • 举报
回复
chinalht:
因为我是先插一个根节点,再把数据插到这个节点的第二层.
所以,我要记录第一个根节点下的最后一条数据的句柄.(ll_lev)
而下一批数据就插在第二个节点下,也就是(ll_lev2)下.
可能这就是出错的地方,但初始插入是正确的!
这问题还没解决呢大家帮帮忙!
wwwww_wang 2002-06-26
  • 打赏
  • 举报
回复
用爱的回忆的思路虽然要麻烦点。但能实现就是好的。
总算搞定啦。不过还是不知原来的问题出在哪,有些遗憾。。
算啦。散分!!谢谢帮助我的朋友。
wwwww_wang 2002-06-26
  • 打赏
  • 举报
回复
唉~ll_lev2是随ll_lev而变的。
ll_lev是-1,ll_lev2就是0。
我还是投降算啦。用 lyj007(爱的回忆) 的思路算啦!
chinalht 2002-06-26
  • 打赏
  • 举报
回复

::我在debug里调试,发现更新后的插入时,第一结点下
::ll_lev=tv_1.insertitemlast(ll_lev2,tv1_data)
::返回的都是-1.而其它的返回的句柄也是错误的.
你看看此时的ll_lev2是多少,这段程序逻辑很简单,仔细检查一下吧。
lyj007 2002-06-25
  • 打赏
  • 举报
回复
没有空格的程序可读性是不是不够高??我不太愿意看。你的意思我大概应该明白,你试试这么做。做一个窗口函数生成树,在open的时候调用。再做一个窗口函数清空树。
wf_clean_tv()
tv_1.setredraw(false)
for i = 1 to dw_1.rowcount()
tv_1.deleteitem(long(dw_1.getitemstring(i , "XX")))
next
tv_1.setredraw(true)
return 1

wf_setitem()
long ll_row,i,ll_handle
string ls_handle
ll_row = dw_1.rowcount()
for i = 1 to ll_row
itvi_xl.data = dw_1.getitemstring(i,"XX")
itvi_xl.label = dw_1.getitemstring(i,"XXX")
itvi_xl.pictureindex = 1
itvi_xl.selectedpictureindex = 2
itvi_xl.children = false
ls_handle = string(tv_1.InsertItemLast(0,itvi_xl))
if i = 1 then ll_handle = long(ls_handle)
dw_1.setitem(i,"XX",ls_handle)
next
tv_1.selectitem(ll_handle)
return 1
知道在什么时候调用什么函数吧???
有问题给我发QQ吧!!27378211。
wwwww_wang 2002-06-25
  • 打赏
  • 举报
回复
风中的风:
我一开始就是你那么删除的。
是一样的。都是删去整个树!
zhangjun 2002-06-25
  • 打赏
  • 举报
回复
我的一个小例子,希望对你有帮助!!!
DO UNTIL tv_list.FindItem(RootTreeItem!, 0) = -1
tv_list.DeleteItem(tvi_hdl)
LOOP
//把数据添加到树型视图中去
DECLARE cur_type CURSOR FOR
SELECT play_user.phone,
play_user.name,
play_user.cardid,
play_user.type,
play_user.status
FROM play_user
where play_user.phone=:sphone
order by play_user.phone ASC;


tmp.Label = "参赛者信息"
tmp.pictureindex=1
tmp.selectedpictureindex=1
tmp.Children=true
FirstLevel=tv_list.InsertItemLast(0,tmp);

open cur_type;
if sqlca.sqlcode=0 then
fetch cur_type into :xphone,:xname,:xid,:xtype,:xzt;
if xzt="0" then
zt1="注销"
elseif xzt="1" then
zt1="正常"
elseif xzt="2" then
zt1="每日发题"
end if
if xtype="A" then
xtype="移动竞猜"
end if
do until sqlca.sqlcode<>0
//手机号码
tmp.Label ="手机号码:"+xphone
tmp.Data=xphone
tmp.pictureindex=2
tmp.selectedpictureindex=2
tmp.Children=true
SecondLevel=tv_list.InsertItemLast(FirstLevel,tmp)
//姓名
if isnull(xname) then
xname='空'
end if
tmp.Label ="姓名:"+xname
tmp.Data=xphone
tmp.pictureindex=3
tmp.selectedpictureindex=3
tmp.Children=false
thirdLevel=tv_list.InsertItemLast(SecondLevel,tmp)
//身份证号码
if isnull(xid) then
xid='空'
end if
tmp.Label ="身份证:"+xid
tmp.Data=xphone
tmp.pictureindex=3
tmp.selectedpictureindex=3
tmp.Children=false
thirdLevel=tv_list.InsertItemLast(SecondLevel,tmp)
//游戏类型
tmp.Label ="游戏类型:"+xtype
tmp.Data=xtype
tmp.pictureindex=3
tmp.selectedpictureindex=3
tmp.Children=false
thirdLevel=tv_list.InsertItemLast(SecondLevel,tmp)
//状态
tmp.Label ="状态:"+zt1
tmp.Data=zt1
tmp.pictureindex=3
tmp.selectedpictureindex=3
tmp.Children=false
thirdLevel=tv_list.InsertItemLast(SecondLevel,tmp)

fetch cur_type into :xphone,:xname,:xid,:xtype,:xzt;
if xzt="0" then
zt1="注销"
elseif xzt="1" then
zt1="正常"
elseif xzt="2" then
zt1="每日发题"
end if
if xtype="A" then
xtype="移动竞猜"
end if

loop
close cur_type;
long ll_tvi

ll_tvi = tv_list.FindItem(RootTreeItem! , 0)
tv_list.ExpandItem(ll_tvi)
else
MessageBox("提示信息","游标打开错误!")
end if
zhangjun 2002-06-25
  • 打赏
  • 举报
回复
你这样删除:
long tvi_hdl=0
DO UNTIL tv_list.FindItem(RootTreeItem!, 0) = -1
tv_list.DeleteItem(tvi_hdl)
LOOP
看看如何???
我不喜欢用数据存储
我喜欢用游标来实现
那样可以更容易
WorldMobile 2002-06-25
  • 打赏
  • 举报
回复
我知道什么问题,没有什么好办法

1.用数据窗口,不用树型图, 摸拟一个树型图,很好玩,也很漂亮,还可以多选
不过就是有点麻烦
2.把窗口关闭,再重新打开
3.把树型图destroy,再动态生成
wwwww_wang 2002-06-25
  • 打赏
  • 举报
回复
大家提提意见嘛~~~~
分不够我再加啊!!!!!
chinalht 2002-06-25
  • 打赏
  • 举报
回复
ll_lev2=ll_lev+1
你这句中的 ll_lev是哪里初始化的?
你在循环中修改ll_lev有什么用?
wwwww_wang 2002-06-25
  • 打赏
  • 举报
回复
lzp_lrp(lzp)
这有何用呢???我说的数据是乱的,不是说顺序乱啦.
而是不少数据从第二层跑到了第一层,其他的第一层的也展不开白条
我在debug里调试,发现更新后的插入时,第一结点下
ll_lev=tv_1.insertitemlast(ll_lev2,tv1_data)
返回的都是-1.而其它的返回的句柄也是错误的.
高手帮忙啊!!!
WorldMobile 2002-06-25
  • 打赏
  • 举报
回复

rowcount=lds_1.retrieve()
后加一个排序
lds_1.setsort("条件")
lds_1.sort()
wwwww_wang 2002-06-25
  • 打赏
  • 举报
回复
我的程序结构很简单啊,只有一个for循环。
到底是哪的问题呢?我很想知道!

611

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder DataWindow
社区管理员
  • DataWindow社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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