各位大虾:
   一个treeview有两层节点,第一层是所有客户名称,第二层是每个客户的销售单,我想实现以下功能:当单击第一层客户名称时,显示客户的详细信息;单击第二层客户的销售单时,显示该客户该销售单所订购的产品信息。treeview的所有节点都是程序运行时创建的,以上功能的实现代码分别写在什么对象的什么事件中才能实现以上功能呢?   谢谢!

解决方案 »

  1.   

    就在OnNodeChange事件中处理即可.根据不同的Node进行相应的处理.
      

  2.   

    OnClick事件處理.  // BESTreeView is TTreeView
      if BESTreeView.Selected.HasChildren then //显示客户的详细信息處理過程
      else 显示该客户该销售单所订购的产品信息;  可根據BESTreeView.Selected.Text值來判斷點擊的內容
      

  3.   

    自己建立一个新的类继承自TTreeNode  TMyNode(for example)
    然后加上相应的属性就行了
    在运行创建的时候用AddChildObject
    随后在onChange或者OnClick里面用
         TMyNode(TreeView.Selected.Data).AnyProperty
    AnyProperty就是你新建的类的属性了
       
      

  4.   

    以前应聘写的TreeView ListView的Demounit DemoTreeCodeFrm;
    interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Menus, ComCtrls, ToolWin, ExtCtrls, ImgList, DB, DBTables;type
      TfrmDemoTree = class(TForm)
        mmDemoTree: TMainMenu;
        mmFile: TMenuItem;
        mmFile_Exit: TMenuItem;
        mmOperate: TMenuItem;
        mmOperate_CnDB: TMenuItem;
        mmFG_One: TMenuItem;
        mmOperate_BuildTree: TMenuItem;
        mmHelp: TMenuItem;
        mmHelp_AboutThis: TMenuItem;
        mmHelp_AboutWindows: TMenuItem;
        toolbDemoTree: TToolBar;
        toolbtnExit: TToolButton;
        toolbtnFG_One: TToolButton;
        toolbtnCnDB: TToolButton;
        toolbtnBuildTree: TToolButton;
        tvDemoTree: TTreeView;
        spltDemoTree: TSplitter;
        lvDemoTree: TListView;
        imglstToolbtn: TImageList;
        toolbtnDiscnDB: TToolButton;
        mmOperate_DiscnDB: TMenuItem;
        imglstTree: TImageList;
        sbDemo: TStatusBar;
        Query1: TQuery;
        procedure FormShow(Sender: TObject);
        procedure toolbtnCnDBClick(Sender: TObject);
        procedure toolbtnDiscnDBClick(Sender: TObject);
        procedure mmOperate_DiscnDBClick(Sender: TObject);
        procedure mmOperate_CnDBClick(Sender: TObject);
        procedure mmFile_ExitClick(Sender: TObject);
        procedure toolbtnExitClick(Sender: TObject);
        procedure tvDemoTreeClick(Sender: TObject);
        procedure toolbtnBuildTreeClick(Sender: TObject);
        procedure mmOperate_BuildTreeClick(Sender: TObject);
        procedure tvDemoTreeMouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure lvDemoTreeMouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure toolbtnExitMouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure toolbtnCnDBMouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure toolbtnDiscnDBMouseMove(Sender: TObject; Shift: TShiftState;
          X, Y: Integer);
        procedure toolbtnBuildTreeMouseMove(Sender: TObject;
          Shift: TShiftState; X, Y: Integer);
        procedure toolbDemoTreeMouseMove(Sender: TObject; Shift: TShiftState;
          X, Y: Integer);
        procedure sbDemoMouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
      private
        { Private declarations }    mem_strDBName: string;  //用于存放数据库名     //连接数据库
        procedure ConnectDB();     //断开数据库连接
        procedure DisConnectDb();     //通用的执行SQL语句函数
        procedure ExecQry(mSQL:string;mQry:tquery;mIsSelect:Boolean);     //初始化树
        procedure InitTree();     //用递归生成树
        procedure BuildTree(mP_TreeNode:TTreeNode;mPid:integer);     //初始化ListView列表
        procedure InitListView();
      public
        { Public declarations }
      end;
    var
      frmDemoTree: TfrmDemoTree; //模块外部接口函数
    procedure Show_DemoTreeFrm();implementationuses DemoTreeCodeDM;procedure Show_DemoTreeFrm();
    var
      iResult:Integer;
    begin  frmDemoTree := TfrmDemoTree.Create(Application);
      try    iResult := frmDemoTree.ShowModal;
        if iResult = mrok then
        begin
          //处理
        end
        else
        begin
          //处理
        end;
      finally
        frmDemoTree.Release;
      end;
    end;{$R *.dfm}procedure TfrmDemoTree.ConnectDB;
    begin
       //判定数据模块是否已经存在,
      sbDemo.SimpleText := '    正在连接数据库,请稍候...... ';
      if not Assigned(dmDemoTree) then
        dmDemoTree := TdmDemoTree.create(Application);
    //  showmessage(BoolToStr(dmDemoTree.dbDBETree.Connected));
      if dmDemoTree.dbDBETree.connected = false then
      begin
        //连接数据库
        try
          with dmDemoTree.dbDBETree do
          begin
            DatabaseName := name;
            Params.Clear;
            Params.Add('USER NAME=Test');
            Params.Add('PASSWORD=');
            AliasName := 'MyTest';
            LoginPrompt := false;
            Connected := true;           //连接
            mem_strDBName := AliasName;
            toolbtnBuildTree.Enabled := true;
            toolbtnDiscnDB.Enabled := true;
            mmOperate_BuildTree.Enabled := true;
            mmOperate_DiscnDB.Enabled := true;
          end;
        Except
          on Exception do                      //错误处理
          begin
            ShowMessage('连接数据库失败,请检查网络是否通路!');
          end;
        end;
      end;
      sbDemo.SimpleText := '    ';
    end;procedure TfrmDemoTree.DisConnectDb;
    begin
      mem_strDBName := '';                 //清空数据库名及一些环境设置
      toolbtnBuildTree.Enabled := false;
      toolbtnDiscnDB.Enabled := false;
      mmOperate_BuildTree.Enabled := false;
      mmOperate_DiscnDB.Enabled := false;
      dmDemoTree.dbDBETree.Connected := false;
    end;procedure TfrmDemoTree.ExecQry(mSQL: string; mQry: tquery; mIsSelect: Boolean);
    begin
      //执行SQL语句
      mQry.Close;
      mQry.SQL.Clear;
      mQry.SQL.Add(mSQL);
      mQry.DatabaseName := mem_strDBName;
      if mIsSelect then
        mQry.Open
      else
        mQry.ExecSQL;
    end;procedure TfrmDemoTree.FormShow(Sender: TObject);
    //初始化环境设置
    begin
      toolbtnBuildTree.Enabled := False;
      mmOperate_BuildTree.Enabled := False;
      toolbtnDiscnDB.Enabled := false;
      mmOperate_DiscnDB.Enabled := false;
    end;procedure TfrmDemoTree.toolbtnCnDBClick(Sender: TObject);
    begin
      ConnectDB;
    end;
      

  5.   

    procedure TfrmDemoTree.toolbtnDiscnDBClick(Sender: TObject);
    begin
      DisConnectDb;
      //清空树、ListViwe
      if tvDemoTree.Items.Count <> 0 then
        tvDemoTree.Items.Clear;
      if lvDemoTree.Items.Count <> 0 then
        lvDemoTree.Items.Clear;
    end;procedure TfrmDemoTree.mmOperate_DiscnDBClick(Sender: TObject);
    begin
      DisConnectDb;
      //清空树、ListViwe
      if tvDemoTree.Items.Count <> 0 then
        tvDemoTree.Items.Clear;
      if lvDemoTree.Items.Count <> 0 then
        lvDemoTree.Items.Clear;
    end;procedure TfrmDemoTree.mmOperate_CnDBClick(Sender: TObject);
    begin
      ConnectDB;
    end;procedure TfrmDemoTree.BuildTree(mP_TreeNode: TTreeNode; mPid: integer);
    //用递归一次性生成所有树节点
    var
      idTemp:integer;
      strSQL:string;
      qryTemp:TQuery;
      TrNodeTemp:TTreeNode;
    begin
      TrNodeTemp := mP_TreeNode;
      qryTemp := TQuery.Create(self);
      try
        strSQL := ' select id,name '
                + ' from Tcity '
                + ' where Parentid='+inttostr(mpid);
        ExecQry(strSQL,qryTemp,true);
        while not qryTemp.Eof do
        begin
          idTemp := qryTemp.fieldbyname('id').AsInteger;
          tvDemoTree.Selected := tvDemoTree.Items.AddChild(TrNodeTemp,qryTemp.fieldbyname('name').AsString);
          BuildTree(tvDemoTree.Selected,idTemp);
          qryTemp.Next;
        end;
      finally
        qryTemp.Free;         //释放资源
      end;
    end;procedure TfrmDemoTree.InitListView;
    //初始化ListView
    var
      name,strSQL:string;
      lvItem:TListItem;
      Tempqry:TQuery;
    begin
      Tempqry := TQuery.Create(self);
      try
        lvDemoTree.Items.Clear;       //清空
        name := tvDemoTree.Selected.Text;
        strSQL := ' select id '
                + ' from Tcity '
                + ' where name='''+name+'''';
        ExecQry(strSQL,dmDemoTree.qryLV,true);
        if not dmDemoTree.qryLV.Eof then
        begin
          strSQL := ' select * '
                  + ' from Tcity where parentid='
                  + inttostr(dmDemoTree.qryLV.fieldbyname('id').asinteger);
          ExecQry(strSQL,dmDemoTree.qryLV,true);
          while not dmDemoTree.qryLV.Eof do
          begin
            lvItem := lvDemoTree.Items.Add;
            lvItem.Caption := inttostr(dmDemoTree.qryLV.fieldbyname('id').AsInteger);
            lvItem.SubItems.Add(dmDemoTree.qryLV.fieldbyname('name').AsString);
            strSQL := ' select name '
                    + ' from Tcity '
                    + ' where id='
                    + inttostr(dmDemoTree.qryLV.fieldbyname('parentid').AsInteger);
            ExecQry(strSQL,Tempqry,true);
            lvItem.SubItems.Add(Tempqry.fieldbyname('name').AsString);
            dmDemoTree.qryLV.Next;
          end;
        end;
      finally
        Tempqry.Free;
      end;
    end;procedure TfrmDemoTree.InitTree;
    begin
      tvDemoTree.Items.BeginUpdate;
      tvDemoTree.Items.Clear;
      BuildTree(nil,0);
      tvDemoTree.Items.EndUpdate;
    end;procedure TfrmDemoTree.mmFile_ExitClick(Sender: TObject);
    begin
      close;
    end;procedure TfrmDemoTree.toolbtnExitClick(Sender: TObject);
    begin
      close;
    end;procedure TfrmDemoTree.tvDemoTreeClick(Sender: TObject);
    begin
      if tvDemoTree.Items.Count <> 0 then   //对数为空进行特殊处理
      begin
        lvDemoTree.Items.BeginUpdate;
        InitListView;
        lvDemoTree.Items.EndUpdate;
      end;
    end;procedure TfrmDemoTree.toolbtnBuildTreeClick(Sender: TObject);
    begin
      InitTree;
    end;procedure TfrmDemoTree.mmOperate_BuildTreeClick(Sender: TObject);
    begin
      InitTree;
    end;procedure TfrmDemoTree.tvDemoTreeMouseMove(Sender: TObject;
      Shift: TShiftState; X, Y: Integer);
    begin
      sbDemo.SimpleText := '    This is a TreeView!';
    end;procedure TfrmDemoTree.lvDemoTreeMouseMove(Sender: TObject;
      Shift: TShiftState; X, Y: Integer);
    begin
      sbDemo.SimpleText := '    This is a ListView!';
    end;procedure TfrmDemoTree.toolbtnExitMouseMove(Sender: TObject;
      Shift: TShiftState; X, Y: Integer);
    begin
      sbDemo.SimpleText := '    关闭按钮,退出请点击!';
    end;procedure TfrmDemoTree.toolbtnCnDBMouseMove(Sender: TObject;
      Shift: TShiftState; X, Y: Integer);
    begin
      sbDemo.SimpleText := '    连接数据库按钮,需要连接数据库请点击!';
    end;procedure TfrmDemoTree.toolbtnDiscnDBMouseMove(Sender: TObject;
      Shift: TShiftState; X, Y: Integer);
    begin
      sbDemo.SimpleText := '    断开数据连接按钮,需要断开数据库请点击!';
    end;procedure TfrmDemoTree.toolbtnBuildTreeMouseMove(Sender: TObject;
      Shift: TShiftState; X, Y: Integer);
    begin
      sbDemo.SimpleText := '    树生成按钮,需要生成树节点请点击!';
    end;procedure TfrmDemoTree.toolbDemoTreeMouseMove(Sender: TObject;
      Shift: TShiftState; X, Y: Integer);
    begin
      sbDemo.SimpleText := '';
    end;procedure TfrmDemoTree.sbDemoMouseMove(Sender: TObject; Shift: TShiftState;
      X, Y: Integer);
    begin
      sbDemo.SimpleText := '';
    end;end.