要求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里那条记录却还在。

解决方案 »

  1.   

    建立一个新的方法,对dbgrid的操作进行监
    有数据删除,你treeview的节点就相应的利用delete减去,
    有数据增加,也同理
    但肯定不是再用上面的函数对数据库进行访问得到
    那样反复操作数据库,是不妥的
      

  2.   

    添加节点,就用递归的方法实现吧...例子就不给了,关键是如何让树的节点跟着数据库的操作走,比如新增一条记录时,相应的节点也新增一个,删除一条记录时,也删除相应的节点.
    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);//参数:父节点(需要移动到哪个节点下),添加方式,要注意数组中的属性也要跟着变,不然查询数据时会有误
    新增,删除数据,注意新增删除时,对数组也要作同样的操作(新增,删除元素),然后再对树进行操作如果需要完整的例子....请留言!!
      

  3.   

    unit Unit1;interfaceuses
      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.