如何用RzTreeView显示部门结构

    我们知道,一个企业、单位分很多部门,部门下面还会分子部门,如果用树形表就能 清晰的显示出部门结构来,一目了然。下面我来介绍下如何使用RzTreeview显示部门结构。

一、主要表结构

DepID nvarchar(50) //内部唯一ID,通常是GUID

DepCode nvarchar(20) //部门编码

DepName nvarchar(30) //部门名称

二、代码

procedure TForm1.ADOQueryTypeAfterOpen(DataSet: TDataSet);
var
  vNode:TTreeNode;
  vTitle:string;
  i,j,iFinish:Integer;
begin
//  inherited;
  with ADOQueryType do
  begin
    Sql.Clear;
    Sql.Add('select a.*,ParentCode=b.depcode from tbdepartment a');
    Sql.Add('left join tbdepartment b on a.parent=b.depid');
    Sql.Add('order by b.depcode,a.depcode'); //这是查询语句,查出每个部门和他的上级部门
    Open;  //最高部门的上级部门是空
    RzTreeView1.Items.Clear;  //清空部门列表

    vFirstNode := RzTreeView1.Items.GetFirstNode;
    vFirstNode :=RzTreeView1.Items.AddFirst(vFirstNode,'全部'); //增加一个最高节点
    iFinish:=0; //已添加部门数清零

    while iFinish<>RecordCount do  //已添加部门数不等于记录数说明还有部门未添加
    begin
      First;
      while not Eof do  //循环添加部门
      begin
        vTitle:=Format('%s,%s',[FieldByName('DepCode').AsString,FieldByName('DepName').AsString]);
        if FieldByName('State').AsString='1' then 
                //找一个字段做已添加标记,为1说明已添加,跳过
        begin
          Next;
          Continue;
        end;
        if Trim(FieldByName('ParentCode').AsString)='' then //上级部门为空说明是最高部门
        begin
          RzTreeView1.Items.AddChild(vFirstNode,vTitle); //在刚才的最高节点下添加子节点
          Edit;
          FieldByName('State').AsString:='1'; //当前记录做已添加标志
          inc(iFinish);  //已完成数加1
          First; //再从头开始判断,防止最高部门不在第1条记录时,前面的部门被跳过
        end else
        begin //如果有上级部门就要找到这个上级部门,将当前部门加入他的子部门里
          for i:=0 to RzTreeView1.Items.Count -1 do //循环查找已添加的部门
          begin
            vTitle:= Trim(Copy(RzTreeView1.Items[i].Text,1,Pos(',',RzTreeView1.Items[i].Text)-1));
            //获取部门代码
            if vTitle = FieldByName('ParentCode').AsString then //找到上级部门
            begin
              vTitle:=Format('%s,%s',[FieldByName(sCode).AsString,FieldByName(sName).AsString]);
              //设定部门的显示格式为:代码,名称
              vNode:=RzTreeView1.Items[i];
              RzTreeView1.Items.AddChild(vNode,vTitle); //添加到子节点中
              Edit;
              FieldByName('State').AsString:='1';//当前记录做已添加标志
              inc(iFinish);//已完成数加1
              First;//再从头开始判断,防止前面的部门被跳过
              Break;
            end;
          end;
        end;
        Next;
      end;
    end;

  end;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  with ADOQueryType do
  begin
    close;
    open;
  end;
end;

  数据样式

效果图

在Win10,展开符号就变成了下箭头,在其他操作系统上就显示 + 号,这个是操作系统的问题 

这里面有2点要注意

1、每次 写入节点后数据集要从头开始循环,就是First;这句。 因为我们的数据集里部门不一定会按照的高低排列,在添加一个部门后,有可能跳过了前面的部门,导致列表缺失了部分部门。

2、这里部门的显示格式是“代码,名称”,vTitle:=Format('%s,%s',[FieldByName('DepCode').AsString,FieldByName('DepName').AsString]);

在循环查找上级部门时就要判断每个节点名称里逗号前面的代码,

vTitle:= Trim(Copy(RzTreeView1.Items[i].Text,1,Pos(',',RzTreeView1.Items[i].Text)-1));   //获取部门代码

这是相对应的,如果要显示另外不同的格式,那查找上级部门时的判断方法也要相应改变。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值