把數據庫中的數據在樹型控件(TreeView)中正確顯示是較爲不易,我在實際編程中經常爲之頭痛,也使用了不少方法,後來仔細研究了cxDBTreeList控件,受到啓發解決了問題:
1、 創建一個表,爲簡化程序,只創建三個數據字段,定義如下:
字段名 類型 長度 說明
Mytext nvarchar 50 要顯示的文字
MyID int 4 主關鍵ID,(可使用自動編號)
MYParentID int 4 記錄父主關鍵ID,無父節點是時爲0
2、窗體中放置一個TreeView控件;
2、使用數據控件連接該數據表(本例中使用ADOTable);
3、聲明一個過程:
procedure MyNode(MyParentID:string;MyNodeT:TTreeNode);
4、過程代碼:
procedure TA_FinanceSubjec.MyNode(MyParentID: string;MyNodeT:TTreeNode);
type
PMyList = ^AList;
AList = record
MyParendID: string;
MyNodeP: TTreeNode ;
end;
var
ATempList: TList;
I: Integer;
ARecord:PMyList;
s:string;
node:TTreeNode;
begin
ADOTable1.Filtered:=true;
ADOTable1.Filter:=' MYParentID ='+MyParentID;
if ADOTable1.RecordCount<1 then exit;
ATempList := TList.Create;
try
ADOTable1.First;
while not ADOTable1.Eof do
begin
New(ARecord);
s:='('+ADOTable1MyID.AsString +')'+ ADOTable1Mytext.AsString ;
node:= TreeView1.Items.AddChild(MyNodeT ,s) ;
ARecord^.MyParendID:= ADOTable1Mytext.AsString ;
Arecord^.MyNodeP :=node;
ATempList.Add(Arecord);
ADOTable1.Next;
end;
for I :=0 to ATempList.Count - 1 do
begin
Arecord:=ATempList.Items[i];
MyNode(Arecord^.MyParendID,Arecord^.MyNodeP );
end;
finally
for I := 0 to ATempList.Count - 1 do
Dispose(ATempList[I]);
ATempList.Free;
ADOTable1.Filtered:=false;
end;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
ADOTable1.DisableControls;
if ADOTable1.Active then
ADOTable1.Active:=false;
ADOTable1.Active:=true;
ADOTable1.First;
MyNode('0',nil );
ADOTable1.EnableControls;
end;
5、改變節點位置時(在OnDragDrop中實現):
var iPos1:integer;s:string;
begin
ipos1:= pos(')', TreeView1.Selected.Parent);
if ipos1>1 then
begin
s:=copy(RzTreeView1.Selected.Text,2,iPos-2);
ADOTable1.Locate('MyID',s,[loPartialKey]);
ADOTable1.edit;
ADOTable1MYParentID.asinteger:=
StrToInt(copy(TreeView1.Selected.Parent,2, ipos1-2)) ;
ADOTable1.post;
End;
(出處:DelphiFans.com)