1、var TempTreeNode : TTreeNode; begin tempTreenode := Treeview.Selected; //ADOTABLE是根据所选节点过滤的结果集 adotable.first; while not adotable.eof do begin treeview.items.addchild(temptreenode,adotable.fieldbyname('...').asstring); adotable.next; end; end;2、建议如下格式: JDID (节点ID),SJJDID(上级节点ID),JDBT(节点标题),JDXSSX(节点显示顺序)
unit Main;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, DB, ADODB;type TFormMain = class(TForm) Access: TADOConnection; Query: TADOQuery; Tree: TTreeView; BtnFillTree: TButton; procedure FormCreate(Sender: TObject); procedure BtnFillTreeClick(Sender: TObject); private { Private declarations } AppPath : String; Function OpenDatabase : Boolean; Procedure CloseDatabase; Procedure AddItem( Node : TTreeNode ); public { Public declarations } end;var FormMain: TFormMain;implementation{$R *.dfm}function TFormMain.OpenDatabase: Boolean; Var ConnectionString : String; begin Result := False; ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + AppPath + 'Database.mdb;Persist Security Info=False'; Access.ConnectionString := ConnectionString; Try Access.Open; Result := True; Except Application.MessageBox( '打开数据库发生错误!', '错误', MB_OK + MB_ICONSTOP ); End; end;procedure TFormMain.FormCreate(Sender: TObject); begin AppPath := ExtractFilePath( ParamStr( 0 ) ); end;procedure TFormMain.CloseDatabase; begin Access.Close; end;procedure TFormMain.BtnFillTreeClick(Sender: TObject); Var Node : TTreeNode; begin Tree.Items.Clear; If Not OpenDatabase Then Exit; Query.Close; Query.SQL.Clear; Query.SQL.Add( 'Select Full_Name From Dept Where Parent_ID = ''000''' ); Try Query.Open; While Not Query.Eof Do Begin Tree.Items.AddChild( Nil, Query.Fields[ 0 ].AsString ); Query.Next; End; Except Exit; End; Node := Tree.Items.GetFirstNode; AddItem( Node ); CloseDataBase; end;procedure TFormMain.AddItem(Node: TTreeNode); Var QueryX : TADOQuery; NodeX : TTreeNode; begin QueryX := TADOQuery.Create( Nil ); QueryX.Connection := Access; Try While Node <> Nil Do Begin QueryX.Close; QueryX.SQL.Clear; QueryX.SQL.Add( 'Select Full_Name From Dept Where Parent_ID =' ); QueryX.SQL.Add( ' ( Select ID From Dept Where Full_Name = ' + QuotedStr( Node.Text ) + ' )' ); Try QueryX.Open; While Not QueryX.Eof Do Begin NodeX := Tree.Items.AddChild( Node, QueryX.Fields[ 0 ].AsString ); AddItem( NodeX ); QueryX.Next; End; Except Exit; End; Node := Node.getNextSibling; End; Finally QueryX.Free; End; end;end. 数据库字段: ID, Parent_ID, Full_Name三个字段(至少)
跟你的差不多,我的表结构是 adcode adname adcode是地区编码,每种级别的地区编码有固定长度 ,共有六级深度 要求产生节点树,并且一次不能全部编历生产,要求点击一个节点后,若有则生成下级节点, 我是逐机取值来生成树的,并判断节点的深度. 这个程序从库里取值生产节点的方法上面的兄弟已经提了,另外重要的是鼠标点击TREEVIEW事件,以此来判断生成问题. 我还没有完全写完,不过基本的东西已经出来了,把一些贴出来,结合上面的,你应该差不多了.procedure TfrmInarea.fcTreeView1MouseDown(TreeView: TfcCustomTreeView; Node: TfcTreeNode; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); //µ¥»÷½ÚµãÓÒ¼ü²Ëµ¥ ¼°×ó»÷²Ù×÷ var p: TPOINT; Axis_X, Axis_Y: Integer; sAnaly1,sAnaly2:String; iLevel:Integer; //µ±Ç°½ÚµãµÄ×Ó½Úµã¿í¶È begin if Button = mbRight then begin CurrentNode := fcTreeview1.GetNodeAt(X, Y); if CurrentNode = nil then exit; if CurrentNode.Selected then begin //È«¾Ö±äÁ¿µÄ¸³Öµ sNodeText:=CurrentNode.Text; //sNodeLevel:=CurrentNode.Level; //Ïȵ÷ÕûÓÒ¼üµ¯³ö²Ëµ¥ÏîµÄ״̬ if CurrentNode.HasChildren=False then begin n1.Enabled:=True; n2.Enabled:=False; end else begin n1.Enabled:=False; n2.Enabled:=True; end; GetCursorPos(p); Axis_X := p.X; Axis_Y := p.Y; PopupMenu1.Popup(Axis_X, Axis_Y); end; end ; if Button = mbLeft then begin CurrentNode := fcTreeview1.GetNodeAt(X, Y); if CurrentNode = nil then exit; if CurrentNode.Selected then begin //È«¾Ö±äÁ¿µÄ¸³Öµ sNodeText:=CurrentNode.Text; iLevel:=frmInarea.AnalyLevel(CurrentNode)+2; // sNodeLevel:=CurrentNode.Level; if Datamodule1.RArea.Active then Datamodule1.RArea.Close; Datamodule1.RArea.SQL.Clear; Datamodule1.RArea.SQL.Add('select * from admin_division where adname=:areaname'); Datamodule1.RArea.Prepared; Datamodule1.RArea.Parameters.ParamByName('areaname').Value:=sNodeText; Datamodule1.RArea.Open; if not(Datamodule1.RArea.IsEmpty) then begin sAnaly1:=trim(Datamodule1.RArea.Fields[0].AsString); //È¡µÃµ¥»÷½ÚµãµÄCODE±àÂëÖµ Datamodule1.RArea.Close; //ÔÚÓұߴ°¿ÚÏÔʾµã»÷½ÚµãÓµÓеÄϼ¶Öµ if Datamodule1.DBDisp.Active then Datamodule1.DBDisp.Close; Datamodule1.DBDisp.SQL.Clear; Datamodule1.DBDisp.SQL.Add('select adcode ÇøÓò´úÂë,adname ÇøÓòÃû³Æ from admin_division where (adcode like :nodecode) and (len(adcode)=:iLevels)'); Datamodule1.DBDisp.Prepared; Datamodule1.DBDisp.Parameters.ParamByName('nodecode').Value:=sAnaly1+'%'; Datamodule1.DBDisp.Parameters.ParamByName('iLevels').Value:=iLevel; Datamodule1.DBDisp.Open; end; if Datamodule1.RArea.Active then Datamodule1.RArea.Close; end; end; end;
TempTreeNode : TTreeNode;
begin
tempTreenode := Treeview.Selected;
//ADOTABLE是根据所选节点过滤的结果集
adotable.first;
while not adotable.eof do
begin
treeview.items.addchild(temptreenode,adotable.fieldbyname('...').asstring);
adotable.next;
end;
end;2、建议如下格式:
JDID (节点ID),SJJDID(上级节点ID),JDBT(节点标题),JDXSSX(节点显示顺序)
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, DB, ADODB;type
TFormMain = class(TForm)
Access: TADOConnection;
Query: TADOQuery;
Tree: TTreeView;
BtnFillTree: TButton;
procedure FormCreate(Sender: TObject);
procedure BtnFillTreeClick(Sender: TObject);
private
{ Private declarations }
AppPath : String; Function OpenDatabase : Boolean;
Procedure CloseDatabase;
Procedure AddItem( Node : TTreeNode );
public
{ Public declarations }
end;var
FormMain: TFormMain;implementation{$R *.dfm}function TFormMain.OpenDatabase: Boolean;
Var
ConnectionString : String;
begin
Result := False;
ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' +
AppPath + 'Database.mdb;Persist Security Info=False';
Access.ConnectionString := ConnectionString;
Try
Access.Open;
Result := True;
Except
Application.MessageBox( '打开数据库发生错误!', '错误', MB_OK + MB_ICONSTOP );
End;
end;procedure TFormMain.FormCreate(Sender: TObject);
begin
AppPath := ExtractFilePath( ParamStr( 0 ) );
end;procedure TFormMain.CloseDatabase;
begin
Access.Close;
end;procedure TFormMain.BtnFillTreeClick(Sender: TObject);
Var
Node : TTreeNode;
begin
Tree.Items.Clear; If Not OpenDatabase Then Exit; Query.Close;
Query.SQL.Clear;
Query.SQL.Add( 'Select Full_Name From Dept Where Parent_ID = ''000''' );
Try
Query.Open;
While Not Query.Eof Do
Begin
Tree.Items.AddChild( Nil, Query.Fields[ 0 ].AsString );
Query.Next;
End;
Except
Exit;
End; Node := Tree.Items.GetFirstNode;
AddItem( Node ); CloseDataBase;
end;procedure TFormMain.AddItem(Node: TTreeNode);
Var
QueryX : TADOQuery;
NodeX : TTreeNode;
begin
QueryX := TADOQuery.Create( Nil );
QueryX.Connection := Access;
Try
While Node <> Nil Do
Begin
QueryX.Close;
QueryX.SQL.Clear;
QueryX.SQL.Add( 'Select Full_Name From Dept Where Parent_ID =' );
QueryX.SQL.Add( ' ( Select ID From Dept Where Full_Name = ' + QuotedStr( Node.Text ) + ' )' );
Try
QueryX.Open;
While Not QueryX.Eof Do
Begin
NodeX := Tree.Items.AddChild( Node, QueryX.Fields[ 0 ].AsString );
AddItem( NodeX );
QueryX.Next;
End;
Except
Exit;
End;
Node := Node.getNextSibling;
End;
Finally
QueryX.Free;
End;
end;end.
数据库字段:
ID, Parent_ID, Full_Name三个字段(至少)
adcode
adname
adcode是地区编码,每种级别的地区编码有固定长度 ,共有六级深度
要求产生节点树,并且一次不能全部编历生产,要求点击一个节点后,若有则生成下级节点,
我是逐机取值来生成树的,并判断节点的深度.
这个程序从库里取值生产节点的方法上面的兄弟已经提了,另外重要的是鼠标点击TREEVIEW事件,以此来判断生成问题.
我还没有完全写完,不过基本的东西已经出来了,把一些贴出来,结合上面的,你应该差不多了.procedure TfrmInarea.fcTreeView1MouseDown(TreeView: TfcCustomTreeView;
Node: TfcTreeNode; Button: TMouseButton; Shift: TShiftState; X,
Y: Integer); //µ¥»÷½ÚµãÓÒ¼ü²Ëµ¥ ¼°×ó»÷²Ù×÷
var
p: TPOINT;
Axis_X, Axis_Y: Integer;
sAnaly1,sAnaly2:String;
iLevel:Integer; //µ±Ç°½ÚµãµÄ×Ó½Úµã¿í¶È
begin
if Button = mbRight then
begin
CurrentNode := fcTreeview1.GetNodeAt(X, Y);
if CurrentNode = nil then
exit;
if CurrentNode.Selected then
begin
//È«¾Ö±äÁ¿µÄ¸³Öµ
sNodeText:=CurrentNode.Text;
//sNodeLevel:=CurrentNode.Level; //Ïȵ÷ÕûÓÒ¼üµ¯³ö²Ëµ¥ÏîµÄ״̬
if CurrentNode.HasChildren=False then
begin
n1.Enabled:=True;
n2.Enabled:=False;
end
else
begin
n1.Enabled:=False;
n2.Enabled:=True;
end; GetCursorPos(p);
Axis_X := p.X;
Axis_Y := p.Y;
PopupMenu1.Popup(Axis_X, Axis_Y);
end;
end ; if Button = mbLeft then
begin
CurrentNode := fcTreeview1.GetNodeAt(X, Y);
if CurrentNode = nil then
exit;
if CurrentNode.Selected then
begin
//È«¾Ö±äÁ¿µÄ¸³Öµ
sNodeText:=CurrentNode.Text;
iLevel:=frmInarea.AnalyLevel(CurrentNode)+2;
// sNodeLevel:=CurrentNode.Level;
if Datamodule1.RArea.Active then Datamodule1.RArea.Close;
Datamodule1.RArea.SQL.Clear;
Datamodule1.RArea.SQL.Add('select * from admin_division where adname=:areaname');
Datamodule1.RArea.Prepared;
Datamodule1.RArea.Parameters.ParamByName('areaname').Value:=sNodeText;
Datamodule1.RArea.Open; if not(Datamodule1.RArea.IsEmpty) then
begin
sAnaly1:=trim(Datamodule1.RArea.Fields[0].AsString); //È¡µÃµ¥»÷½ÚµãµÄCODE±àÂëÖµ
Datamodule1.RArea.Close; //ÔÚÓұߴ°¿ÚÏÔʾµã»÷½ÚµãÓµÓеÄϼ¶Öµ
if Datamodule1.DBDisp.Active then Datamodule1.DBDisp.Close;
Datamodule1.DBDisp.SQL.Clear;
Datamodule1.DBDisp.SQL.Add('select adcode ÇøÓò´úÂë,adname ÇøÓòÃû³Æ from admin_division where (adcode like :nodecode) and (len(adcode)=:iLevels)');
Datamodule1.DBDisp.Prepared;
Datamodule1.DBDisp.Parameters.ParamByName('nodecode').Value:=sAnaly1+'%';
Datamodule1.DBDisp.Parameters.ParamByName('iLevels').Value:=iLevel;
Datamodule1.DBDisp.Open; end;
if Datamodule1.RArea.Active then Datamodule1.RArea.Close; end;
end;
end;
"如我有一根节点下面有记录,但我在显示窗体的时候不添加记录。只在点击加号的时候再动态添加数据"
因为你的节点是从数据库生成的,所以如果你看的TreeView1的节点上是没有加号的,除非你已经生产了下级子节点