当前树根据数据库中对应的数据生成,同一父节点下的兄弟结点根据数据库中对应的一个字段值排序.当在树中选中的当前结点(child2)之前插入一个新结点(add1)时(同时也在数据库中插入了一条记录,并改变了当前结点及后续兄弟点对应的排序字段的值),插入完毕后,我将原选中结点(child2)的父结点(parent1)的expanded属性置为true,但是显示的结果却变成了(图三), 目前我要想显示成正确的情况(图二),除非将TreeView重新构造一遍,但是在重新构造以后又找不着原来选中的节点了.
请问各位老兄有什么简便的方法能在插入节点以后能正确显示成(图二)
图一
  parent1 
   |__child1
   |__child2(selected)
图二(正确结果)
  parent1(selected)
   |__child1
   |__add1
   |__child2
图三(实际情况)
  parent1 
   |__child1
   |__child2(selected)
   |__add1

解决方案 »

  1.   

    treeview1.Items.Insert(treeview1.Selected,'addl');
    此处treeview1.selected为child2
    写数据库你自己搞定
      

  2.   

    var node:TNode;
    ...........
    node:=treeview1.Items.AddChild(treeview1.Selected.Parent,'新建部门');
    node:=treeview1.Items.AddChild(treeview1.Selected,'新建部门');
    .......
      

  3.   

    procedure Tda.xlmcClick(Sender: TObject);
    var
        nodecel : array[0..10] of TtreeNode;
        sqlstr,s1,s2:string;
        tempstr :array[0..10] of string;
        tempBoolean :array[0..10] of Boolean;
        Nodetitle :TtreeNode;
    begin
        if (xlmc.text='') or (wz.text='') then begin
            
            exit;
        end;
        screen.Cursor:=crHourGlass;
        if Sender<>cmdok then
            key.Text:='0';
        TreeView1.Items.Clear;
        TreeView1.Items.BeginUpdate;
        new(nodeid);
        dispose(nodeid);
        nodecel[0] := TreeView1.Items.AddFirst (nil, xlmc.text);
        nodecel[0].ImageIndex := 0;
        nodecel[0].SelectedIndex := 3;
        if wz.text<>'全部' then
            sqlstr:='select 首桩号,首桩米,尾桩号,尾桩米,id from  绿化档案 where 道路='''+copy(xlmc.text,1,pos(':',xlmc.text)-1)+''' and 位置='''+wz.text+''' order by 首桩号,首桩米,尾桩号,尾桩米'
        else
            sqlstr:='select 首桩号,首桩米,尾桩号,尾桩米,绿化档案.位置,id from 绿化档案 INNER JOIN lib_位置 ON 绿化档案.位置 = lib_位置.位置 where 道路='''+copy(xlmc.text,1,pos(':',xlmc.text)-1)+''' order by 首桩号,首桩米,尾桩号,尾桩米,lib_位置.序号';
        ADODataSet1.commandtext:=sqlstr;
        ADODataSet1.open;
        while not ADODataSet1.eof  do
        begin
            tempBoolean[1]:=false;
            s1:=ADODataSet1.FieldByName('首桩号').AsString;
            s2:=ADODataSet1.FieldByName('首桩米').AsString;
            if ADODataSet1.FieldByName('首桩米').asinteger=0 then
                sqlstr:= s1
            else
                if ADODataSet1.FieldByName('首桩米').asinteger>0 then
                    sqlstr:= s1 +'(+'+s2+')'
                else
                    sqlstr:= s1 +'('+s2+')';
            sqlstr:= sqlstr+'--';
            s1:=ADODataSet1.FieldByName('尾桩号').AsString;
            s2:=ADODataSet1.FieldByName('尾桩米').AsString;
            if ADODataSet1.FieldByName('尾桩米').asinteger=0 then
                sqlstr:= sqlstr+s1
            else
                if ADODataSet1.FieldByName('尾桩米').asinteger>0 then
                    sqlstr:= sqlstr+s1 +'(+'+s2+')'
                else
                    sqlstr:= sqlstr+s1 +'('+s2+')';
            if wz.text='全部' then
                begin
                if (tempstr[1] <>sqlstr) then
                    begin
                    tempstr[1] :=sqlstr;
                    nodecel[1] := TreeView1.Items.AddChild(nodecel[0], tempstr[1]);
                    nodecel[1].ImageIndex := 1;
                    nodecel[1].SelectedIndex := 3;
                    end;
                new(nodeid); nodeid^:=ADODataSet1.FieldByName('id').asinteger;
                Nodetitle :=TreeView1.Items.AddChildObject(nodecel[1], ADODataSet1.FieldByName('位置').AsString,nodeid);
                Nodetitle.ImageIndex := 2;
                Nodetitle.SelectedIndex := 3;
                end
            else
                begin
                if (tempstr[1] <>sqlstr) then
                new(nodeid); nodeid^:=ADODataSet1.FieldByName('id').asinteger;
                Nodetitle :=TreeView1.Items.AddChildObject(nodecel[0], sqlstr,nodeid);
                Nodetitle.ImageIndex := 2;
                Nodetitle.SelectedIndex := 3;
                end;
            ADODataSet1.Next;
        end;
        nodecel[0].Expanded := True;
        ADODataSet1.close;
        ADODataSet1.CursorLocation:=clUseClient;
        ADODataSet1.CursorType:=ctDynamic;
        ADODataSet1.LockType:=ltOptimistic;
        TreeView1.Items.endUpdate;
        screen.Cursor:=crDefault;
    end;