hur.cn - 华软网

 热门搜索

请教有关树型控件的问题!!!

  作者:未知    来源:网络    更新时间:2018/5/16
+工程            
  + -项目1  
      + -部件1
           + -零件1
   + -项目2
      + -部件2
           + -零件2

   类似这样的树型结构应该怎么做
  为什么我的treeview控件就是展不开呢
  这是数据库
  项目号projectnum
  部件号partnum
  零件名称name
     请高手指教!!

------华软网友回答------
PFC吧。 我个人喜欢把所有的数据提取到DataSet里面,如果数据不太多的话。
------华软网友回复------
先写一函数,实现第一级,然后循环调用.
------华软网友回复------
现在可以展开了,但是在添加下一层节点的时候总是添加在最后一项,该如何指定添加位置呢
  +工程            
    -项目1  
    -项目2
       -部件1
       -部件2
           -零件2

   如果我想把部件1,2添加在项目1 的子节点处,该如何设置呢,这是源码
   treeviewitem ltvi_root
treeviewitem ltvi_project
treeviewitem ltvi_node
int i_index
long l_lev0
long l_lev1
long l_lev2
long l_lev3
string str_list
string str_root='工程'
string str_project[]={"项目1","项目2","项目3","项目4"}
string str_part[]={"部件1","部件2","部件3","部件4"}
string str_name[]={"支架","螺钉","支撑柱","顶丝","支撑帽"}
ltvi_root.pictureindex=1
ltvi_root.selectedpictureindex=2
ltvi_node.statepictureindex=1

ltvi_root.label=str_root
l_lev0=this.insertitemlast(0,ltvi_root)
ltvi_root.children=true
for i_index=1 to 4
ltvi_node.label=str_project[i_index]
l_lev1=this.insertitemlast(l_lev0,ltvi_node)
next

for i_index=1 to 2
ltvi_node.label=str_part[i_index]
l_lev2=this.insertitemlast(l_lev1,ltvi_node)
next
for i_index=3 to 4
ltvi_node.label=str_name[i_index]
l_lev3=this.insertitemlast(l_lev2,ltvi_node)
next


------华软网友回复------
想要实现你说的功能,需要使用游标来写才可以哦!
我给你一个我程序的例子,你看看怎么嵌套游标来实现层的实现。
/*
====================================================================
树形视图控件的constructor事件:
说明:在该树形视图控件创建后,窗口的 open 事件发生之前出发。

objectname.SetRedraw(boolean)
功能:指定每次修改控件属性后是否自动重绘控件。
参数:objectname:可以是子数据窗口,但不能是菜单。
      boolean:   TRUE -每次修改控件属性后自动重绘该对象或控件。
                 FALSE-修改属性后不自动重绘该对象或控件。
返回:integer.成功返回1,出错返回-1,如任意参数为NULL,返回NULL。
好处:避免屏幕显示的闪烁现象,并提高应用程序的性能。

SetPointer(type)
功能:设置鼠标指针。
参数:type: Pointer枚举类型。

作者: 黎里 日期: 2003年04月21日
====================================================================
读取多行数据时游标的使用说明。
1.DECLARE 语句
  DECLARE CursorName CURSOR FOR SelectStatement
    {USING TransactionObject}.
  说明:CursorName 是游标的名称,SelectStatement 是任何有效的SELECT语句;
      TransactionObject 是事务对象名,默认为 SQLCA.
      DECLARE 是一个说明语句,但仍需使用分号(;)结束该语句。
2.OPEN 语句
  说明:OPEN 语句打开已经说明的游标并执行相应的SELECT语句。
        OPEN CusorName;
3.FETCH 语句
  说明:FETCH 语句从游标中读取当前记录并把它保存到指定的变量中。
        FETCH CusorName INTO HostVariableList
        CusorName 是OPEN 语句打开的游标名。HostVariableList是与SELECT语句
        中虚则字段相对应的主变量列表。
4.CLOSE 语句
  说明:CLOSE 语句关闭先前打开的游标。
        CLOSE CursorName;
        CusorName 是OPEN 语句打开的游标名。

 作者: 黎里 日期: 2003年04月18日
--------------------------------------------------------------------
*/

String in_dept,classroom_id,in_addr,class_room_name
Long ll_handle,ll_handle1,ll_handle2,ll_handleroot

TreeViewItem tv_item
//TreeViewItem 对象是PowerBuilder系统结构(没有事件),用于表达树形视图控件的列表项。

SetRedraw(FALSE)
SetPointer(HOURGLASS!)//把鼠标指针设计为沙漏型
this.deleteitem(0)  //删除树形视图控件中所有的列表项

//插入根目录
tv_item.label= "所有教室"
tv_item.data = "所有教室"
tv_item.pictureindex = 2
tv_item.selectedpictureindex = 2
ll_handleroot = this.insertitemlast(0,tv_item)
//定义单位(第二层)游标插入
DECLARE unit_all CURSOR FOR
SELECT distinct CLASS_ROOM.IN_DEPT 
FROM CLASS_ROOM;
OPEN unit_all;
FETCH unit_all INTO :in_dept;
do while SQLCA.sqlcode = 0 //说明最近的一次SQL语句执行成功
tv_item.label= in_dept
tv_item.data = in_dept
tv_item.pictureindex = 3
tv_item.selectedpictureindex = 4
ll_handle = this.insertitemlast( ll_handleroot,tv_item)

//插入地点节点(第三层)
DECLARE place_all CURSOR FOR
SELECT  distinct CLASS_ROOM.IN_ADDR 
FROM CLASS_ROOM 
WHERE IN_DEPT = :in_dept;
OPEN place_all;
FETCH place_all INTO :in_addr;
do while SQLCA.sqlcode = 0 //说明最近的一次SQL语句执行成功
tv_item.label = in_addr
tv_item.data = in_addr
tv_item.pictureindex = 1
tv_item.selectedpictureindex = 4
ll_handle1 = this.insertitemlast(ll_handle,tv_item)
//插入教室节点(第四层)
DECLARE classroom_all CURSOR FOR
SELECT CLASS_ROOM.CLASS_ROOM_NAME,CLASS_ROOM.CLASS_ROOM_ID 
FROM CLASS_ROOM 
WHERE IN_ADDR = :in_addr;
OPEN classroom_all;
FETCH classroom_all INTO :class_room_name,:classroom_id;
do while SQLCA.sqlcode = 0 //说明最近的一次SQL语句执行成功
tv_item.label = class_room_name
tv_item.data = classroom_id
tv_item.pictureindex = 3
tv_item.selectedpictureindex = 4
ll_handle2 = this.insertitemlast(ll_handle1,tv_item)
FETCH classroom_all INTO :class_room_name,:classroom_id;
//this.expanditem( ll_handle2)
loop
CLOSE classroom_all;
FETCH place_all INTO :in_addr;
//this.expanditem( ll_handle1)
loop
   CLOSE place_all;
FETCH unit_all INTO :in_dept;
this.expanditem(ll_handle)
//expanditem 是树形视图控件函数,用于展开指定列表项的子项
loop
CLOSE unit_all;
this.expanditem( ll_handleroot)
SetPointer(ARROW!)
SetRedraw(TRUE)
------华软网友回复------
先把数据提到DW中,然后循环来插入节点,不过要记好路径!
------华软网友回复------

  用游标试了一下,还是展不开,估计没连上数据库,第一次接触游标,对其还不是很了解
  现在脑子都糊涂了,都不知道该如何下手,能讲解一下如何使用游标吗,如果用普通的方法可以实现吗
   谢谢!!

------华软网友回复------

   求救!!搞了半天还是没有什么眉目,谁有这方面的程序例子吗
------华软网友回复------
请问   我用了你的代码 为什么会出现乱吗呢    不知道为什么

------华软网友回复------
数据窗口
------华软网友回复------
求救!!搞了半天还是没有什么眉目,谁有这方面的程序例子吗?

有很多:

pb安装路径\Code Examples\Example App


------华软网友回复------
你用的insertitemlast,当然插入到最后了。想控制位置用insertitem      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。