treeview中当单击一个节点时,显示其孩子;当单击另一个节点时,刚才显示的那个节点孩子消失,显示现在所选则的节点的孩子?如何实现?如下示:
 +--某大学
    |__A班
      |  
      |__B班
当选A班时显示
 +--某大学
   |___A班
     |   |__学生2
     |   |__学生1
   |
     +----B班
当选VB时显示
 +--某大学
   |___A班
   |
     +----B班
           |__学生2
           |__学生1
注:学生在一张表中,有字段判断是哪个班的,班级在另一个表中!

解决方案 »

  1.   

    告诉我在什么事件里写代码也好呀,我是在onchange里写的.这是我的代码,大家看看哪不对?!?
    procedure TEditGroupDialog.RzTreeView1Change(Sender: TObject;
      Node: TTreeNode);
    var Dataset_sql,Dataset_Par: string;
    begin
      if not RzTreeView1.Selected.IsFirstNode then
        begin
         Dataset_Par := RzTreeView1.Selected.Text;
         Dataset_sql := 'select * from aPeople where aGroup = ' + ' " ' + DataSet_Par + ' " ';
         ADOQuyDataset.SQL.Text := Dataset_sql;
         ADOQuyDataset.Close;
         ADOQuyDataset.Open;
         ADOQuydataset.First;
          while not ADOQuyDataset.Eof do
             begin
               RzTreeView1.Items.AddChild(RzTreeView1.Selected, ADOQuyDataset.FieldByName('name').AsString);
               ADOQuyDataset.Next;
             end;
         ADOQuyDataset.close;
        end;
    end;
      

  2.   

    TreeView1.AutoExpand := True;
      

  3.   

    postren(小虫)首先谢谢你!
    你还没有弄清楚我的意思,自动展开无所谓,只要保证a和b中只有一个节点有孩子!
    也就是说,上面当选a时,b中的孩子根本不显示(b旁边没有加号),当选b时,a中的孩子根本不显示(a旁边没有加号).
      

  4.   

    没有加号不可能,但是它会自动缩回不选择的分支,只要设置了autoexpend属性为true.
      

  5.   

    你把treeview的showbuttons 属性设置为false后,边上的'+'可通过image方法画上去呀!迂回一下就可以啦 !
      

  6.   

    上面当选a时,b中的孩子根本不显示(b旁边没有加号),当选b时,a中的孩子根本不显示(a旁边没有加号).
     你的意思就是在生成B孩子时在删除A的孩子,当然可以做到,但是不知道有什么作用,其实设置
    autoexpend属性为true.就可以在选择b时收起a了,下面把你的稍微改了一下:
    procedure TEditGroupDialog.RzTreeView1Change(Sender: TObject;
      Node: TTreeNode);
    var Dataset_sql,Dataset_Par: string;
    begin
      if not RzTreeView1.Selected.IsFirstNode then
        begin
         Dataset_Par := RzTreeView1.Selected.Text;
         Dataset_sql := 'select * from aPeople where aGroup = ' + ' " ' + DataSet_Par + ' " ';
         ADOQuyDataset.Close;
         ADOQuyDataset.Clear;
         ADOQuyDataset.SQL.Text := Dataset_sql;  
         ADOQuyDataset.Open;
         ADOQuydataset.First;
          while not ADOQuyDataset.Eof do
             begin
               RzTreeView1.Items.AddChild(RzTreeView1.Selected, ADOQuyDataset.FieldByName('name').AsString);
               ADOQuyDataset.Next;
             end;
         ADOQuyDataset.close;
        end;
    end;
      

  7.   

    各位大虾我的意思你们还没有明白,我所以要没有“加号”,是以为数据太大,所以每次只显示一个接点的孩子数据!我用的adoquery,如果每次在数据集中都是全部数据的话,那么速度会很慢的!!
      

  8.   

    XXSingle(水连天) 说的意思  对!!!
    但是我不是想仅仅得的不显示,我还想在数据集中和树中删除刚才得到的数据!!!
    多谢大家了!!!
      

  9.   

    明白楼主的意思了
    这样的话, 可以在点击结点的时候再生成该结点的子结点
    但是, 并不需要在每次点击结点的时候都做实时的数据库查询, 第一次点击该结点时查询数据库, 并生成子结点, 此时把查询到的数据放到子结点的Data指针域中, 第二次点击该结点的时候直接从Data指针域中取数据就好了, 有一点要注意: 数据库更新后要更新对应的Data指针域另外, 基本也不必在点击另一个结点的时候, 把原来展开的结点的子结点删除, 这样也会影响速度的; 如果数据缺少太大的话, 可以设定一个大小范围, 当打开的子结点超出这个范围的话再删除一定数量的子结点, 如果用Data指针域的话, 删除子结点的时候别忘了 Dispose该Data指针.
      

  10.   

    哈哈多谢神州大侠的提醒呀!
    问题已经解决了,我的代码可以用,主要是因为我用的oracle数据库,字符串方面有点问题,现在的问题,就是如何判断哪个节点有孩子?
    应该分两种情况
    1.窗体刚初始化,没有节点被选择过。
    2.已经有节点被选择过,(这个该如何判断呢?)
      

  11.   

    tempNode:=TreeView1.GetFirstNode;
    逐步查找。。tempNode:=TreeView1.Selected;
    tempNode.Count<>0?;