树形问题(简单问题)

ou630j 2009-01-17 11:01:45
比如我有个表table1

id name node
1 A null
2 B null
3 V B
4 G B
5 A1 A
6 A2 A
7 a3 A
8 K NULL
现在我想把他显示在TREEVIEW上面
点写代码啊?各位告诉

显示成
A
A1
A2
A3
B
V
G
K
...全文
100 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ou630j 2009-01-17
  • 打赏
  • 举报
回复
procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode;
var AllowExpansion: Boolean);
begin
q.close;
q.sql.text := 'select * from table1 where code='+QuotedStr(NOde.Text);
q.open;
while not q.eof do
begin
//名称添加到Node的自节点(应该会吧)
q.Next;
end;
end;

加上这段没有用的,都不增加的
bdmh 2009-01-17
  • 打赏
  • 举报
回复
定义 q 为数据集

q.clear;
q.sql.text := 'select * from table1 where code is null'
q.open;
while not q.eof do
begin
//名称添加到treeview(应该会吧)
q.Next;
end;

这样就选出了第一级节点
然后在treeview的expanding事件中

procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode;
var AllowExpansion: Boolean);
begin
q.close;
q.sql.text := 'select * from table1 where code='+QuotedStr(NOde.Text);
q.open;
while not q.eof do
begin
//名称添加到Node的自节点(应该会吧)
q.Next;
end;
end;
fjtxwd 2009-01-17
  • 打赏
  • 举报
回复
这样应该行了,有点问题自己改改
procedure TForm1.FindLeechDom(Leechdomname: String;node: TTreeNode);
var
temp: TQuery;
node1: TTreeNode;
begin
Try
temp := TQuery.Create(Self);
temp.DatabaseName := ExtractFilePath(Application.ExeName);
With temp do
begin
Close;
SQL.Clear;
SQL.Add('select * from table1 where node = :Value');
ParamByName('value').AsString := id;
Open;
end;
while Not Temp.Eof do
begin
node1 := TreeView1.Items.AddChild(node,temp.FieldByName('name').AsString);
FindLeechDom(temp.FieldByName('name').AsString,node1);
temp.Next;
end;
Finally
temp.Free;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
temp: TTreeNode;
begin
With Query1 do
begin
Close;
SQL.Clear;
SQL.Add('select * from table1');
Open;
end;
while not Query1.Eof do
begin
if Query1.FieldByName('node').AsString = '' then
begin
temp := TreeView1.Items.AddChild(TreeView1.Items[0],Query1.FieldByName('name').AsString);
FindLeechDom(Query1.FieldByName('name').AsString,temp);
end;
Query1.Next;
end;
end;
ou630j 2009-01-17
  • 打赏
  • 举报
回复
思想我知道,但我写出来的都错了,所以才问的啊
ou630j 2009-01-17
  • 打赏
  • 举报
回复
思想我知道,但我写出来的都错了,所以才问的啊
bdmh 2009-01-17
  • 打赏
  • 举报
回复
循环吧

先筛选出 node=null的记录,然后添加到treeview,然后循环这几条记录,选出node=节点text的记录,再添加到treeview,依次类推

建议
第一次只筛选node=null的记录,然后在treeview的expanding事件中再查找属于他的子记录,类似于windows的资源管理器

再有,数据库的设计建议如下

id pid name code(如果需要)

pid为父级记录的id
kye_jufei 2009-01-17
  • 打赏
  • 举报
回复
fyi

procedure TRES_BOM_VIEW_F.btnSB_SearchClick(Sender: TObject);//點擊按鈕生成樹的過程
begin
inherited;
try
RES_LOADING_F:=TRES_LOADING_F.Create(Self);
RES_LOADING_F.Label1.Caption:='正在檢索相關數據......';
RES_LOADING_F.Show;
RES_LOADING_F.Update;
CREATETREEVIEWMODEL;//過程名
finally
RES_LOADING_F.Close;
end;
end;

procedure TRES_BOM_VIEW_F.CREATETREEVIEWMODEL;
var
iLoop:Integer;
Master,MasterNode:TTreeNode;
begin
adoq_getop.Close;
//SELECT distinct PARN_TYP FROM WWW where parn_typ<>'.' and parn_typ is not null order by PARN_TYP desc
adoq_getop.SQL.Text:='SELECT distinct PARN_TYP FROM WWW where parn_typ<>''.'' and parn_typ is not null order by PARN_TYP desc';
adoq_getop.Open;
adoq_getop.First;
cx_TV.Items.BeginUpdate;
cx_TV.Items.Clear;
Master:=cx_TV.Items.Add(nil,'昆盈BOM表檢視');
while not adoq_getop.Eof do
begin
if adoq_getop.FieldByName('PARN_TYP').AsString<>'' then
begin
Screen.Cursor:=crSQLWait;
MasterNode:=cx_TV.Items.AddChild(Master,VarToStr(adoq_getop.FieldValues['PARN_TYP']));
Application.ProcessMessages;
qry_op.Close;
qry_op.SQL.Text:='SELECT DISTINCT PARN_LITM FROM WWW WHERE PARN_TYP='''+ VarToStr(adoq_getop.FieldValues['PARN_TYP'])+''' GROUP BY PARN_LITM';
qry_op.Open;
for iLoop:=0 to qry_op.RecordCount -1 do
begin
cx_TV.Items.AddChild(MasterNode,VarToStr(qry_op.FieldValues['PARN_LITM']));
qry_op.Next;
end;
Application.ProcessMessages;
cx_TV.Items.EndUpdate;
Screen.Cursor:=crDefault;
end;
adoq_getop.Next;
Application.ProcessMessages;
end;
{
ThreadTView:=cx_TV;
ViewThread:=TExpandLH.Create;
ViewThread.Resume;
}
end;

多層可用遞歸生成:
private
procedure CreateTreeModel;
procedure CreateSubTree(isR:boolean;FNodeName:string;Node:TTreeNode=nil);
{ Private declarations }

procedure TForm1.CreateTreeModel;
var
iLoop:Integer;
aa:TTreeNode;
begin
ADOQuery1.Close;
ADOQuery1.SQL.Text:='SELECT PARN_TYP FROM bom GROUP BY PARN_TYP';
ADOQuery1.Open;
ADOQuery1.First;
TreeView1.Items.BeginUpdate;
TreeView1.Items.Clear;
aa:=TreeView1.Items.Add(nil,'BOM');
Screen.Cursor:=crSQLWait;
Application.ProcessMessages;
for iLoop:=0 to ADOQuery1.RecordCount -1 do
begin
TreeView1.Items.AddChild(aa,VarToStr(ADOQuery1.FieldValues['PARN_TYP']));
ADOQuery1.Next;
end;
Application.ProcessMessages;
TreeView1.Items.EndUpdate;
TreeView1.Items[0].Expand(False);
Screen.Cursor:=crDefault;
end;

procedure TForm1.CreateSubTree(isR:boolean;FNodeName:string;Node:TTreeNode=nil);
var
mLocalName:string;
TreeNode:TTreeNode;
Ads_Tmp,adoq_op:TADODataSet;
begin
if isR then
begin
Ads_Tmp:=TADODataSet.Create(Self);
Ads_Tmp.Connection:=ADOConnection1;
with Ads_Tmp do
try
Close;
//CommandText:='Select distinct PARN_LITM from bom Where PARN_TYP ='+'''' + FNodeName+'''';
CommandText:='Select distinct PARN_LITM from bom Where PARN_TYP ='+'''' + FNodeName+''' and PARN_LITM like ''3%''';
Open;
First;
TreeView1.Items.BeginUpdate;
Screen.Cursor:=crSQLWait;
Application.ProcessMessages;
while not Eof do
begin
mLocalName:=Trim(FieldbyName('PARN_LITM').Asstring);
TreeNode:=TreeView1.Items.AddChild(Node,Trim(FieldByName('PARN_LITM').AsString));
CreateSubTree(False,mLocalName,TreeNode);
Next;
end;
Application.ProcessMessages;
TreeView1.Items.EndUpdate;
Screen.Cursor:=crDefault;
finally
Ads_Tmp.Free;
end;
end
else
begin
adoq_op:=TADODataSet.Create(Self);
adoq_op.Connection:=ADOConnection1;
with adoq_op do
try
Close;
CommandText:='Select CHLD_LITM from bom Where PARN_TYP='+''''+sTmp+''''+' and PARN_LITM ='+'''' + FNodeName+''''+' group by CHLD_LITM';
Open;
First;
TreeView1.Items.BeginUpdate;
Screen.Cursor:=crSQLWait;
Application.ProcessMessages;
while not Eof do
begin
mLocalName:=Trim(FieldbyName('CHLD_LITM').Asstring);
TreeNode:=TreeView1.Items.AddChild(Node, Trim(FieldByName('CHLD_LITM').AsString));
CreateSubTree(False,mLocalName,TreeNode);
Next;
end;
Application.ProcessMessages;
TreeView1.Items.EndUpdate;
Screen.Cursor:=crDefault;
finally
adoq_op.Free;
end;
end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
sTmp:=TreeView1.Selected.Text;
CreateSubTree(True,TreeView1.Selected.Text,TreeView1.Selected);
end;

VIP_Rainbow 2009-01-17
  • 打赏
  • 举报
回复
随便写的,你试试行不行
procedure InitTree(Tree:TTreeView);
var
Root:TTreeNode;
RootQy:Tadoquery;
procedure CreateChild(node:TTreeNode;nodeName:string);
var
tempNode:TTreeNode;
tempQy:Tadoquery;
begin
tempQy:=Tadoquery.create(application);
tempQy.Connection:=ADOConnection1;
tempQy.SQL.Text:='select * from 表 where Node<>null and node='''+nodeName+'''';
tempQy.Open;
while not tempQy.Eof do
begin
tempNode:=Tree.Items.AddChild(node,tempQy.FieldValues['Name']);
CreateChild(tempNode,tempQy.FieldValues['Name']);
end;
end;
begin
RootQy:=Tadoquery.create(application);
RootQy.Connection:=ADOConnection1;
RootQy.SQL.Text:='select * from 表 where Node=null';
Rootqy.Open;
while not Rootqy.Eof do
begin
Root:=Tree.Items.AddFirst(nil,Rootqy.FieldValues['name']);
CreateChild(Root,Rootqy.FieldValues['name']);
Rootqy.Next;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
InitTree(TreeView1);
end;

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧