认真研究如下代码:DBTreeView--TreeView直接连接数据表
 unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, DB, DBTables, ComCtrls, Grids, DBGrids, ExtCtrls, DBCtrls, Mask, ImgList;
type TForm1 = class(TForm) TreeView1: TTreeView; ImageList1: TImageList; DataSource1: TDataSource; DBEdit1: TDBEdit; Label1: TLabel; Label2: TLabel; DBEdit2: TDBEdit; Table1: TTable; Label3: TLabel; DBNavigator1: TDBNavigator; Label4: TLabel; DBEdit3: TDBEdit; DBEdit4: TDBEdit;
procedure FormCreate(Sender: TObject); procedure TreeView1Change(Sender: TObject; Node: TTreeNode); procedure DataSource1StateChange(Sender: TObject); procedure Table1AfterInsert(DataSet: TDataSet); procedure Table1BeforeDelete(DataSet: TDataSet); procedure Table1BeforeEdit(DataSet: TDataSet); procedure Table1AfterDelete(DataSet: TDataSet); procedure Table1AfterPost(DataSet: TDataSet); private function GetFieldList: TStringList; { Private-Declarationen } public { Public-Declarationen } end;
var Form1: TForm1; FieldList: TStringList;
implementation uses TreeFunc;
{$R *.DFM}
function TForm1.GetFieldList: TStringList; begin FieldList.clear; FieldList.add(Table1.fieldbyname('Country').asstring); FieldList.add(Table1.fieldbyname('city').asstring); FieldList.add(Table1.fieldbyname('Company').asstring); Result := FieldList; end;
procedure TForm1.FormCreate(Sender: TObject); begin FieldList := TStringList.create; TreeView1.items.BeginUpdate;//forbid treeview update Table1.first; while not Table1.eof do begin TreeAddItem(TreeView1, GetFieldList, Table1.getBookmark, false);//生成结点 Table1.next; end; FieldList.clear; TreeView1.Alphasort; TreeView1.items.Endupdate;
//make first record selected: TreeView1.items[2].selected := true; end;
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode); begin Datasource1.enabled := Node.data <> nil; if DataSource1.enabled then Table1.Gotobookmark(node.data); end;
procedure TForm1.DataSource1StateChange(Sender: TObject); var ItemList: TStringList; Node: TTreeNode; begin end;
procedure TForm1.Table1AfterInsert(DataSet: TDataSet); begin FieldList.clear; end;
procedure TForm1.Table1BeforeDelete(DataSet: TDataSet); begin GetFieldList; end;
procedure TForm1.Table1BeforeEdit(DataSet: TDataSet); begin GetFieldList; end;
procedure TForm1.Table1AfterDelete(DataSet: TDataSet); var CascadeDeleteLevel: Integer; begin CascadeDeleteLevel := 0; TreeDeleteItem(TreeView1, FieldList, CascadeDeleteLevel); end;
procedure TForm1.Table1AfterPost(DataSet: TDataSet); begin TreeView1.items.beginUpdate;
if FieldList.count > 0 then TreeDeleteItem(TreeView1, Fieldlist, 0); TreeView1.selected := TreeAddItem(TreeView1, GetFieldlist, Table1.getbookmark, True);
TreeView1.items.endUpdate; end;
end. ///------------------------ unit TreeFunc;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, ComCtrls, DB, Forms, Dialogs;
function TreeFindItem(Sender: TTreeView; NodeItem: TTreeNode; Name: String): TTreeNode; function TreeAddItem(Sender: TTreeView; ItemList: TStrings; Bookmark: TBookmark; Resort: Boolean): TTreeNode; function TreeGetItem(Sender: TTreeView; ItemList: TStrings): TTreeNode; procedure TreeDeleteItem(Sender: TTreeView; ItemList: TStrings; Level: Integer);
implementation
function TreeAddItem(Sender: TTreeView; ItemList: TStrings; Bookmark: TBookmark; Resort: Boolean): TTreeNode; var ThisNode, Node: TTreeNode; I: Integer; begin Node := nil; //nil = level 0 has no parent node //this is checked by TreeFindItem for I := 0 to Itemlist.count -1 do begin //for ThisNode := TreeFindItem(Sender, node, Itemlist[i]); if ThisNode <> nil then Node := ThisNode else begin if I < Itemlist.count -1 then begin if I = 0 then Node := Sender.items.Add(Node, Itemlist[i]) else Node := Sender.items.AddChild(Node, Itemlist[i]); end else begin if I = 0 then Node := Sender.items.AddObject(Node, Itemlist[i], Bookmark) else Node := Sender.items.AddChildObject(Node, Itemlist[i], Bookmark); end; Node.stateIndex := Node.level + 1; if Resort and (Node.parent <> nil) then Node.parent.alphasort; end; end; //for Result := Node; end;
function TreeFindItem(Sender: TTreeView; NodeItem: TTreeNode; Name: String): TTreeNode; begin if NodeItem = nil then NodeItem := Sender.items.getfirstnode else NodeItem := NodeItem.getfirstchild; //NodeItem is now the first item of the desired level //if this level has no items, NodeItem is nil
if (NodeItem <> nil) and (NodeItem.text <> Name) then repeat NodeItem := NodeItem.getnextsibling; until (NodeItem = nil) or (NodeItem.text = Name); Result := NodeItem; end;
function TreeGetItem(Sender: TTreeView; ItemList: TStrings): TTreeNode; begin Result := TreeAddItem(Sender, Itemlist, nil, false); end;
procedure TreeDeleteItem(Sender: TTreeView; ItemList: TStrings; Level: Integer); var Node, Parent: TTreeNode; begin Node := TreeGetItem(Sender, ItemList); while Node.level >= Level do begin Parent := Node.parent; Node.delete; if (Parent = nil) or (Parent.hasChildren) then break; Node := Parent; end; end;
end.

|