数据库结构如下:地区名称Name和父地区名称PName(一个典型的树型结构)
****************************************************************
Name PNameTIANJIN N
TANGGU TIANJIN
SHANGHAI N
SHANDONG N
JINAN SHANGDONG
XINGANG TANGGU
GUANGDONG N
GUANGZHOU GUANGDONG
DONGWAN GUANGDONG
*****************************************************************Form1上有一个TreeView1,我想让窗体Form1建立的时候自动把数据里的内容生成树,并在TreeView1里显示出来.怎么写??????????????????????
还有如果Edit1.Text:='HANGU';
Edit2.Text:='TIANJIN' 怎么样选中TIANJIN选项,并在TIANJIN下面生成HANGU的子项???请把代码写完整谢谢!!!!!!!!!!
****************************************************************
Name PNameTIANJIN N
TANGGU TIANJIN
SHANGHAI N
SHANDONG N
JINAN SHANGDONG
XINGANG TANGGU
GUANGDONG N
GUANGZHOU GUANGDONG
DONGWAN GUANGDONG
*****************************************************************Form1上有一个TreeView1,我想让窗体Form1建立的时候自动把数据里的内容生成树,并在TreeView1里显示出来.怎么写??????????????????????
还有如果Edit1.Text:='HANGU';
Edit2.Text:='TIANJIN' 怎么样选中TIANJIN选项,并在TIANJIN下面生成HANGU的子项???请把代码写完整谢谢!!!!!!!!!!
主要解答者: zswangII 提交人: dulei115
感谢: dulei115
审核者: l_xiaofeng 社区对应贴子: 查看
-----------------------------------
数据库结构:
部门ID 部门名称 上级部门ID
1 总部门 -1
2 部门1 1
3 部门2 1
4 部门3 1
5 分部门1 2
6 分部门2 2
7 分部门3 2
8 子部门1 5
9 子部门1 5
。。
我想用递规的方法生成Treeview,程序如下:
PROCEDURE newtreeview(部门ID,部门名称)
Begin
//Treeview1添加部门名称;
//Treeview1添加附带数据部门ID
ADOQuery1.close;
ADOQuery1.SQL.clear;
ADOQuery1.SQL.Text:=select * from 部门表 where 上级部门ID='+inttostr(部门ID)
ADOQuery1.open;
If ADOQuery1..recordcount>0 then
Begin
//Treeview1准备添加子节点
ADOQuery1.First;
For i:=o to ADOQuery1.recordcount do
Begin
Newtreeview(ADOQuery1.FieldByName(‘ID’),
ADOQuery1.FieldByName(‘部门名称’))
ADOQuery1.next;
End;
End;
//Treeview如果有上层节点,则回到上层节点
End;
要求:当输入(1,总部门)时生成树为
总部门
部门1
分部门1
子部门1
子部门2
分部门2
分部门3
部门2
部门3
当输入(2,部门1)时生成树为
部门1
分部门1
子部门1
子部门2
分部门2
分部门3
(即生成自己部门和下属部门,且各名称附带数据为其ID号)
---------------------------------------------------------------
PROCEDURE TForm1.newtreeview(Node:TTreeNode;ID,Name:String);
var
tmpNode : TTreeNode;
ADOquery1 : TADOQuery;
Begin
tmpNode := TreeView1.Items.AddChild(Node,Name);
ADOQuery1 := TADOQuery.Create(self);
ADOQuery1.Connection := ADOConnection1;
ADOQuery1.close;
ADOQuery1.SQL.clear;
ADOQuery1.SQL.Text := 'select * from 部门表 where 上级部门ID='+ID;
ADOQuery1.open;
If ADOQuery1.recordcount > 0 then
Begin
ADOQuery1.First;
while not ADOQuery1.Eof do
Begin
Newtreeview(tmpNode,ADOQuery1.FieldByName('ID').AsString,
ADOQuery1.FieldByName('部门名称').AsString);
ADOQuery1.next;
End;
End;
End;
---------------------------------------------------------------
(*//
标题:数据集处理成可视树
说明:处理父节点标识字段、节点文本字段、节点标识字段这种表结构
设计:Zswang
日期:2002-05-20
支持:[email protected]
//*)
///////Begin Source
function DataSetToTreeNode(mDataSet: TDataSet;
mFieldNameParent: string; //父节点标识字段名
mFieldNameTreeText: string; //节点文本字段名
mFieldNameTreeId: string; //节点标识字段名
mTreeView: TTreeView; mTreeNode: TTreeNode;
mParentText: string): Boolean;
var
vTreeNode: TTreeNode;
vFieldValues: Variant;
vFieldNames: string;
begin
Result := False;
if not Assigned(mDataSet) then Exit;
if not Assigned(mTreeView) then Exit;
if not mDataSet.Active then Exit;
vFieldNames := Format('%s;%s;%s',
[mFieldNameParent, mFieldNameTreeText, mFieldNameTreeId]);
mDataSet.Filtered := False;
mDataSet.Filter := Format('%s=%s', [mFieldNameParent, QuotedStr(mParentText)]);
mDataSet.Filtered := True;
if mDataSet.RecordCount = 0 then Exit;
mDataSet.First;
while not mDataSet.Eof do begin
vTreeNode := mTreeView.Items.AddChild(mTreeNode,
mDataSet.FieldByName(mFieldNameTreeText).AsString);
vFieldValues := mDataSet[vFieldNames];
DataSetToTreeNode(mDataSet, mFieldNameParent, mFieldNameTreeText,
mFieldNameTreeId, mTreeView, vTreeNode,
mDataSet.FieldByName(mFieldNameTreeId).AsString);
///////Begin 恢复位置
mDataSet.Filtered := False;
mDataSet.Filter := Format('%s=%s', [mFieldNameParent, QuotedStr(mParentText)]);
mDataSet.Filtered := True;
mDataSet.Locate(vFieldNames, vFieldValues, []);
///////End 恢复位置
mDataSet.Next;
end;
Result := True;
end;
///////End Source
///////Begin Demo
procedure TForm1.Button1Click(Sender: TObject);
begin
TreeView1.Items.Clear;
DataSetToTreeNode(Table1, 'ParentTreeId', 'TreeText', 'TreeId',
TreeView1, nil, 'NULL');
end;
///////End Source
//---------------------------------------------------------------------------
//Borland C++ Builder
//---------------------------------------------------------------------------
///////Begin Source
bool DataSetToTreeNode(TDataSet* mDataSet,
AnsiString mFieldNameParent, //父节点标识字段名
AnsiString mFieldNameTreeText, //节点文本字段名
AnsiString mFieldNameTreeId, //节点标识字段名
TTreeView* mTreeView, TTreeNode* mTreeNode,
AnsiString mParentText)
{
TTreeNode* vTreeNode;
Variant vFieldValues;
AnsiString vFieldNames;
if (mDataSet == NULL) return false;
if (mTreeView == NULL) return false;
if (!mDataSet->Active) return false;
vFieldNames = Format("%s;%s;%s",
ARRAYOFCONST((mFieldNameParent, mFieldNameTreeText, mFieldNameTreeId)));
mDataSet->Filtered = false;
mDataSet->Filter = Format("%s=%s", ARRAYOFCONST((mFieldNameParent, QuotedStr(mParentText))));
mDataSet->Filtered = true;
if (mDataSet->IsEmpty()) return false;
mDataSet->First();
while (!mDataSet->Eof) {
vTreeNode = mTreeView->Items->AddChild(mTreeNode,
mDataSet->FieldByName(mFieldNameTreeText)->AsString);
vFieldValues = mDataSet->FieldValues[vFieldNames];
DataSetToTreeNode(mDataSet, mFieldNameParent, mFieldNameTreeText,
mFieldNameTreeId, mTreeView, vTreeNode,
mDataSet->FieldByName(mFieldNameTreeId)->AsString);
///////Begin 恢复位置
mDataSet->Filtered = false;
mDataSet->Filter = Format("%s=%s", ARRAYOFCONST((mFieldNameParent, QuotedStr(mParentText))));
mDataSet->Filtered = true;
mDataSet->Locate(vFieldNames, vFieldValues, TLocateOptions());
///////End 恢复位置
mDataSet->Next();
};
return true;
} /* DataSetToTreeNode */
///////End Source
///////Begin Demo
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TreeView1->Items->Clear();
DataSetToTreeNode(Table1, "UpperTreeId", "TreeName", "TreeId",
TreeView1, NULL, "NULL");
}
///////End Demo
//当前如下调用~~
begin
TreeView1.Items.Clear;
DataSetToTreeNode(ADOTable1, '上级部门ID', '部门名称', '部门ID',
TreeView1, nil, '-1');
ADOTable1.Filter := '';
end;
mFieldNameParent: string; //父节点标识字段名
mFieldNameTreeText: string; //节点文本字段名
mFieldNameTreeId: string; //节点标识字段名
mTreeView: TTreeView; mTreeNode: TTreeNode;
mParentText: string): Boolean;
var
vTreeNode: TTreeNode;
vFieldValues: Variant;
vFieldNames: string;
begin
Result := False;
if not Assigned(mDataSet) then Exit;
if not Assigned(mTreeView) then Exit;
if not mDataSet.Active then Exit;
vFieldNames := Format('%s;%s;%s',
[mFieldNameParent, mFieldNameTreeText, mFieldNameTreeId]);
mDataSet.Filtered := False;
mDataSet.Filter := Format('%s=%s', [mFieldNameParent, QuotedStr(mParentText)]);
mDataSet.Filtered := True;
if mDataSet.RecordCount = 0 then Exit;
mDataSet.First;
while not mDataSet.Eof do begin
vTreeNode := mTreeView.Items.AddChild(mTreeNode,
mDataSet.FieldByName(mFieldNameTreeText).AsString);
vFieldValues := mDataSet[vFieldNames];
DataSetToTreeNode(mDataSet, mFieldNameParent, mFieldNameTreeText,
mFieldNameTreeId, mTreeView, vTreeNode,
mDataSet.FieldByName(mFieldNameTreeId).AsString);
///////Begin 恢复位置
mDataSet.Filtered := False;
mDataSet.Filter := Format('%s=%s', [mFieldNameParent, QuotedStr(mParentText)]);
mDataSet.Filtered := True;
mDataSet.Locate(vFieldNames, vFieldValues, []);
///////End 恢复位置
mDataSet.Next;
end;
Result := True;
end;
///////End Source
///////Begin Demo
procedure TForm1.Button1Click(Sender: TObject);
begin
TreeView1.Items.Clear;
ADOTable1.Active:=false;
ADOTable1.Active:=true;
DataSetToTreeNode(ADOTable1, 'pname', 'name', 'name',
TreeView1, nil, 'N');
end;
///////End Source
Add, AddChild example
The following example demonstrates how to add nodes and child nodes to a TTreeView control.procedure TForm1.Button1Click(Sender: TObject);var
MyTreeNode1, MyTreeNode2: TTreeNode;
begin
with TreeView1.Items do
begin
Clear; { remove any existing nodes }
MyTreeNode1 := Add(nil, 'RootTreeNode1'); { Add a root node }
{ Add a child node to the node just added }
AddChild(MyTreeNode1,'ChildNode1'); {Add another root node}
MyTreeNode2 := Add(MyTreeNode1, 'RootTreeNode2');
{Give MyTreeNode2 to a child }
AddChild(MyTreeNode2,'ChildNode2'); {Change MyTreeNode2 to ChildNode2 }
{ and add a child node to it}
MyTreeNode2 := TreeView1.Items[3];
AddChild(MyTreeNode2,'ChildNode2a'); {Add another child to ChildNode2, after ChildNode2a }
Add(MyTreeNode2,'ChildNode2b'); {add another root node}
Add(MyTreeNode1, 'RootTreeNode3');
end;end;