要求Treeview里的数据和SQL的数据同步,就是当删除一条数据库记录的时候,Treeview也同时删除相应记录,同样希望单击Treeview的节点的时候,可以调出相应的记录,并可以修改,我做的是一个通讯录和数据库连接起来的程序。
procedure TForm1.FormCreate(Sender: TObject);
var
rootnode:TTreeNode;begin
rootnode:=TreeView1.Items.AddFirst(nil,'通讯录');
adoQuery1.open;
ComboBox2.Items.Clear;
while not adoQuery1.eof do
begin
ComboBox2.Items.Add(adoQuery1.fieldByname('txl_JiGuan').asstring);
adoQuery1.Next; end;//使籍贯记录与数据库表关联
while not adoquery3.Eof do
begin
Treeview1.Items.AddChild(rootnode,adoquery3.fieldbyname('txl_no').AsString);
TreeView1.Items.GetFirstNode;
adoquery3.Next;
end;end;
这是我写的有关Treeview的语句,但执行后Treeview可以读取数据库中的txl_no,但不会调出其他信息,如:姓名,出生年月等,当我通过dbgrid删除记录的时候,Treeview里那条记录却还在。
procedure TForm1.FormCreate(Sender: TObject);
var
rootnode:TTreeNode;begin
rootnode:=TreeView1.Items.AddFirst(nil,'通讯录');
adoQuery1.open;
ComboBox2.Items.Clear;
while not adoQuery1.eof do
begin
ComboBox2.Items.Add(adoQuery1.fieldByname('txl_JiGuan').asstring);
adoQuery1.Next; end;//使籍贯记录与数据库表关联
while not adoquery3.Eof do
begin
Treeview1.Items.AddChild(rootnode,adoquery3.fieldbyname('txl_no').AsString);
TreeView1.Items.GetFirstNode;
adoquery3.Next;
end;end;
这是我写的有关Treeview的语句,但执行后Treeview可以读取数据库中的txl_no,但不会调出其他信息,如:姓名,出生年月等,当我通过dbgrid删除记录的时候,Treeview里那条记录却还在。
有数据删除,你treeview的节点就相应的利用delete减去,
有数据增加,也同理
但肯定不是再用上面的函数对数据库进行访问得到
那样反复操作数据库,是不妥的
type
TCoid=record //记录用来存放 coid 编号
Coid:string;
Isopen:boolean;
Companytypeid:integer;
Areaid:Variant;
nNodeData:TTreeNode;
end;
PTCoid=^TCoid; //结构体指针pCoid:array [0..10000] of PTCoid;
添加节点时,动态增加数组元素,并为每个属性赋值(树的AbsoluteIndex 值与数组下标相对应),这样可以使得树的节点和数据库关联起来,之后是操作,在修改数据之前,你可以记下状态,然后再在 DataSource1DataChange 中进行判断,修改的是哪些字段,再对树进行调,比如移动节点 TreeView1.Selected.MoveTo(pCoid[i].nNodeData,naAddChildFirst);//参数:父节点(需要移动到哪个节点下),添加方式,要注意数组中的属性也要跟着变,不然查询数据时会有误
新增,删除数据,注意新增删除时,对数组也要作同样的操作(新增,删除元素),然后再对树进行操作如果需要完整的例子....请留言!!
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ADODB, DB, ComCtrls, Menus, ExtCtrls, Grids, DBGrids;type
TForm1 = class(TForm)
ADOQuery1: TADOQuery;
TreeView1: TTreeView;
PopupMenu1: TPopupMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
ADOQuery2: TADOQuery;
Splitter1: TSplitter;
DBGrid1: TDBGrid;
ADOQuery3: TADOQuery;
DataSource1: TDataSource;
procedure FormCreate(Sender: TObject);
procedure N1Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure TreeView1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
list:TStringList;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
var
index: integer;
Node: TTreeNode;
begin
ADOQuery1.SQL.clear;
ADOQuery1.Close;
ADOQuery1.SQL.Add('select * from lb_t');
ADOQuery1.Open;
TreeView1.Items.BeginUpdate;
list.Clear;
TreeView1.items.clear;
ADOQuery1.SQL.Clear;
ADOQuery1.Close;
ADOQuery1.SQL.Add('select * from lb_t order by fxh,lbxh');
ADOQuery1.Open;
ADOQuery1.DisableControls;
TreeView1.Items.Clear;
list.Clear;
List.Sorted := True;
ADOQuery1.First;
while not ADOQuery1.Eof do
begin
if ADOQuery1.FieldByName('fxh').AsInteger = 0 then //0是顶层节点
Node := TreeView1.Items.AddChildObject(nil,
ADOQuery1.FieldByName('lbmc').AsString,
ADOQuery1.GetBook) //增加节点
else
begin
Index := List.IndexOf(ADOQuery1.FieldByName('fxh').AsString);
Node := TreeView1.Items.AddChildObjectFirst(TTreeNode(List.Objects[Index]),
ADOQuery1.FieldByName('lbmc').AsString, ADOQuery1.GetBook);//增加子节点
end;
List.AddObject(ADOQuery1.FieldByName('lbxh').Asstring, Node);
//增加当前节点的信息到列表中
ADOQuery1.Next;
end;
TreeView1.Items.EndUpdate; //建树
ADOQuery1.EnableControls;
end;procedure TForm1.N1Click(Sender: TObject);
var
xdq:string;
Node:TTreeNode;
fxh:integer;
begin
xdq:=Trim(InputBox('添加新地区','新地区名称',''));
if Trim(xdq)='' then
exit;
ADOQuery2.SQL.Clear;
ADOQuery2.close;
ADOQuery2.SQL.Add('select lbmc from lb_t where lbmc = '''+xdq+'''');
ADOQuery2.Open;
if not ADOQuery2.IsEmpty then
begin
Application.MessageBox('该地区名称已存在,请重新添加','提示',MB_OK);
exit;
end;
try
with ADOQuery1 do
begin
fxh:=FieldByName('lbxh').AsInteger;
Append;
FieldByName('lbmc').AsString :=xdq;
FieldByName('fxh').AsInteger :=fxh;
Post;
Node:=TreeView1.Items.AddChildObject(TreeView1.Selected,xdq,GetBook);
TreeView1.Select(TreeView1.Items.Item[0]);
end;
except
Node.Delete; //用唯一性约束来限制
TreeView1.Select(TreeView1.Items.Item[0]);
Application.MessageBox('该地区名称已存在,请重新添加','提示',MB_OK);
end;
end;procedure TForm1.N2Click(Sender: TObject);
var
xlb,jlb:string; //新名称 和 旧名称
Node:TTreeNode;
begin
try
Node := TreeView1.Selected;
if Node.IsFirstNode then
begin
ShowMessage('该项不能修改');
exit;
end;
jlb:=Node.Text;
xlb:=InputBox('修改地区','新地区名称',TreeView1.Selected.Text);
if xlb='' then
exit;
Node.Text:=xlb;
ADOQuery1.Edit;
ADOQuery1.FieldByName('lbmc').AsString:=xlb;
ADOQuery1.post;
except
begin //用唯一性约束来限制
Node.Text:=jlb;
ADOQuery1.Edit;
ADOQuery1.FieldByName('lbmc').AsString :=jlb;
ADOQuery1.post;
TreeView1.Select(TreeView1.Items.Item[0]);
Application.MessageBox('该地区名称已存在,请重新添加','提示',MB_OK);
end;
end;
end;procedure TForm1.N3Click(Sender: TObject);
var Node: TTreeNode;
begin
try
Node := TreeView1.Selected;
if Node.IsFirstNode then
begin
Application.MessageBox('该项不能删除','提示',MB_OK);
exit;
end;
if Node.HasChildren then
begin
Application.MessageBox('请先将子项删除','提示',MB_OK);
exit;
end;
with ADOQuery1 do
begin
GotoBook(Node.Data);
Delete;
end;
Node.Delete;
except
begin //用外键约束来限制
TreeView1.Select(TreeView1.Items.Item[0]);
Application.MessageBox('该记录已被引用,请将相关记录删除','提示',MB_OK);
end;
end;
end;procedure TForm1.TreeView1Click(Sender: TObject);
var lbxh:integer;
begin
if ADOQuery1.Active = false then
exit;
ADOQuery3.SQL.Clear;
ADOQuery3.close;
ADOQuery3.SQL.Add('select lbxh from lb_t where lbmc='''+TreeView1.Selected.Text+'''');
ADOQuery3.Open;
lbxh:=ADOQuery3.fieldbyname('lbxh').AsInteger;
ADOQuery3.SQL.Clear;
ADOQuery3.close;
ADOQuery3.SQL.Add('exec getlb_p'+' ');
ADOQuery3.SQL.Add( inttostr(lbxh));
ADOQuery3.Open;
end;initialization
List := TStringList.Create;finalization
list.Free;end.