ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

如何用RzTreeView显示部门结构

2020-06-10 13:04:51  阅读:325  来源: 互联网

标签:end RzTreeView1 Items 部门 RzTreeView AsString FieldByName 结构


    我们知道,一个企业、单位分很多部门,部门下面还会分子部门,如果用树形表就能 清晰的显示出部门结构来,一目了然。下面我来介绍下如何使用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));   //获取部门代码

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

标签:end,RzTreeView1,Items,部门,RzTreeView,AsString,FieldByName,结构
来源: https://blog.csdn.net/victor_yang/article/details/106633873

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有