我根据数据库表建立了2个TreeView为TreeView1,TreeView2。两个TreeView仅仅节点数量不同,但是相同位置节点(如果存在)则其data必定相同,我想点击TreeView1中某一个节点来影响TreeView2中有相同data的节点。
目前我的做法是遍历TreeView2所有节点查找与TreeView1.selected中data相同的节点来对TreeView2的该节点进行控制,请问有更加巧妙的办法实现我的需求吗?

解决方案 »

  1.   

    读到一条数据时,当你在创建节点的时候,是不是同时创建1与2的node?如果是同时创建的,你先建1,再建2,然后把2这个node赋值给1node.data
    这样你就可以访问1节点时直接通过data属性来访问2对应的节点了。
      

  2.   

    to iuIRCClient(我是老鹰) :
    虽然不是同时,但是在2中确实存在与1node.data相同的2node.data。请问如何‘访问1节点时直接通过data属性来访问2对应的节点’,我只想得到遍历方法。
      

  3.   

    在Data所指向的记录中增加两个域: 
      XXXXXX =record
        ......
        Node1 : TTreeNode;
        Node2 : TTreeNode;
        ......
      end;分别用来存放TreeView1和TreeView2中对应的结点。这样就可以在TreeView1中快速访问到对应的TreeView2中的结点了。当然,程序需要作出比原来更多的判断,来正确处理结点删除时的操作。
      

  4.   

    我上面说的方法,实际上就是1node.data里面存的就是2node的引用,你使用的时候就可以直接把1node.data转换成node就行了。
      

  5.   

    当然了,这样的话,你可以把1node.data设为2node,同时这个2node.data设为1node,这样可以互相访问
      

  6.   

    不是同时建立的两个树,你要建立两个树节点对应关系是吧?
    如果数据库表记录的索引不变(记录的顺序不变),你就新建列表,比如果stringlist
    然后,stringlist.addobjects('数据库记录的索引号Index', TreeView1的节点),这样建立一个treeview1的节点和数据库索引的对应关系,然后在建treeview2时,你可以根据数据库记录索引的id取出对应treeview1的节点node1,把node1.data指向node2.data就行了
    ~~
    如果数据库记录的索引变了(记录顺序改变),你就可以用记录的关键一类的取代索引,只要记录的关键字不变就行不知道我理解的对不对~~
      

  7.   

    啊。是我的倏忽,由于data已经用于存指向的东西了所以无法再用data存放标记性的如另一个树的节点之类的东西了。所以,我的苦恼就在这了。data指向的是表中记录的编码字段,而node.Text则是记录的名称字段,所以我说这两个treeview的相同节点的data是一致的就是说他们指向的域存有相同的东西(编码),但是域不相同,我分别new给两个treeview的同个节点来存放编码。不知道这么说是不是我理解错了还是什么,菜鸟上手~实在查不到类似资料和例子不得不打搅大家了,希望得到指教~感恩
      

  8.   

    如果你觉得treeview提供给你的可以使用的自定义字段太少,你就自已定义一个class,这里面存放你原来的data的内容,再加上新的字段值,比如node1,node2等等。然后new这个类,再赋值给data属性
      

  9.   

    to jadeluo(秀峰) & iuIRCClient(我是老鹰):
    几天没来,感谢大家的帮忙。
    jadeluo 和iuIRCClient 的解决思路相近,让我又学会了不少,我考虑了下采用了记录类型来存放,可是我又遇到了新问题:
    两人都说需要在treeview1的节点存放treeview2.node。在需要时调出内容就可以了。确实如此。可是,我的treeview1和treeview2是同时开始创建的,如何在treeview1某个节点创建时存入treeview2对应此treeview1节点的treeview2的节点?虽然他们的节点序号一样:
    对应关系如:treeview2.Items.Item[0] 对应 treeview1.Items.Item[0]
    treeview2.Items.Item[0].Item[3] 对应 treeview1.Items.Item[0].Item[3]
      

  10.   

    你的tnode1与tnode2虽是同时创建的,总得有个先后吧
    比如:
    tnode1创建
    tnode2创建
    tnode2.data=tnode1
    tnode1.data=tnode2
      

  11.   

    treeview1和treeview2的节点都对应数据库同一条记录
    XXXX = record 
    ...
      DataIndex ;// 数据库记录的关键字或索引
      Node1; // 对应treeview1的节点
      Node2; // 对应treeview2的节点
    ...
    end;
    创建第一个树的时候,同时创建record,存放到列表里TStringList.AddObject(DataIndex, Node1);这样创建第二个树时,查找到dataindex对应的列表中的序号index取出node1,在根据node1取出对应的record,把node2也写进去
      

  12.   

    to 楼上两位:
    我的tnode1与tnode2分别放在两个线程中执行,这样算不算同时进行?如果采用logne() 的做法,不会出什么意外么?
      

  13.   

    唉,你看你这问题问的,你早说是在两个线程中创建啊。上面的不都白答了么。
    你建node的时候,就把index放入他们的tag或者data吧。然后你只能自已写个循环根据这个值来扁历定位了。
      

  14.   

    对不起拉~这是我的疏忽,不过也不能说白回答了啊!起码还是让我又学到了不少东西的~感恩。就先揭帖吧!这次真是学到不少关于treeview的好用的知识啊!多谢多谢