现在本小生用treeview可以来显示数据库中的信息,敢问如何将其保存会数据库表中
表结构如下:mid(节点序号,此为一次递增的),caption(节点描述),parentid(父节点序号),index(同级序号)
再树中我只显示caption中的内容,如果我对树进行了操作,比如对树上多个节点的caption做了更改,如何将改后整个树的信息在存回数据库表中?
不知道说清楚没有,希望各路大侠多多帮忙!!

解决方案 »

  1.   

    mid(节点序号,此为一次递增的)是唯一的ID嗎?
    先把mid存在TreeNode.data里
    TreeNode1:=tv1.getfirstnode;
    while TreeNode1<>nil do begin
      if table1.locate('mid',Integer(TreeNode1.data),[]) then begin
        table1.edit;
        table1.fieldbyname('caption').asstring:=TreeNode1.caption;
        table1.post;
      end;
      TreeNode1:=TreeNode1.GetNext;
    end;
    不知行不?
    另參考一下幫助里的
    GetHandleGetLastChild
    GetNext
    GetNextChild
    getNextSibling
    GetNextVisible
    GetPrev
    GetPrevChildgetPrevSibling
    GetPrevVisible
    可能有用
      

  2.   

    也許更好是在OnEdited事件種保存﹐這樣就不用遍歷了
    procedure TForm1.TreeView1Edited(Sender: TObject; Node: TTreeNode;
      var S: String);
    begin
      if table1.locate('mid',Integer(Node1.data),[]) then begin
        table1.edit;
        table1.fieldbyname('caption').asstring:=s;
        table1.post;
      end;
    end;
      

  3.   

    定义一个记录指针:
    ------------------------------
       PItem=^TPItem;
         TPItem=Record
         mid,parentid,index:Integer;
       end;
    {(节点序号,此为一次递增的),caption(节点描述),parentid(父节点序号),index(同级序号)}
    ---------------------------------------------
    var 
        NodeL,ChildNode:TTreeNode;
        x:PItem;
    begin
      inherited;
      treList.Items.Clear;
      NodeL:=treList.Items.Add(Nil,'树');
      NodeL.ImageIndex:=2;
      NodeL.SelectedIndex:=2;
      DataSet.First;
      while Not DataSet.Eof do
      begin
        New(x);  //mid,parentid,index
        x.mid:=DataSet.FieldBynaMe('mid').AsInteger;
        x.index:=DataSet.FieldBynaMe('index').AsInteger;
        x.parentid:=DataSet.FieldBynaMe('parentid').AsInteger;
        ChildNode:=treList.Items.AddChildObject(NodeL,DataSet.FieldBynaMe('caption').AsString,Tobject(x));                       //这样每个结点都保存有mid,parentid,index,操作起来就简单多了。
        ChildNode.ImageIndex:=1;
        ChildNode.SelectedIndex:=0;
        DataSet.Next;
      end;
      TreList.TopItem.Expanded:=True;
    end;
    -----------------------------------------
    取结点的mid,parentid,index时可能这样:
      mid:=PItem(trelist.Selected.Data).mid;
      parentid:=PItem(trelist.Selected.Data).parentid;
      

  4.   

    整个保存,导入TreeView1.SaveToFile(filename);
    TreeView1.LoadfromFile(filename);你可以把这个文件保存到数据库中去,也可以把文件中的内容保存到数据库中去,剩下你自己做
      

  5.   

    可以用节点的data属性,存储该节点的唯一id,具体实现,只要有父亲节点的id,使用递归,不用管层次,移动后只要把党前节点的父节点更新即可:自己写的程序中的一段,参考一下吧
    type
      pstr=^string;
      Tmainfrm = class(TForm)
        ClientDataSet1: TClientDataSet;
        DataSource1: TDataSource;
        ClientDataSet2: TClientDataSet;
        DataSource2: TDataSource;
        pnl_back: TPanel;
        pnl_hand: TPanel;
        Label2: TLabel;
        Panel1: TPanel;
        Label3: TLabel;
        Label4: TLabel;
        Label5: TLabel;
        BitBtn2: TBitBtn;
        DateTimePicker1: TDateTimePicker;
        DateTimePicker2: TDateTimePicker;
        pnl_data: TPanel;
        DBGrid2: TDBGrid;
        pnl_left: TPanel;
        TreeView1: TTreeView;
        Panel2: TPanel;
        Panel3: TPanel;
        Panel4: TPanel;
        pnl_top_main: TPanel;
        lb_caption2: TLabel;
        lb_caption: TLabel;
        pnl_color: TPanel;
        pnl_color2: TPanel;
        pnl_color3: TPanel;
        ClientDataSet3: TClientDataSet;
        ClientDataSet4: TClientDataSet;
        Splitter2: TSplitter;
        Splitter1: TSplitter;
        Panel5: TPanel;
        MainMenu2: TMainMenu;
        N1211: TMenuItem;
        M1: TMenuItem;
        N1: TMenuItem;
        H1: TMenuItem;
        Label1: TLabel;
        ToolBar1: TToolBar;
        ClientDataSet5: TClientDataSet;
        SocketConnection1: TSocketConnection;
        N2: TMenuItem;
        N3: TMenuItem;
        DataSource3: TDataSource;
        ImageList1: TImageList;
        ImageList2: TImageList;
        ImageList3: TImageList;
        procedure BitBtn1Click(Sender: TObject);
        procedure FormShow(Sender: TObject);
        procedure TreeView1Click(Sender: TObject);
        procedure N3Click(Sender: TObject);
        procedure TreeView1Expanded(Sender: TObject; Node: TTreeNode);
        procedure TreeView1Collapsed(Sender: TObject; Node: TTreeNode);
      private
        procedure genallcustomer(var i_level:integer);
        function initial:boolean;
        { Private declarations }
      public
        { Public declarations }
      end;var
      mainfrm: Tmainfrm;
      cus_str:string;
    implementationuses person;{$R *.dfm}
    function Tmainfrm.initial:boolean;
    begin
      self.DateTimePicker1.DateTime:=now;
      self.DateTimePicker2.DateTime:=now;
    end;
    procedure Tmainfrm.genallcustomer(var i_level:integer);
    var
      TNode:TTreeNode;
      TFistrNode:TTreeNode;
      TregionNode:TTreeNode;
      I,J:Integer;
      Fid,Fregion,Fname:string;
      P:pstr;
    begin
      With self.ClientDataSet3 Do
      Begin
        Close;
        CommandText:='SELECT Customer_Name,Region,Customer_No FROM Customer WHERE Customer_Level=:var1';
        Params.ParamByName('var1').Value:='1';
        Try
          open;
        Except
        End;
      End;
        TFistrNode:=self.TreeView1.Items.AddChild(nil,'中鑫公司客户列表');
        Fid:='000000';
        Fname:='中鑫公司';
        new(p);
        p^:=Fid;
        TregionNode:=self.TreeView1.Items.AddChildObject(TFistrNode,Fname,p);
      For I:=0 To self.ClientDataSet3.RecordCount-1 Do
      Begin    Fid:=self.ClientDataSet3.Fields[2].Value;
        Fregion:=self.ClientDataSet3.Fields[1].Value;
        Fname:=self.ClientDataSet3.Fields[0].Value;
        new(p);
        p^:=Fid;
        TregionNode:=self.TreeView1.Items.AddChildObject(TFistrNode,Fname,p);
        With self.ClientDataSet4 Do
        Begin
          Close;
          commandtext:='SELECT Customer_Name,Region,Customer_No FROM Customer WHERE     Region=:var1 and Customer_Level<>:var2';
          Params.ParamByName('var1').Value:=Fregion;
          Params.ParamByName('var2').Value:='1';
          Try
            open;
          Except
          End;
          For J:=0 To self.ClientDataSet4.RecordCount-1 Do
          Begin
            Fid:=self.ClientDataSet4.Fields[2].Value;
            Fname:=self.ClientDataSet4.Fields[0].Value;
            new(p);
            p^:=Fid;
            Tnode:=self.TreeView1.Items.AddChildObject(TregionNode,Fname,p);
            self.ClientDataSet4.Next;
          End;
        End;
        self.ClientDataSet3.Next;
      End;
      self.ClientDataSet4.Close;
      self.ClientDataSet3.Close;
      //--self.TreeView1.AutoExpand:=true;
    end;procedure Tmainfrm.BitBtn1Click(Sender: TObject);
    var
      str1,str2:string;
    begin
    //  showmessage(cus_str);
      self.BitBtn2.Enabled:=false;
      self.ClientDataSet2.Close;
      self.ClientDataSet2.CommandText:='exec Query_All_About_End_Seller_my :var1,:var2,:var3,:var4,:var5,:var6,:var7,:var8,:var9';
      with self.ClientDataSet2.Params do
      begin
        ParamByName('var1').Value:='';
        ParamByName('var2').Value:='0109';
        ParamByName('var3').Value:=cus_str;
        ParamByName('var4').Value:='';
        ParamByName('var5').Value:=formatdatetime('yyyymmdd',self.DateTimePicker1.Date);
        ParamByName('var6').Value:=formatdatetime('yyyymmdd',self.DateTimePicker2.Date);
        ParamByName('var7').Value:='0';
        ParamByName('var8').Value:=str1;
        ParamByName('var9').Value:=str2;
      end;
      self.ClientDataSet2.Open;
      self.DBGrid2.DataSource:=self.DataSource2;
      self.BitBtn2.Enabled:=true;
    end;procedure Tmainfrm.FormShow(Sender: TObject);
    VAR
      fa:integer;
    begin
      fa:=1;
      cus_str:='all';
      genallcustomer(fa);
      initial;
    end;procedure Tmainfrm.TreeView1Click(Sender: TObject);
    var
      TTNode:TTreeNode;
    begin
      TTNode:=self.TreeView1.Selected;
      if TTNode.Level=0 then
      begin
        cus_str:='all';
        exit;
      end;
      cus_str:=Pstr(TTnode.Data)^;
     // showmessage(cus_str);
    end;end.