一種較簡易的樹型控件節點構造法

把數據庫中的數據在樹型控件(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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章