treeview已与数据库连接并显示数据,树结构为:
-01 主材料
--0101 白牛
--0102 黑牛
-02 辅材
--0201 盐酸
--0202 硫酸
现在有 Edit1,Edit2两个框,Edit1输入"0103",Edit2输入"中白牛",BUTTON为添加按钮,要求加进数据库后,TREEVIEW能自动判断显示在 "01 主材料" 下,要如何操作?

解决方案 »

  1.   

    你首先知道该记录的上级节点id,然后添加到数据库后,在遍历treeview找到node.data为这个id的节点,然后在下面添加注意生成treeview时,把节点记录添加到node的data属性中
      

  2.   


    不知道是不是我表述不清楚,我现在treeview已经显示数据库记录,现在添加二级记录时,不能即时更新treeview数据,要关闭窗口重新打开才能显示。因为我显示代码是用onshow事件写的。一级目录添加我用
    treeview1.items.beginupdate;
    Treeview1.items.add(nil,Adoquery1.fieldbyname('一级目录').asstring);
    treeview1.items.endupdate;
    这样可以即时添加更新显示一级目录。在二级目录添加时,如何操作才能像一级目录那样即时更新显示。
      

  3.   

    如果即时更新显示时也像一级目录那样用
    treeview1.items.beginupdate;
    Treeview1.items.add(node,Adoquery1.fieldbyname('二级目录').asstring);
    treeview1.items.endupdate;
    这样的话,node这个节点要从哪取数,就这里搞不出来
      

  4.   

    既然当你加入新的记录后,在formshow的时候可以显示出来,那你可以在添加的时候,将treeview刷新下就可以吧
      

  5.   

    你说的刷新是什么?怎么用?能否写个代码?是用refresh吗?好像不行呢
      

  6.   

    这个问题首先要确定一级目录和二级目录编号之间的关系,就是怎么确定输入的编号是一级编号还是二级编号,如果是二级编号,对应的一级编号又是哪个?看你这个树的结构,估计一级目录编号是由2个字符组成的,二级目录编号由4个字符组成,前两个字符就是一级目录的编号给你个参考代码,只是刷新treeview的,数据库操作部分你自己写吧var
      s1,s2,s3,s4,s:string;
      i,m,n:Integer;
      tn:TTreeNode;
    begin
      s1:=self.Edit1.Text;
      s2:=self.Edit2.Text;
      if (s1='') or (s2='') then
      begin
        MessageBox(Application.Handle,'信息填写不完整','信息',MB_OK or MB_ICONINFORMATION);
        Exit;
      end;
      i:=Length(s1);
      if i=2 then//说明是一级目录
      begin
        m:=self.TreeView1.Items.Count;
        if m>0 then
        begin
          for n:=0 to m-1 do
          begin
            if self.TreeView1.Items[n].Parent<>nil then
              Continue;
            s:=self.TreeView1.Items[n].Text;
            s:=Copy(s,1,2);
            if s=s1 then
            begin
              MessageBox(Application.Handle,'编号已经存在','信息',MB_OK or MB_ICONINFORMATION);
              Exit;
            end;
          end;
          self.TreeView1.Items.AddChild(nil,s1+' '+s2);
        end
        else
          self.TreeView1.Items.AddChild(nil,s1+' '+s2);
        Exit;
      end;
      if i=4 then//说明是二级目录
      begin
        s3:=Copy(s1,1,2);//对应的一级目录
        m:=Self.TreeView1.Items.Count;
        if m=0 then
        begin
          MessageBox(application.Handle,'未找到对应的一级目录','信息',MB_OK or MB_ICONINFORMATION);
          Exit;
        end;
        tn:=nil;
        for n:=0 to m-1 do
        begin
          if self.TreeView1.Items[n].Parent<>nil then
            Continue;
          s:=self.TreeView1.Items[n].Text;
          s4:=Copy(s,1,2);
          if s4<>s3 then//不是对应的一级目录
            Continue;
          tn:=self.TreeView1.Items[n];//这个就是对应的一级目录
          Break;
        end;
        if tn=nil then
        begin
          MessageBox(application.Handle,'未找到对应的一级目录','信息',MB_OK or MB_ICONINFORMATION);
          Exit;
        end;
        m:=tn.Count;
        if m=0 then
          self.TreeView1.Items.AddChild(tn,s1+' '+s2)
        else
        begin
          for n:=0 to m-1 do
          begin
            s:=tn.Item[n].Text;
            s:=Copy(s,1,4);
            if s=s1 then
            begin
              MessageBox(Application.Handle,'输入的编号已经存在','信息',MB_OK or MB_ICONINFORMATION);
              Exit;
            end;
          end;
          self.TreeView1.Items.AddChild(tn,s1+' '+s2);
        end;
        Exit;
      end;
      MessageBox(application.Handle,'输入的编号不合法','信息',MB_OK or MB_ICONINFORMATION);
    end;
      

  7.   


    你formshow的时候怎么做的,你就在添加内容后,把formshow做的事情,再做一遍,不就可以啦~~
      

  8.   


    procedure TForm1.FormCreate(Sender: TObject);
    begin
      TreeView1.FullExpand;
    end;procedure TForm1.AddDataToTreeview;
    var
      idNum,id:string;
      node:TTreeNode;
    begin
      idNum:=copy(edit1.Text,1,2); //取得主ID号
      node:=TreeView1.Items[0];    //取得树根
      while(node<>nil) do begin
        id:=copy(node.Text,1,2);//取得该结点的id号
        if id=idNum then begin
          TreeView1.Items.AddChild(node,edit1.Text+' '+edit2.Text);
        end;
        node:=node.getNextSibling;
      end;
    end;
    闲着没事,给你做了一下,每次添加数据的时候,把运行一下函数
    AddDataToTreeview即可即:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      //1.添加数据到数据库
      //2.运行上面给你的函数
      AddDataToTreeview;
    end;
      

  9.   

    參考procedure CREATETREEVIEWMODEL;//創建BOM樹<MODEL>procedure TRES_BOM_VIEW_F.CREATETREEVIEWMODEL;
    var
      iLoop:Integer;
      Master,MasterNode:TTreeNode;
    begin
      adoq_getop.Close;
      //SELECT distinct PARN_TYP FROM WWW where parn_typ<>'.' and parn_typ is not null order by PARN_TYP desc
      adoq_getop.SQL.Text:='SELECT distinct PARN_TYP FROM WWW where parn_typ<>''.'' and parn_typ is not null order by PARN_TYP desc';
      adoq_getop.Open;
      adoq_getop.First;
      cx_TV.Items.BeginUpdate;
      cx_TV.Items.Clear;
      Master:=cx_TV.Items.Add(nil,'昆盈BOM表檢視');
      while not adoq_getop.Eof do
      begin
        if adoq_getop.FieldByName('PARN_TYP').AsString<>'' then
        begin
          Screen.Cursor:=crSQLWait;
          MasterNode:=cx_TV.Items.AddChild(Master,VarToStr(adoq_getop.FieldValues['PARN_TYP']));
          Application.ProcessMessages;
          qry_op.Close;
          qry_op.SQL.Text:='SELECT DISTINCT PARN_LITM FROM WWW WHERE PARN_TYP='''+ VarToStr(adoq_getop.FieldValues['PARN_TYP'])+''' GROUP BY PARN_LITM';
          qry_op.Open;
          for iLoop:=0 to qry_op.RecordCount -1 do
          begin
            cx_TV.Items.AddChild(MasterNode,VarToStr(qry_op.FieldValues['PARN_LITM']));
            qry_op.Next;
          end;
          Application.ProcessMessages;
          cx_TV.Items.EndUpdate;
          Screen.Cursor:=crDefault;
        end;
        adoq_getop.Next;
        Application.ProcessMessages;
      end;
     {
      ThreadTView:=cx_TV;
      ViewThread:=TExpandLH.Create;
      ViewThread.Resume;
      }
    end;調用:
    procedure TRES_BOM_VIEW_F.btnSB_SearchClick(Sender: TObject);
    begin
      inherited;
      try
        RES_LOADING_F:=TRES_LOADING_F.Create(Self);
        RES_LOADING_F.Label1.Caption:='正在檢索相關數據......';
        RES_LOADING_F.Show;
        RES_LOADING_F.Update;
        CREATETREEVIEWMODEL;
      finally
        RES_LOADING_F.Close;
      end;
    end;