现有Ta,Tb,Tc三个表,三个DBGird,一个TreeView, 1.DBGird_A使用Ta,根据DBGird_A里的列生成TreeView的根节点, 
2.DBGird_B使用Tb,根据DBGird_B里的列递归生成TreeView的同级子节点。这两个问题已经解决。 3.DBGird_C使用Ta,Tb,Tc,能在展开TreeView的同时显示所有组合查询的情况下显示所有记录, 现在的关键问题是,如何在点击TreeView各子节点的时候,生成相应的DBGird_C行, 比如:点击了TreeView的子节点“房费”,生成查询到的消费类别=房费的相应记录, 
      点击了TreeView的子节点“餐费”,生成查询到的消费类别=餐费的相应记录! 
谁能给给个代码示例啊!

解决方案 »

  1.   

    大致代码,思路是这样的,未做编译procedure TMainForm.Treeview1Expanded(Sender: TObject; Node: TTreeNode);
    begin
      adoquery1.close;
      adoquery1.sql.clear;
      adoquery1.sql.text := 'select * from table1 where name='+node.text;
      
      for i := 0 to adoquery1.count-1 do
      begin
        Treeview1.items.addchild(Node,adoquery1.count[i].astring);
      end;
    end;
      

  2.   

    谢谢dd_zhouqian,你说的问题我之前已经解决了,是用您这个方法,关键的是第3点如何来实现!DBGird_C使用Ta,Tb,Tc,能在展开TreeView的同时显示所有组合查询的情况下显示所有记录有谁帮忙解决一下啊,给个思路或代码片段吧,都摸索好几天了。CSDN的DELPHI高手哪里了去了,都不用DELPHI了吗?怎么想给分都没人要了啊,奇怪了 
      

  3.   

    步骤:
    1.限度去第一级的记录,然后逐条添加到treeview中,并且为每个node的data属性保存每条记录的id
    2.数据集select所有非顶级的记录,然后循环数据集,根据每条记录的上级id,去treevie上循环节点找节点的data值符合条件的node,然后添加childnode,依次类推
      

  4.   

    不是很理解第三点,看着有点晕 
    在点击TreeView时写入你想要的sql,
    procedure TreeView1Click(Sender: TObject);
    var 
      str: string;
    begin
      try
        case TreeView1.Selected.Level of
          1:
            begin
              str := 'select * from Tc where  name='''+TreeView1.Selected.Text+'''';
              Query1.Close;
              Query1.SQL.Clear;
              Query1.SQL.Add(str);
              Query1.Open;
              DBGird_C.DataSource.DataSet := Query1;
            end;
          2:
             begin
              your sql;
            end; 
        end;
      except  end;
    end;
      

  5.   

    不好意思,可能我表述的不是很清晰!我的第三点意思是,点TreeView子节点的时候,在另外一个DBGIRD里面显示TreeView子节点的 名称=DBGIRD里面指定的列值 的记录合集。相当于
      A表的列生成了,TreeView的根节点名称,
      B表的列生成了,TreeView的各子节点名称, 这两点已经实现了。
     
     现在待实现的是:
      TreeView的各子节点名称=C表的列的时候,清除DBGIRD里面原来的记录,显示当前符合条件的记录。
      TreeView的各子节点名称不同,显示的记录也就不同了。各位高手能理解吗?这个流程怎么来走才科学。根据子节点的名称显示的记录可能有几行,也可能有几百行,存TreeView.node.Data里面,不科学吧?
      

  6.   

    TreeView只有一个根结点,然后有许多同级的子节点。很简单:root
      a
      b
      c
      d
      e
      

  7.   

    由DBGird生成TreeView时,你是如何关联的?这个是你解决问题的关键!
      

  8.   

    根结点:tv_MdseMgt_ParentName:=
                 PCH_DM.dst_BranchesMgt.FieldByName('BranchesShortName').AsString;
    tv_MdseMgt_Parent:=
    tv_MdseMgt.Items.AddChild(Nil,tv_MdseMgt_ParentName);     // 添加根节点
    tv_MdseMgt_Parent.ImageIndex:=0;               // 对根节点的图片样式进行设定
    tv_MdseMgt_Parent.SelectedIndex:= 1;
    子节点:PCH_DM.qry_MdseCategory.Refresh;
    PCH_DM.qry_MdseCategory.Close;
    PCH_DM.qry_MdseCategory.SQL.Clear;
    PCH_DM.qry_MdseCategory.SQL.Add('select ID,MdseCategoryName, IsDiscount from MdseCategory');
    PCH_DM.qry_MdseCategory.Open;
    with PCH_DM.qry_MdseCategory do
    begin
    if not PCH_DM.qry_MdseCategory.Active then
    PCH_DM.qry_MdseCategory.Active:=True;for  Add_ChildCount:=0 to PCH_DM.qry_MdseCategory.RecordCount-1 do
    begin
    ItemNode_Name:=PCH_DM.qry_MdseCategory.FieldByName('MdseCategoryName').AsString;
    ItemNode:=tv_MdseMgt.Items.AddChild(tv_MdseMgt_Parent,ItemNode_Name);   // 添加子节点
    ItemNode.ImageIndex:=1;               // 对子节点的图片样式进行设定
    ItemNode.SelectedIndex:=2+NodeIndex;
    inc(NodeIndex);
    PCH_DM.qry_MdseCategory.Next;end;
          end;
    关联的是节点的名称,取自表B的列,现在是判断树的节点名称等于组合查询语句里面的列时,在DBGIRD显示符合条件的记录。应该怎么来引用呢?
      

  9.   

    哎,楼上的各位除了3楼bdmh的思路有点意义,其它的都文不对题啊!自己用笨办法解决了。为什么说是笨办法,程序顺序往下点击节点,能出相应记录了,但当点到
    qry_MdseMgt.FieldByName('MdseCategoryName').AsString=''的时候,再往上点,原先能出来的记录也没有,非要点回所有商品才出来。没办法只有再判断一次MdseCategoryName为空的情形,并重写查询语句,怪了。这样一做反而可以了。 但是感觉代码好长,有没有办法精简下啊!完整代码:
    1.form on show的时候动态生成树,并初始化DBGIRD默认显示所有记录:procedure Tfrm_DI_MdseMgt.FormShow(Sender: TObject);
    var tv_MdseMgt_ParentName:String;
        Add_ChildCount:Integer;
        tv_MdseMgt_Parent:TtreeNode;
    ItemNode,ItemNode_AllMdseCategory:TtreeNode;
        ItemNode_Name:String;
        NodeIndex:Integer;begin
      if PCH_DM.dst_BranchesMgt.Active=False then PCH_DM.dst_BranchesMgt.Active:=True;
      with PCH_DM.dst_BranchesMgt do
      begin
        tv_MdseMgt_ParentName:=PCH_DM.dst_BranchesMgt.FieldByName('BranchesShortName').AsString;
        tv_MdseMgt_Parent:=tv_MdseMgt.Items.AddChild(Nil,tv_MdseMgt_ParentName);     // 添加根节点
        tv_MdseMgt_Parent.ImageIndex:=0;               // 对根节点的图片样式进行设定
        tv_MdseMgt_Parent.SelectedIndex:= 0;
      end;  NodeIndex:=0;
      with PCH_DM.qry_MdseCategory do
      begin
      PCH_DM.qry_MdseCategory.Close;
      PCH_DM.qry_MdseCategory.SQL.Clear;
      PCH_DM.qry_MdseCategory.SQL.Add('select ID,MdseCategoryName, IsDiscount from MdseCategory');
      PCH_DM.qry_MdseCategory.Open;
        for  Add_ChildCount:=0 to PCH_DM.qry_MdseCategory.RecordCount-1 do
        begin
          ItemNode_Name:=PCH_DM.qry_MdseCategory.FieldByName('MdseCategoryName').AsString;
          ItemNode:=tv_MdseMgt.Items.AddChild(tv_MdseMgt_Parent,ItemNode_Name);     // 添加子节点
         ItemNode.ImageIndex:=1;               // 对子节点的图片样式进行设定
          ItemNode.SelectedIndex:=2+NodeIndex;
          inc(NodeIndex);
          PCH_DM.qry_MdseCategory.Next;
        end;
      end;  ItemNode_AllMdseCategory:=tv_MdseMgt.Items.AddChild(tv_MdseMgt_Parent,'所有商品');
      ItemNode_AllMdseCategory.ImageIndex:=1;
      ItemNode_AllMdseCategory.SelectedIndex:=1;  tv_MdseMgt.FullExpand;  if tv_MdseMgt_Parent.Text<>'' then
      begin
        with PCH_DM.qry_MdseMgt do
        begin
          PCH_DM.qry_MdseMgt.Close;
          PCH_DM.qry_MdseMgt.SQL.Clear;
          PCH_DM.qry_MdseMgt.SQL.Add('select MdseMgt.ID,BranchesMgt.BranchesShortName,');
          PCH_DM.qry_MdseMgt.SQL.Add('MdseCategory.MdseCategoryName,MdseMgt.MdseEncoding,');
          PCH_DM.qry_MdseMgt.SQL.Add('MdseMgt.MdseName,MdseMgt.IsSelected,MdseMgt.FirstSpell,');
          PCH_DM.qry_MdseMgt.SQL.Add('MdseMgt.Price,MdseMgt.Discount,MdseMgt.MemPrice,MdseMgt.ServeTime'+' ');
       PCH_DM.qry_MdseMgt.SQL.Add('from BranchesMgt,MdseCategory,MdseMgt'+' ');
       PCH_DM.qry_MdseMgt.SQL.Add('where MdseCategory.ID=MdseMgt.MdseCategoryID');
          PCH_DM.qry_MdseMgt.Open;
        end;
      end;
    end;
    2.在TreeView on Change的时候判断子节点名称与记录集里面的名称是否对应,对应则显示相应记录:procedure Tfrm_DI_MdseMgt.tv_MdseMgtChange(Sender: TObject;
      Node: TTreeNode);
    var tv_node_Index:Integer;begin
    if tv_MdseMgt.Selected.SelectedIndex>0 then
      begin
       for tv_node_Index:=0 to tv_MdseMgt.Items.Count-1 do
        begin
         if tv_MdseMgt.Selected.Text='所有商品' then
          begin
         with PCH_DM.qry_MdseMgt do
         begin
           PCH_DM.qry_MdseMgt.Close;
          PCH_DM.qry_MdseMgt.SQL.Clear;
           PCH_DM.qry_MdseMgt.SQL.Add('select MdseMgt.ID,BranchesMgt.BranchesShortName,');
           PCH_DM.qry_MdseMgt.SQL.Add('MdseCategory.MdseCategoryName,MdseMgt.MdseEncoding,');
           PCH_DM.qry_MdseMgt.SQL.Add('MdseMgt.MdseName,MdseMgt.IsSelected,MdseMgt.FirstSpell,');
           PCH_DM.qry_MdseMgt.SQL.Add('MdseMgt.Price,MdseMgt.Discount,MdseMgt.MemPrice,MdseMgt.ServeTime'+' ');
       PCH_DM.qry_MdseMgt.SQL.Add('from BranchesMgt,MdseCategory,MdseMgt'+' ');
       PCH_DM.qry_MdseMgt.SQL.Add('where MdseCategory.ID=MdseMgt.MdseCategoryID');
           PCH_DM.qry_MdseMgt.Open;
         end;
         end
         else if trim(tv_MdseMgt.Items.Item[tv_node_Index].Text)=trim(PCH_DM.qry_MdseMgt.FieldByName('MdseCategoryName').AsString) then
         begin
           with PCH_DM.qry_MdseMgt do
           begin
             PCH_DM.qry_MdseMgt.Close;
             PCH_DM.qry_MdseMgt.SQL.Clear;
             PCH_DM.qry_MdseMgt.SQL.Add('select MdseMgt.ID,BranchesMgt.BranchesShortName,');
             PCH_DM.qry_MdseMgt.SQL.Add('MdseCategory.MdseCategoryName,MdseMgt.MdseEncoding,');
             PCH_DM.qry_MdseMgt.SQL.Add('MdseMgt.MdseName,MdseMgt.IsSelected,MdseMgt.FirstSpell,');
             PCH_DM.qry_MdseMgt.SQL.Add('MdseMgt.Price,MdseMgt.Discount,MdseMgt.MemPrice,MdseMgt.ServeTime'+' ');
             PCH_DM.qry_MdseMgt.SQL.Add('from BranchesMgt,MdseCategory,MdseMgt'+' ');
             PCH_DM.qry_MdseMgt.SQL.Add('where MdseCategory.ID=MdseMgt.MdseCategoryID and MdseCategory.MdseCategoryName=:dbgrdh_MdseMgt_DispRec');
             PCH_DM.qry_MdseMgt.Parameters.ParamByName('dbgrdh_MdseMgt_DispRec').Value:=tv_MdseMgt.Selected.Text;
         PCH_DM.qry_MdseMgt.Open;
             PCH_DM.qry_MdseCategory.Next;
           end;
         end
         else if PCH_DM.qry_MdseMgt.FieldByName('MdseCategoryName').AsString='' then
    begin
           with PCH_DM.qry_MdseMgt do
           begin
             PCH_DM.qry_MdseMgt.Close;
         PCH_DM.qry_MdseMgt.SQL.Clear;
             PCH_DM.qry_MdseMgt.SQL.Add('select MdseMgt.ID,BranchesMgt.BranchesShortName,');
             PCH_DM.qry_MdseMgt.SQL.Add('MdseCategory.MdseCategoryName,MdseMgt.MdseEncoding,');
             PCH_DM.qry_MdseMgt.SQL.Add('MdseMgt.MdseName,MdseMgt.IsSelected,MdseMgt.FirstSpell,');
             PCH_DM.qry_MdseMgt.SQL.Add('MdseMgt.Price,MdseMgt.Discount,MdseMgt.MemPrice,MdseMgt.ServeTime'+' ');
             PCH_DM.qry_MdseMgt.SQL.Add('from BranchesMgt,MdseCategory,MdseMgt'+' ');
             PCH_DM.qry_MdseMgt.SQL.Add('where MdseCategory.ID=MdseMgt.MdseCategoryID and MdseCategory.MdseCategoryName=:dbgrdh_MdseMgt_DispRec');
             PCH_DM.qry_MdseMgt.Parameters.ParamByName('dbgrdh_MdseMgt_DispRec').Value:=tv_MdseMgt.Selected.Text;
             PCH_DM.qry_MdseMgt.Open;
             PCH_DM.qry_MdseCategory.Next;
           end;
         end;
       end;
    end;
    end;
    测试都对了,但请各位高手看看还可以优化下代码吗?
      

  10.   

    DbNetSpell 是一个多语言拼写检查组件,可以在几分钟之内添加完整功能的、专业的文本修正到你的网页中。具体功能:    完全封装的组件——几分钟内添加拼写检查功能到已有页面
        无需安装客户端——不需要工具栏或额外下载
        支持文本元素例如 INPUT 和 TEXTAREA,和可编辑 HTML 元素例如 DIV
        跨越浏览器——支持 IE 和 Mozilla
        用户可扩展字典——用自己的词汇表自定义字典内容
        Ajax 风格组件——无需刷新页面就自动更新
        作为一个客户端 JavaScript 对象或服务端控件来实现
        包含集成的 HTML 编辑器
        鉴别潜在错误,提供可选拼写
        多语言支持——包括美国英语、法语、德语、西班牙语、意大利语、伊比利亚葡萄牙语和巴西葡萄牙语
        完全可配置DbNetSpell 是不是这个?