用递归实现树 算法 我的数据库表test 字段 id ,parentid ,text 怎么才能将 数据库中的数据显示在树上。利用递归算法。 分不够可以额外开贴 谢谢 了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 转贴下,供参考:procedure AddSectionIntoView(SectionView: TTreeView1; ImageIndex: integer; ParentNode: TTreeNode; OwnerForm: TForm; ParentID:string);var TempQuery: TADOQuery; CurrNode: TTreeNode;begin TempQuery := TADOQuery.Create(OwnerForm); try TempQuery.Connection := FormMain.ADOConnection1; TempQuery.Close; TempQuery.SQL.Text := 'select * from SectionInfo where ParentID=:ParentID'; TempQuery.Parameters[0].Value := ParentID; TempQuery.Open; if TempQuery.RecordCount > 0 then begin TempQuery.First; while not TempQuery.Eof do begin CurrNode := SectionView.Items.AddChild(ParentNode,TempQuery.FieldValues['SectionName']); CurrNode.ImageIndex := ImageIndex; CurrNode.SelectedIndex := ImageIndex; AddSectionIntoView(SectionView,ImageIndex,CurrNode,OwnerForm,TempQuery.FieldValues['SectionID']); TempQuery.Next; end; end; finally TempQuery.Free; end;end; 递规过程:procedure Form1.AddClass(AId: integer;FatherNode:TTreeNode);var QryTmp:TADOQuery; myNode:TTreeNode; myLabel:TLabel;begin QryTmp:=TADOQuery.Create(self); QryTmp.Connection:=DM.ADOConn; QryTmp.SQL.Add('select * from Test'); QryTmp.SQL.Add('where parentid='+inttostr(AId)); QryTmp.Open; while not QryTmp.Eof do begin myNode:=Treeview1.Items.AddChild(FatherNode,Trim(QryTmp.fieldbyname('text').AsString)); //创建标签,caption存放各分支的AutoId表识 myLabel:=TLabel.Create(self); myLabel.Visible:=false; myLabel.Caption:=QryTmp.fieldbyname('id').AsString; myNode.Data:=myLabel; AddClass(QryTmp.fieldbyname('id').AsInteger,myNode); //递归调用过程 QryTmp.Next; end; QryTmp.Free;end;调用:设根结点的parentid=0procedure TForm1.FormShow(Sender: TObject);begin Treeview1.Items.Clear; AddClass(0,nil); TreeView1.FullExpand;end; 怎样根据数据库的内容动态部门树 *****主要解答者: 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 --------------------------------------------------------------- (*// 标题:数据集处理成可视树 说明:处理父节点标识字段、节点文本字段、节点标识字段这种表结构 设计: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; >>建议不要一次遍历因为这样往往速度较慢我不觉得有哪家单位会有上万个部门 断网,散分!(6) 如何在AdoQuery中查找某字段值的相同行 用delphi编写一个控制鼠标点击功能的小程序 我想把Outlook中的通讯薄中取出所有联系人的信息,点搞?(非常急,马上给分,请高中低手帮帮忙) 读文件的问题 StringGrid的问题 为什么 用TQuickRep来做自定义的打印多页情况 dbgrid中能否实现象在excel中拖动单元格左下角时复制单元格里的内容. 如何在程序里面调用Win98的拨号服务器? 在主窗体创建和显示后,再创建并显示多个其他的窗体,想让这些窗体在任务栏都有一个图标,怎么做? BDE不是同步的吗
ParentNode: TTreeNode; OwnerForm: TForm; ParentID:string);
var
TempQuery: TADOQuery;
CurrNode: TTreeNode;
begin
TempQuery := TADOQuery.Create(OwnerForm);
try
TempQuery.Connection := FormMain.ADOConnection1;
TempQuery.Close;
TempQuery.SQL.Text := 'select * from SectionInfo where ParentID=:ParentID';
TempQuery.Parameters[0].Value := ParentID;
TempQuery.Open;
if TempQuery.RecordCount > 0 then
begin
TempQuery.First;
while not TempQuery.Eof do
begin
CurrNode := SectionView.Items.AddChild(ParentNode,TempQuery.FieldValues['SectionName']);
CurrNode.ImageIndex := ImageIndex;
CurrNode.SelectedIndex := ImageIndex;
AddSectionIntoView(SectionView,ImageIndex,CurrNode,OwnerForm,TempQuery.FieldValues['SectionID']);
TempQuery.Next;
end;
end;
finally
TempQuery.Free;
end;
end;
procedure Form1.AddClass(AId: integer;FatherNode:TTreeNode);
var
QryTmp:TADOQuery;
myNode:TTreeNode;
myLabel:TLabel;
begin
QryTmp:=TADOQuery.Create(self);
QryTmp.Connection:=DM.ADOConn;
QryTmp.SQL.Add('select * from Test');
QryTmp.SQL.Add('where parentid='+inttostr(AId));
QryTmp.Open;
while not QryTmp.Eof do
begin
myNode:=Treeview1.Items.AddChild(FatherNode,Trim(QryTmp.fieldbyname('text').AsString));
//创建标签,caption存放各分支的AutoId表识
myLabel:=TLabel.Create(self);
myLabel.Visible:=false;
myLabel.Caption:=QryTmp.fieldbyname('id').AsString;
myNode.Data:=myLabel;
AddClass(QryTmp.fieldbyname('id').AsInteger,myNode); //递归调用过程
QryTmp.Next;
end;
QryTmp.Free;
end;调用:设根结点的parentid=0
procedure TForm1.FormShow(Sender: TObject);
begin
Treeview1.Items.Clear;
AddClass(0,nil);
TreeView1.FullExpand;
end;
主要解答者: 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
---------------------------------------------------------------
(*//
标题:数据集处理成可视树
说明:处理父节点标识字段、节点文本字段、节点标识字段这种表结构
设计: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;