小弟现在做一人事程序,因为部门中要求可以设置多层级别,现在想用treeview来显示。可不知道具体数据库字段该如何设置,treeview该如何显示呢?恳请各位大虾帮帮忙了!小弟没弄过,一点思路也没有!

解决方案 »

  1.   

    建一个表保存部门结构关系,他们应该是树形结构, 然后用第归方法搜索出来,显示在treeview中
    帮你顶啦。
      

  2.   

    数据库表构建成 PUID, UID相关联(爷子关系)的表DEPARTMENT 表字段可如下。
      GUID, 主关键字。
      UID, 部门ID
      PUID, 上一层部门ID,
      NAME, 部门名称。
      DESCRIPTION, 部门描述。
      .....建好表后,在程序中加载时。用每三方控件比,比如TDBTreeView,直接挂上Datasource,指定相应属性就OK了。一种方法就是你用TTreeView,有一些麻烦,便是程序员对代码本身和业务表现的可操作性更强。
      实现上,肯定是你的每一个TreeNode节点对应着一条部门记录,如果没有层次,这时候数据是离散的,创建下面的结构并为每一个节点创建一个实例来记录它的对应关系。  Relation = record
        UID: Integer;
        PUID: Integer;
        NAME: String[50];
      end;var
      Relation: PRelation;
    begin
      New(Relation);
      TreeView1.Items.AddChildObject(ParentNode, Relation^.NAME, Relation);
      //这样就添加了一个节点,他与上一节点的关系也记录在Relation结构对象中,访问时也很方便。
      //访问时想要得到信息,直接访问TTreeNode.Data属性就得到相应的结构对象。
      注意:1.记得在TreeView事件OnDeletion中删除资源。
          Dispose(Node.Data);
          2.是每个TreeNode节点对象关联着一个结构对象指针(PRelation;),不是所有的节点关联一个。
      

  3.   

    如果数据中库中不同的表,可以用View或特殊SQL来构造树形数据集。
      如ORACLE的start with语句,很方便构建树形数据集。
      用View来union也是一个不错的选择。  构造好树形数据集后最好用第三方控件或自己写个控件来显示,让节点跟记录(DataSet)绑定在一起,这样操作很方便。
      

  4.   

    请问 TDBTreeView  哪有下载啊?
      

  5.   

    同意 HeLZ(尘心累矣)的建表方式 
    但不須要用到三方控件,直接用TREEVIEW就很簡單
    前段時間剛問過這個問題,已經解決了,代碼如下
    ----------------數據表------------------
    id     upid    name
    1       0       一級目錄1
    3       1       二級目錄1
    2       3       三級目錄1
    5       0       一級目錄2
    4       5       二級目錄2
    1       0       一級目錄3
    ----------------程序如下------------------
    //定義目錄樹指針
    type
      pmyid = ^Tpmyid;
      Tpmyid = record
        nodeid: string;
        nodename: string;
      end;
    ...........
    //遞歸載入子目錄
    procedure TfrmMain.ReadNode(ownNode: TTreeNode; NodeId: string);
    //OwnNode:Pater node  NodeId:self nodeid;
    var
      curNode: TtreeNode;
      curID, curName: string;
      adoquery: TAdoQuery;
      myid: pmyid;
    begin
      adoquery := Tadoquery.create(parent);
      adoquery.Connection := AdoCon;
      adoquery.sql.text := 'select * from tree1 where up_id=''' + NodeID + '''';
      with adoquery do
      begin
        open;
        first;
        while not eof do
        begin
          curID := FieldByName('id').AsString;
          curName := fieldByName('Crop_name').AsString;
          new(myid);
          myid^.nodeid := curID;
          myid^.nodename := curName;
          curNode := treeview1.Items.AddChildObject(ownNode, curName, myid);
          ReadNode(curNode, curid);
          next;
        end;
        close;
        free;
      end;
    end;
    //載入根目錄
    procedure TfrmMain.LoadData;
    var
      CurNode:TTreeNode;
      MyID:pMyID;
    begin
      new(MyID);
      MyID^.nodeid:='0';
      CurNode:=Treeview1.Items.AddChildObject(nil,'公司',MyID);  //載入要目錄
      ReadNode(CurNode,'0');
    end;
    -----------------------------------------
      

  6.   

    其实很简单的,在部门表中应设置部门层次字段和上级部门ID字段,部门层次字段决定TreeView的Level,上级部门ID决定其父结点。