e2  1   aaa
e2  2   abb
e2  3   ccc
e3  1   ad
e3  2   dddatreeview1 已生成如下:
e2  1
    2
    3
e3  1
    2
现点e2 1    //edit1 显示:aaa
       2    //edit1 显示:abb
如何写代码?

解决方案 »

  1.   

    法一:直接查询法
    node := TreeView1.Selected;
    if node = nil then Exit;
    if node.level <> 1 then Exit; //看你要点的是哪层就设为几
    que.SQL.Text := 'select field3 from table where field1 = '+QuotedStr(Node.Parent.Text)+' and field2='+QuotedStr(Node.Text);
    que.Open;
    if not Que.Eof then
      Edit1.Text := que.FieldValues[0];
    que.Close;
      

  2.   

    在TreeView1的ONCLICK事件中寫一個查詢語句不就行了啊﹔(假設列分別為﹕e,no,name)
    try
    with query1 do
    begin 
      close;
      sql.clear;
      sql.add('select * from 表 where e=:e and no=:no');;
      params[0].value:=TreeView1.Selected.Parent.Text;
      params[1].value:=TreeView1.Selected.Text;
      open;
      edit1.text:=fieldbyname('name').asstring;
    end;
    except
    ...
    end;
      

  3.   

    可是treeview怎么对地下的树形的子项的onclick事件定义?
      

  4.   

    法二:树节点保存信息法。
    TTreeNode的属性较多,比如SelectedIndex,ImageIndex,StateIndex,Data等。要存储数值型的自定义数据时,可以直接使用SelectedIndex,ImageIndex,StateIndex(当然,这些属性并未被利用,也就是说没有关联图标)。如果要使用字符串或对象,则可以使用一个TStringList或TList来保存字符串或对象,然后将Node.Data指向它。转换时使用String和Pointer(TList的元素使用相应的类转化)。
    在生成树节点时,就将要保存的信息写入TSTringList(或TList),然后将Node.Data指向这一项。
    点击树节点时,直接取出Node.Data并转化即可。
    这里就不附源代码了。
      

  5.   

    onchang里写
    edit1.text:=node.Text;
      

  6.   

    我想请问我在左边放置一个treeview控件,我想让右边的部分来显示treeview里面的项目对应的form?如果可以怎么做?谢谢告知QQ:86777770
      

  7.   

    在onClick()或onChange()事件中,即选中结点时做 SQL 方法速度太慢,可以在加载TreeView树时就写入各结点的Data值,例 e2 --> 1 结点的Data值aaa,属性Data没有值时也要赋空值,防止错误。
       在onChange()事件写比较好,即选中结点变化时才做,onClick()即使在同一结点连续点击也触发事件
      

  8.   

    to:LuckyJan(小虾无招)
    能给完整源码吗?(onChange())
      

  9.   

    上面的各位高手已经很详细了啊.procedure TFrmMain.TreeView1Change(Sender: TObject; Node: TTreeNode);
    begin
      if Treeview1.Selected=nil then exit; 
    //如果没有选中无需显示,假如没有选择Node而此事件又被触发的话会出错
      if TreeView1.Selected.Parent<>nil 
        then  Edit1.Text:=(TreeView1.Selected.Text);
    //当点击或移动到e2之类的node时同样会触发onchange事件,在这里要判断
    end;另外 onchange事件还可以响应光标的移动选择,而onclick则只能响应鼠标
    所以用onchange会较好.
      

  10.   

    to:FCBFighter(巴塞罗那角斗士)
    run 无变化呀!!!d6+xp
    生成树的源码如下:
    procedure TForm1.FormCreate(Sender: TObject);
    var v_louno:string;
        node1:Ttreenode;
    begin
      with Query1 do
      begin
        close;
        sql.clear;
        sql.add('select louno from 表  group by louno');
        open;
        while not eof do
        begin
          v_luono:=fieldbyname('louno').asstring;
          node1:=treeview1.Items.AddChild(nil,v_luono);        
          with Query2 do
          begin
            close;
            sql.clear;
            sql.add('select distinct unitno from 表 where luono='''+v_louno+'''');
            open;
            while not eof do
            begin
              treeview1.Items.AddChild(node1,query2.fieldbyname('unitno').asstring);
              next;
            end;
            query2.close;
          end;
          next;
        end;
        close;
      end;
     end;
    表:
    louhao unitno beizhu
    e2  1   aaa
    e2  2   abb
    e2  3   ccc
    e3  1   ad
    e3  2   ddda
      

  11.   

    修正:表:
    louno unitno beizhu
    e2  1   aaa
    e2  2   abb
    e2  3   ccc
    e3  1   ad
    e3  2   ddda
      

  12.   

    Re:你的"无变化"是指生成树失败还是选择时不能反应?楼主请参阅CSDN的两贴:
    http://expert.csdn.net/Expert/topic/1792/1792844.xml?temp=.36401
    http://expert.csdn.net/Expert/topic/1775/1775118.xml?temp=5.711001E-02
    估计可以解决你的问题.我看了你的要求.
    有一种做法就是在Selected的时候做一个函数专门在另一表中查找与selected.text
    相符记录显示.但这种方法会大量对表的操作,会降低速度.折衷的方法是提前建数组
    存储,但我觉得这不种上佳方法.另一种做法我觉得LuckyJan(小虾无招) 的方法更可取.用Data来存储你要反映的值.
    但Data是个指针(?)这方法我也不熟悉恐无法帮到你.你在上面我贴出地址的两贴应该可以找到答案的.Good luck!
      

  13.   

    node有个data属性,可以存放相关的数据,你可以在生成树node的时候,将node的数据写进去,就可以了
      

  14.   

    TNodeItem=record
        ID:integer;
        Name:string
      end;
      PNodeItem=^TNodeItem;var  aNode,bootNode: TTreeNode;   item:PNodeItem;根:
      new(item);
      item^.ID:=fieldbyname('ID').asinteger;
      item^.Name:=fieldbyname('Name').asString;
      bootNode:=TV.Nodes.Addobject(nil,'boot1',item);
    其他:
      new(item);
      item^.ID:=fieldbyname('ParentID').asinteger;
      item^.Name:=fieldbyname('Name').asString;
      TV.Nodes.AddChildobject(bootNode,'otherNode',item);