代码如下:procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
var node1,node2:TTreeNode;
begin
  case Node.Level of
    0: begin
         with query1 do
         begin
         close;
         sql.Clear;
         sql.Add('select * from dx where  单位= :单位');
         params.Items[0].AsString:=treeview1.Selected.Text;
         query1.Prepare;
         open;
         end;
       end;
    1: begin
         node1:=Node.Parent;
         Query1.Locate('单位;部门',vararrayof  
node1.text,Node.Text]),[]);
       end;
    2: begin
         node2:=Node.Parent;
         node1:=node2.Parent;
         Query1.Locate('单位;部门;姓名',vararrayof([node1.text,node2.text,Node.Text]),[]);
       end;
  end;
end;

解决方案 »

  1.   

    我想,你的问题应该是query的内容太了吧;
      

  2.   

    有点不明白你的意思,你的返回是指树结点?还是dbgrid里的数据?
    我上次没有写?
    如果树结点的话,有点麻烦,你看一看,windows的资源管理器,就知道了
    如果是dbgrid的话,我上次的有什么错?
    我下去可以再帮你试一试;
      

  3.   

    to  ihihonline(小小->充电中……) 
    谢谢,看来还是要麻烦你了,我给你加分。
    是树的结点。其他的朋友如果有兴趣还可以参考   http://www.csdn.net/expert/topic/718/718390.xml?temp=.507641
      

  4.   

    现在我依次单击treeview结点d,b,b1,b2,b3结点可以实现,依次单击e,c,c2,c2,c3可以实现,但从e,c,c2,c2,c3这些结点再依次返回d,b,b1,b2,b3时却不可以了
      

  5.   

    补充楼上 to  ihihonline(小小->充电中……) 
    也就是e不能返回(d,b,b1,b2,b3)c1,c2,c3也不可以,但如e,c1,c2,c3这些结点要依次返回结点d,b,b1,b2,b3时,先单击d根结点,就可以。
      

  6.   

    不应该啊,那你这样吧,
    procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
    var node1,node2:TTreeNode;
    begin
      case Node.Level of
        0: begin
             with query1 do
             begin
             close;
             sql.Clear;
             sql.Add('select * from dx where  单位= :单位');
             params.Items[0].AsString:=treeview1.Selected.Text;
             query1.Prepare;
             open;
             end;
           end;
        1: begin
             query1.Close;
             query1.Open;
             node1:=Node.Parent;
             Query1.Locate('单位;部门',vararrayof  
    node1.text,Node.Text]),[]);
           end;
        2: begin
             node2:=Node.Parent;
             node1:=node2.Parent;
             query1.Close;
             query1.Open;
             Query1.Locate('单位;部门;姓名',vararrayof([node1.text,node2.text,Node.Text]),[]);
           end;
      end;
    end;
      

  7.   

    不应该啊,那你这样吧,
    procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
    var node1,node2:TTreeNode;
    begin
      case Node.Level of
        0: begin
             with query1 do
             begin
             close;
             sql.Clear;
             sql.Add('select * from dx where  单位= :单位');
             params.Items[0].AsString:=treeview1.Selected.Text;
             query1.Prepare;
             open;
             end;
           end;
        1: begin
             query1.Close;
             query1.Open;
             node1:=Node.Parent;
             Query1.Locate('单位;部门',vararrayof  
    node1.text,Node.Text]),[]);
           end;
        2: begin
             node2:=Node.Parent;
             node1:=node2.Parent;
             query1.Close;
             query1.Open;
             Query1.Locate('单位;部门;姓名',vararrayof([node1.text,node2.text,Node.Text]),[]);
           end;
      end;
    end;
      

  8.   

    to  ihihonline(小小->充电中……) 还是不行呀
    也就是e不能返回(d,b,b1,b2,b3)c1,c2,c3也不可以,但如e,c1,c2,c3这些结点要依次返回结点d,b,b1,b2,b3时,先单击d根结点,就可以。
    如果单击“+”号的事件和单击“+”旁的节点相同就可以实现其他的朋友如果有兴趣还可以参考   http://www.csdn.net/expert/topic/718/718390.xml?temp=.507641
      

  9.   

    你在treeview里边是不是还有其它的什么事件?
    是什么呢?
    又写了什么?
    如果不行,就不用locate,每次让其动态的产生
      

  10.   

    没有了,只有一个chang事件,不过我的树是动态产生的,通过query.我把程序发到 你的信箱你看看。
      

  11.   

    我也在编这样一个程序,麻烦你调出来给我也发一个,不好意思,希望是所有源代码,我的email是[email protected] or [email protected]
    你发在这里也可以
    谢谢了
      

  12.   

    ihihonline(小小->充电中……) ,我的一个程序也需要这个功能,希望你调出来也给我发一份,麻烦了,谢谢!
    我的信箱是:[email protected]
      

  13.   

    TO  cxy8000(cxy1016) 
    我已经给您发过去了;
    希望您收到可以回复一收;TO deminxh(demi) and shilydream(波波) 
    我的信箱:
      [email protected]
      先给一封确认的信和你们的要求;
      

  14.   

    我没有别的意思,我只是怕你收不到,我想是显示全部记录(包括符合的,不符合的0,只是单击如部门时,dbgrid指向符合条件的第一条记录上。我也知道locate只可查到一条记录,所以我想先显示全部,再指定在符合条件的一条记录上
    ----------------------------------------------------------------
      

  15.   

    你给我的程序是这样的   单击如单位则显示符合本单位的全部记录
                         单击如部门则显示符合本部门全部记录
                         单击如姓名则显示符合本单位的全部记录
    我的要求是显示全部记录(包括符合的,不符合的0,只是单击如部门时,dbgrid指向符合条件的第一条记录上。我也知道locate只可查到一条记录,所以我想先显示全部,再指定在符合条件的一条记录上。
    如单击“生产科”dbgrid显示全部记录,只是指向符合“生产科”的第一条记录上                     
                         
      

  16.   

    if Noed1.Text <> FieldByName('单位') then
    begin
      with Query4 do
      begin
       ...//变参只要单位;
      end; 
    end;
    Query4.Locate(您的语句);
    Level = 1 or Level = 2 只要变一下判断条件就可以了;
      

  17.   

    我用TreeView做了一个产品信息树型查找程序,不知你有没兴趣。
    如有请留下Email
      

  18.   

    您真懒啊,呵呵,我的Email在上边写着啊;
    反正也写了,也不怕再写一次;
    [email protected]
      

  19.   

    你好,我己完成了我想要全部的功能。
    procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
    var
    Node1 ,Node2 :TTreeNode;
    begin
    case Node.Level of//缩进两格;
    0: begin
    with Query4 do
    begin
    Close;
    SQL.Clear;
    SQL.Add('select * from dx where 单位 = :value1');
    Params.Items[0].AsString:=Treeview1.Selected.Text;
    Prepare;
    Open;
    end;
    end;
    1: begin
    Node1 := Node.Parent;
    with Query4 do
    begin
    Close;
    SQL.Clear;
    SQL.Add('Select * from dx where 单位 = :Value1');
    Params.Items[0].AsString := Node1.Text ;
    PrePare;
    Open;
    Query4.Locate('单位;部门',vararrayof([node1.text,Node.Text]),[]);
    end;
    end;
    2: begin
    Node2 := Node.Parent;
    Node1 := Node2.Parent;
    with Query4 do
    begin
    Close;
    SQL.Clear;
    SQL.Add('Select * from dx where 单位 = :Value1 ');
    Params.Items[0].AsString := Node1.Text ;
    PrePare;
    Open;
    Query4.Locate('单位;部门;姓名',vararrayof([node1.text,node2.text,Node.Text]),[]);
    end;
    end;
    end;
    end;
      

  20.   

    procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode;
      var AllowExpansion: Boolean);
    var
    Node1 ,Node2 :TTreeNode;
    begin
    case Node.Level of//缩进两格;
    0: begin
    with Query4 do
    begin
    Close;
    SQL.Clear;
    SQL.Add('select * from dx where 单位 = :value1');
    Params.Items[0].AsString:=node.Text;
    Prepare;
    Open;
    end;
    end;
    1: begin
    Node1 := Node.Parent;
    with Query4 do
    begin
    Close;
    SQL.Clear;
    SQL.Add('Select * from dx where 单位 = :Value1');
    Params.Items[0].AsString := Node1.Text ;
    PrePare;
    Open;
    Query4.Locate('单位;部门',vararrayof([node1.text,Node.Text]),[]);
    end;
    end;
    end;end;
      

  21.   

    可是代码重复量太大,不理想。sql语句太多,数据库大了,可能会很慢,请有兴趣的网友再深入一下讨论,代码重复的应如何处理。
      

  22.   

    Params.Items[0].AsString := Node1.Text ;
    这句话甚么用?
    请指教
      

  23.   

    hehe;
    Pamams.Items[0].AsString//query里的第1个参数;
    Node1.Text;//selectedNocd -> Parent;父节点的text;
      

  24.   

    怎么用,你看
    procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode;  var AllowExpansion: Boolean);
    和procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
    代码重复太大,优化一下,怎么用数组
    {procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode;  var AllowExpansion: Boolean);}是单击“+”所发生的事件,若不加,则单击“+”时dbgrid为空或(active为false)
    一个事件中代码重复量也很大,用什么代替一下?
      

  25.   

    可以,将TreeView里的数据改写成数组的形式就可以了;
      

  26.   

    //参考如下代码procedure TForm1.TreeView1GetSelectedIndex(Sender: TObject;
      Node: TTreeNode);  function TreeNodeFilter(mTreeNode: TTreeNode): string;
      begin
        Result := '';
        while Assigned(mTreeNode) do begin
          Result := '<&Replace>' + QuotedStr(mTreeNode.Text) + Result;
          mTreeNode := mTreeNode.Parent;
        end;
        Result := StringReplace(Result, '<&Replace>', '单位 = ', []);
        Result := StringReplace(Result, '<&Replace>', ' AND 部门 = ', []);
        Result := StringReplace(Result, '<&Replace>', ' AND 姓名 = ', []);
      end;begin
      ADOTable1.Filter := TreeNodeFilter(TTreeView(Sender).Selected);
      ADOTable1.FindFirst;
    end;
      

  27.   

    //参考如下代码procedure TForm1.TreeView1GetSelectedIndex(Sender: TObject;
      Node: TTreeNode);  function TreeNodeFilter(mTreeNode: TTreeNode): string;
      begin
        Result := '';
        while Assigned(mTreeNode) do begin
          Result := '<&Replace>' + QuotedStr(mTreeNode.Text) + Result;
          mTreeNode := mTreeNode.Parent;
        end;
        Result := StringReplace(Result, '<&Replace>', '单位 = ', []);
        Result := StringReplace(Result, '<&Replace>', ' AND 部门 = ', []);
        Result := StringReplace(Result, '<&Replace>', ' AND 姓名 = ', []);
      end;begin
      ADOTable1.Filter := TreeNodeFilter(TTreeView(Sender).Selected);
      ADOTable1.FindFirst;
    end;
      

  28.   

    TO zswang(伴水)(* 嘻 *) 
    你的学生这几天生病了,让我特意转告你,她不能来听你上课了;
      

  29.   

    to ihihonline:祝愿她早日康复
      

  30.   

    params.Items[0].AsString:=treeview1.Selected.Text;我调试时老说没有定义params,为什么?
    SOS!!!!!
      

  31.   

    請問下面這句是是麼意思  ??
       Params.Items[0].AsString := Node1.Text ;我剛用treeview做完2層的bbs,沒有你們的複雜...
      

  32.   

    to nodefault
    那你是怎么做的?
      

  33.   

    to nodefault:
      很簡單的.我貼在那兒?? 你寫個帖子,我貼上吧.另外我看到了;
     回复人: ihihonline(小小-&gt;充电中……) (  ) 信誉:92  2002-05-24 13:27:00  得分:0  
      hehe;
    Pamams.Items[0].AsString//query里的第1个参数;
    Node1.Text;//selectedNocd -> Parent;父节点的text;
      
     
      

  34.   

    我也在编这样一个程序,麻烦你调出来给我也发一个,不好意思,希望是所有源代码,我的email是[email protected]
    你发在这里也可以
    谢谢了
      

  35.   

    TO  deminxh(demi) 已经给你发了过去了;
    ADO里,没有Params.Items的;
    程序里都写着呢,你去收吧,祝你好运;