现阶段我已将数据添加进数据库,可TreeView不能即时显示添加记录,要如何操作,烦请附个代码,不要纯理论的,不是科班出身,基础不牢固,只有代码才能看得懂,谢谢!
树结构如下:
  -01 主要材料
  ----001 白牛
  ----002 黑牛
  -02 辅助材料
  ----001 盐酸
  ----002 硫酸
  -03 产成品
  -04 在产品
  -05 半成品数据库表结构如下:
一级表'wlyjfl':wlyjfl_id,wlyjfl_name;
二级表‘wlejfl':wlejfl_wlyjfl_name,wlejfl_id,wlejfl_name;其中wlejfl_wlyjfl_name与一级表中的wlyjfl_name相同;窗体上控件为:TreeView1,Edit1,Edit2.Combobox1(此为二级添加时,显示一级目录wlyjfl),button1,Adoquery1;
基本操作如下:选择Combobox1项,在Edit1输入ID,Edit2输入name,button1为添加按钮,要求Treeview1即时更新显示添加数据,请高手们指点下,谢谢了!

解决方案 »

  1.   

    附下我窗体onshow里代码:
    Adoquery4.Close;
      Adoquery4.SQL.Clear;
      Adoquery4.SQL.Text:='select * from wlyjfl';
      Adoquery4.Open;
      Treeview1.Items.Clear;
      while not Adoquery4.Eof do
        begin
        node:=TreeView1.Items.Add(nil,Adoquery4.fieldbyname('wlyjfl_id').AsString+' '+Adoquery4.fieldbyname('wlyjfl_name').AsString);
        Adoquery7.Close;
        Adoquery7.SQL.Clear;
        Adoquery7.SQL.Text:='select * from wlejfl where wlejfl_wlyjfl_name='''+Adoquery4.fieldbyname('wlyjfl_name').AsString+'''';
        Adoquery7.Open;
        while not Adoquery7.Eof do
          begin
          TreeView1.Items.AddChild(node,Adoquery7.fieldbyname('wlejfl_id').AsString+' '+Adoquery7.fieldbyname('wlejfl_name').AsString);
          Adoquery7.Next;
          end;
        Adoquery4.Next;
      end;
    end;
      

  2.   

    据我测试,你只需要在点button1按钮的代码的最后面,加上这个代码Form1.OnShow(Self);就可以了
      

  3.   

    你可以参考一下这贴里我给的回复
    http://topic.csdn.net/u/20101103/11/38a93f13-5ca5-4341-b799-d69483026f95.html?80199
      

  4.   


    你这方法我之前弄过,每次添加时,TreeView会闪一下,效果不好呀。
      

  5.   

    相当于重新从数据库里查找一遍嘛~~如果你不想从数据库里找,那就用
    http://topic.csdn.net/u/20101103/11/38a93f13-5ca5-4341-b799-d69483026f95.html?80199

    hys_427给你的解决方案吧
      

  6.   

    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;
      

  7.   

    换一种方式吧。例如:数据表一:01 主要材料
    数据表二:主要材料 01001 白牛
              主要材料 01002 黑牛
    因为我在输入时,有个combobox选择一级目录的分类,属于哪一类的。在数据库二级表中,也有这个分类。现在我希望是在添加数据时,自动比较新添加的记录中的一级分类与TreeView一级目录哪个相同,如果相同,则在此目录下增加二级节点。01002这种代码我是依据选择的一级分类自动生成的,不是人为输入的。现在就是要判断父结点哪个别TEXT与数据库二级表中fieldbyname('一级目录').asstring相同,是就往下新增子节点。大概思路是这样,代码写不出来 
      

  8.   

    你的目的是查找对应结点吧,找到后,在该结点下添加结点是不?function TForm1.FindNode(str: string): TTreeNode;
    begin
      result:=TreeView1.Items[0].getFirstChild;
      while result<>nil do begin
        if node.Text=str then
          break;
        result:=result.getNextSibling;
      end;
    end;//找到对应的结点后,直接添加节点就可以了
    var
      node:TTreeNode;
    ...
    node:=FindNode(str);
    if node<>nil then
      TreeView1.Items.AddChild(node,str);
      

  9.   

    var
      node:TTreeNode;
    加一级目录节点:node:=TreeView1.items.add(nil,'一级目录');
    加二级目录节点:TreeView1.items.addchild(node,'二级目录');
    上面这样加节点的代码没错吧,我也只明白这个,汗。现在就是要加二级节点,Node这个要自动进行判断一下,这样才能加进去所属的二级节点。比如一级:01,02,03。现有二级:01002,这个是应该加在一级01下面的,就这个判断代码整不来
      

  10.   

    for i:=0 to treeview1.items.count-1 do
      if treeview1.items[i].text='01' then
      begin
        TreeView1.items.addchild(treeview1.items[i],'01002');
        break;
      end;