在Treeview控件中想把一个查询的结果集都作为某一节点的子节点,求代码

解决方案 »

  1.   

    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;
      

  2.   

    procedure TForm1.Button1Click(Sender: TObject);
    var Node, ChildNode: TTreeNode;
    begin
      Node := TreeView1.Selected;
      if Node = nil then Exit;
      with Query do
      begin
        Close;
        Sql.Text := 'select * from tablename where colname='''+Node.Text+'''';
        Open;
        while not Eof do
        begin
          ChildNode:= TreeView1.Items.AddChild(Node,FieldByName('colname2').AsString);
          ChildNode.Text := FieldByName('colname2').AsString;
          Next;
        end;
      end;
    end;
      

  3.   

    其实很简单
    TTreeItem有这样一个属性Data,它是一个指针,专门来指向自定义数据的。
    比如你定义一个数据类型TDataTest,直接把对象或变量赋值给Data属性就行了;
    调用的时候只要将指针强制转换成你定义的类型就可以直接用了。请注意Data只是个指针,TTreeView不提供相应的内存管理,要自己创建和释放!
      

  4.   

    用DEVEXPRESS中的DBTreeView实现,www.51delphi.com有下载很慢,19MB花了我3个钟头如果要QQ我发给你。D7的所有控件不同同时安装?WHY?版本问题.所有的有碍好要么?
      

  5.   

    将数据库的KeyField存到Node.Data属性中执行时动态从数据库中查找一般要在Key前加一个前缀