我的数据库中的一个字段A被设计为treeview的根节点(该字段中仅有5种取值,也就是treeview的根节点总共有5个,设计时加入)另一个字段B的内容作为子节点。现在我需要实现动态动态更改(如插入)数据库时自动更新treeview的子节点,但不知道当用户输入B字段内容时如何自动在treeview的相关根节点下加入新的子节点。请大侠指点,多谢

解决方案 »

  1.   

    再加一个字段,如:B_Parent;这样不就可以了吗?
      

  2.   

    动态TreeView控件示例很多,随便找一点看一看就可以了。
      

  3.   

    Lists the individual nodes that appear in the tree view control.Delphi syntax:property Items: TTreeNodes;C++ syntax:__property TTreeNodes* Items = {read=FTreeNodes, write=SetTreeNodes};DescriptionIndividual nodes in a tree view are TTreeNode objects. These individual nodes can be accessed by using the Items property along with the item's index into the tree view. For example, to access the second item in the tree view, you could use the following code.MyTreeNode := TreeView1.Items[1];
    MyTreeNode = TreeView1->Items[1];When setting this property at design-time in the Object Inspector the Tree View Items Editor appears. Use the New Item and New SubItem buttons to add items to the tree view. Use the Text property to modify what text is displayed in the label of the item.At run-time nodes can be added and inserted by using the TTreeNodes methods AddChildFirst, AddChild, AddChildObjectFirst, AddChildObject, AddFirst, Add, AddObjectFirst, AddObject, and Insert.
      

  4.   

    At run-time nodes can be added and inserted by using the TTreeNodes methods AddChildFirst, AddChild, AddChildObjectFirst, AddChildObject, AddFirst, Add, AddObjectFirst, AddObject, and Insert.
      

  5.   

    unit UTreeFun;interface
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, ToolWin, Grids, DBGrids, DB, ExtCtrls, ImgList, ADODB,
      StdCtrls;  //该结构保存数据的节点信息
      type
        PNodeInfor=^TNodeInfor;
        TNodeInfor=Record
           KeyId:string[10];
           FParentID:string[10];
           FName:string;
    //       IsEnd:Boolean;
    //       IsCanDel:Boolean;
      end;
      //创建TreeView
      function CreateATree(var TreeView:TTreeView;const adoData:TADOTable):boolean;
      //创建子接点
      function CreateSubNode(var Node:TTreeNode;ParentKey:String;TreeView:TTreeView;
        const adoData:TADOTable):Boolean;implementationfunction CreateATree(var TreeView:TTreeView;const adoData:TADOTable):boolean;
    var
      tmpTree:TTreeView;
      tmpItems:TTreeNodes;
      tmpNode:TTreeNode;
      tmpNodeInfor:PNodeInfor;
      tmpBookMark:String;
    begin
      Result:=False;
      tmpNode:=TTreeNode.Create(nil);
      tmpTree:=TreeView;
      tmpItems:=tmpTree.Items;
      tmpItems.Clear;{清除当前所有节点}
      if (not adoData.Active)or(adoData.RecordCount<=0) then
      begin
        Application.MessageBox('数据表中没有数据!','提示',mb_ok+mb_iconwarning);
        Exit;
      end;
      with adoData do
      begin
        First;
        New(tmpNodeInfor);
        tmpNodeInfor.KeyId:=Trim(FieldByName('己编码').AsString);
        tmpNodeInfor.FParentID:=Trim(FieldByName('父编码').AsString);
        tmpNodeInfor.FName:=Trim(FieldByName('名称').AsString);
    //    tmpNodeInfor.IsEnd:=FieldByName('FIsEnd').AsBoolean;
    //    tmpNodeInfor.IsCanDel:=FieldByName('FCanDel').AsBoolean;
        while not EOF do
        begin
          if FieldByName('己编码').AsString=FieldByName('父编码').AsString then
          begin
            tmpNode:=tmpItems.AddObject(nil,tmpNodeInfor.FName,tmpNodeInfor);
            tmpBookMark:=string(BookMark);
            if not CreateSubNode(tmpNode,tmpNodeInfor.KeyId,TreeView,adoData) then
            begin
              Exit;
            end;
            BookMark:=tmpBookMark;
            Next;
          end
          else
            Next;
        end;
      end;
      adoData.First;
      Result:=true;
    end;function CreateSubNode(var Node:TTreeNode;ParentKey:String;TreeView:TTreeView;
    const adoData:TADOTable):Boolean;
    var
      tmpTree:TTreeView;
      tmpItems:TTreeNodes;
      tmpNodeSub:TTreeNode;
      tmpNodeInfor:PNodeInfor;
      tmpBookMark:String;
      FID:string;
    begin
      Result:=False;
      tmpTree:=TreeView;
      tmpItems:=tmpTree.Items;
      FID:=ParentKey;
      tmpNodeSub:=TTreeNode.Create(nil);
      with adoData do
      begin
        First;
        while not EOF do
        begin
          New(tmpNodeInfor);
          tmpNodeInfor.KeyId:=Trim(FieldByName('己编码').AsString);
          tmpNodeInfor.FParentID:=Trim(FieldByName('父编码').AsString);
          tmpNodeInfor.FName:=Trim(FieldByName('名称').AsString);
    //      tmpNodeInfor.IsEnd:=FieldByName('FIsEnd').AsBoolean;
    //      tmpNodeInfor.IsCanDel:=FieldByName('FCanDel').AsBoolean;      if (FieldByName('父编码').AsString=FID)and
            (FieldByName('己编码').AsString<>FieldByName('父编码').AsString) then
          begin
            tmpNodeSub:=tmpTree.Items.AddChildObject(Node,tmpNodeInfor.FName,tmpNodeInfor);
            tmpBookMark:=string(BookMark);
            if not CreateSubNode(tmpNodeSub,tmpNodeInfor.KeyId,TreeView,adoData) then
              Exit;
            BookMark:=tmpBookMark;
            Next;
          end
          else
            Next;
        end;
      end;
      Result:=True;
    end;end.
    ///////////调用的窗体//
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, ADODB, ComCtrls,UTreeFun, Menus, ActnList;type
      TForm1 = class(TForm)
        Tree: TTreeView;
        ADOConnection1: TADOConnection;
        ADOTable1: TADOTable;
        PopupMenu1: TPopupMenu;
        N1: TMenuItem;
        ActionList1: TActionList;
        Addmax: TAction;
        procedure FormShow(Sender: TObject);
        procedure TreeGetSelectedIndex(Sender: TObject; Node: TTreeNode);
        procedure TreeCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode;
          State: TCustomDrawState; var DefaultDraw: Boolean);
        procedure TreeChange(Sender: TObject; Node: TTreeNode);
        procedure N1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormShow(Sender: TObject);
    begin
      CreateATree(Tree,adoTable1);
    end;procedure TForm1.TreeGetSelectedIndex(Sender: TObject; Node: TTreeNode);
    begin
    //
    //showmessage(node.Text);
    end;procedure TForm1.TreeCustomDrawItem(Sender: TCustomTreeView;
      Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
    begin
    //Showmessage(node.Text);
    end;procedure TForm1.TreeChange(Sender: TObject; Node: TTreeNode);
    begin
    //Showmessage(Node.Text);
    end;procedure TForm1.N1Click(Sender: TObject);
    begin
    //
    end;end.