如何用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)); //获取部门代码
这是相对应的,如果要显示另外不同的格式,那查找上级部门时的判断方法也要相应改变。
标签:end,RzTreeView1,Items,部门,RzTreeView,AsString,FieldByName,结构 来源: https://blog.csdn.net/victor_yang/article/details/106633873