在窗体上有一个TreeView控件,其子项标题由一数据表中“部门名称”填充,
TreeView中子项的不确定,不知道有多少层。
数据表有“部门名称”,“父部门名称”,“子项标识”三个字段
例如:
------------------------------------
| 部门名称 | 父部门名称 | 子项标识 |
------------------------------------
| A | 所有部门 | T |
------------------------------------
| A1 | A | T |
------------------------------------
| B2 | B | F |
------------------------------------
| A11 | A1 | F |
------------------------------------
| B | 所有部门 | T |
------------------------------------
“子项标识”表示这个部门还有没有子部门。
具体情况和上表是一样的,所有部门是最顶层,部门A和部门B是它的子项,
而部门A1是部门A的子层,A11是A1的子项,B2是部门B的子项。
请高手们帮个忙,如何写代码,把表中的部门按顺序填入到TreeView控件中。
下面代码只能填充第一层部门。
procedure TRenSiMainFrm.FormActivate(Sender: TObject);
var
i: integer;
sqlStr, bmnameStr: string;
begin
TreeView1.Items.Clear;
TreeView1.Items.Add(nil, '所有部门');
//-->选择第一层部门的记录 sqlStr:= 'select * from BuMenItem where 所属部门=';
sqlStr:= sqlStr + ''''+ TreeView1.Items[0].Text+'''';
DataModule1.TreeViewADOQuery.SQL.Clear;
DataModule1.TreeViewADOQuery.SQL.Add(sqlStr);
DataModule1.TreeViewADOQuery.Open;
DataModule1.TreeViewADOQuery.Active:= True;
//-->增加第一层部门
if DataModule1.TreeViewADOQuery.RecordCount >0 then
begin
for i:= 1 to DataModule1.TreeViewADOQuery.RecordCount do
begin
bmnameStr:= DataModule1.TreeViewADOQuery.FieldByName('部门名称').AsString;
TreeView1.Items.AddChild(TreeView1.Items[0], bmnameStr);
DataModule1.TreeViewADOQuery.Next;
end;
end;
end;
TreeView中子项的不确定,不知道有多少层。
数据表有“部门名称”,“父部门名称”,“子项标识”三个字段
例如:
------------------------------------
| 部门名称 | 父部门名称 | 子项标识 |
------------------------------------
| A | 所有部门 | T |
------------------------------------
| A1 | A | T |
------------------------------------
| B2 | B | F |
------------------------------------
| A11 | A1 | F |
------------------------------------
| B | 所有部门 | T |
------------------------------------
“子项标识”表示这个部门还有没有子部门。
具体情况和上表是一样的,所有部门是最顶层,部门A和部门B是它的子项,
而部门A1是部门A的子层,A11是A1的子项,B2是部门B的子项。
请高手们帮个忙,如何写代码,把表中的部门按顺序填入到TreeView控件中。
下面代码只能填充第一层部门。
procedure TRenSiMainFrm.FormActivate(Sender: TObject);
var
i: integer;
sqlStr, bmnameStr: string;
begin
TreeView1.Items.Clear;
TreeView1.Items.Add(nil, '所有部门');
//-->选择第一层部门的记录 sqlStr:= 'select * from BuMenItem where 所属部门=';
sqlStr:= sqlStr + ''''+ TreeView1.Items[0].Text+'''';
DataModule1.TreeViewADOQuery.SQL.Clear;
DataModule1.TreeViewADOQuery.SQL.Add(sqlStr);
DataModule1.TreeViewADOQuery.Open;
DataModule1.TreeViewADOQuery.Active:= True;
//-->增加第一层部门
if DataModule1.TreeViewADOQuery.RecordCount >0 then
begin
for i:= 1 to DataModule1.TreeViewADOQuery.RecordCount do
begin
bmnameStr:= DataModule1.TreeViewADOQuery.FieldByName('部门名称').AsString;
TreeView1.Items.AddChild(TreeView1.Items[0], bmnameStr);
DataModule1.TreeViewADOQuery.Next;
end;
end;
end;
然后用COLUMN属性对其进行分列..
Dev Express套件里面的,直接设置好字段就可以了,完全支持你要的功能
procedure Tfrm_OrganizeM.AddChildNode(CurrentNode: TTreeNode) ;
var
ChildNode : TTreeNode;
Q_Temp : TADOQuery;
NodeText ,父部门编号,tvDepCaption: String;
begin
NodeText := CurrentNode.Text;
父部门 := Copy(NodeText,Pos('[',NodeText)+1,Pos(']',NodeText)-Pos('[',NodeText)-1);
Q_Temp :=TADOQuery.Create(nil);
Q_Temp.Connection := DMEnterpriseInfo.Q_DepTemp.Connection;
Q_Temp.SQL.Add('Select 部门编号,部门名称 From Dep Where 父部门编号='+ 父部门编号);
Q_Temp.Open;
if Q_Temp.IsEmpty then
begin
Q_Temp.Free;
Exit;
end;
while not Q_Temp.Eof do
begin
tvDepCaption := Q_Temp.FieldbyName('部门名称 ').AsString +'['+ Q_Temp.FieldbyName('部门编号').AsString+']';
ChildNode := tvOrganize.Items.AddChild(CurrentNode,tvDepCaption);
AddChildNode(ChildNode);
Q_Temp.Next;
end;
Q_Temp.Free;
end;删除子节点也需递归调用
procedure Tfrm_MainForm.actDelDepExecute(Sender: TObject);
var
部门编号 ,NodeText: String;
begin
if Assigned(frm_OrganizeM.tvOrganize.Selected) then
begin
NodeText := frm_OrganizeM.tvOrganize.Selected.Text;
部门编号:= Copy(NodeText,Pos('[',NodeText)+1,Pos(']',NodeText)-Pos('[',NodeText)-1);
if MessageDlg('是否删除部门:'+NodeText +'?', mtInformation, [mbYes, mbNo], 0) = mrYes then
begin
if DMEnterpriseInfo.Q_Dep.Locate('部门编号',部门编号,[]) then
begin
LocateDelDep(部门编号);
DMEnterpriseInfo.Q_Dep.Delete;
end;
end
else Exit;
with frm_OrganizeM do
begin
RefreshOrganizeTree;
if Assigned(tvOrganize.TopItem) then
begin
tvOrganize.TopItem.Expand(True);
end;
end;
end
else
begin
MessageDlg('请选择部门!', mtInformation, [mbOk], 0);
end;
end;
procedure Tfrm_MainForm.LocateDelDep(Dep01 : String);
var
sDep01 : String;
Q_Temp : TADOQuery;
begin
Q_Temp :=TADOQuery.Create(nil);
Q_Temp.Connection := DMEnterpriseInfo.Q_DepTemp.Connection;
Q_Temp.SQL.Add('Select * From Dep Where Dep06 = '+Dep01);
Q_Temp.Open;
if not Q_Temp.IsEmpty then
begin
while not Q_Temp.Eof do
begin
sDep01 := Q_Temp.FieldByName('Dep01').AsString;
Q_Temp.Delete;
LocateDelDep(sDep01);
end;
end
else
begin
Q_Temp.Free;
Exit;
end;
Q_Temp.Free;
end;
Dep01 为部门编号
procedure TCustomerDM.WriteToTreeview(First:boolean;
treename: Ttreeview;Fathernode:Ttreenode);
var childnode:Ttreenode; CusID:string;
CusName:string;
query:TAdoquery;
begin
Query:=Tadoquery.Create(owner);
query.Connection:=ADOConnectionDM.ADOConnection1;
query.LockType:=ltReadOnly;
Cusname:=Adoqry.fieldbyname('Cusname).asstring;
treename.Items.BeginUpdate;
if First then
begin
treename.Items.Clear;
Fathernode:=treename.Items.add(nil,Cusname); //N级的开始
end;
if DisplayNextCus(query,ACusID) then //检索是否有下级
begin
while not query.Eof do
begin
CusName:=query.fieldbyname('名称').asstring;
Childnode:=treename.Items.addchild(Fathernode,Cusname); //N+1级
WriteToTreeview(false,treename,childnode);
query.next;
end;
end;
query.Destroy;
treename.Items.EndUpdate;
end;