数据表如下:   
  code       分类代码   
  name       分类名称   
  endflag    末级标志   
  pid        所在层次   
  内容如下:   
  code             name              endflag        PID   
  1                 酒水                false           1   
  101               白酒                  false           2   
  102               啤酒                  false           2   
  1010001           九江米酒              true            3   
  1010002           小糊涂酒              true            3   
  1020001           青鸟啤酒             true           3导入的结果是:
1酒水
   101白酒
          1010001九江米酒
         1010002小糊涂酒
   102啤酒
         1020001青鸟啤酒
      
  请问:怎样将其分类内容用treeview按级数方式显示出来,我想知道思路和代码,我也查过有朋友也问过这个问题,但回答都不是直接回答,只是叫用DXTREEVIEW,我也不知道这个控制怎样用的,我相信DELPHI自带的控件一样做得到的,请直接把实现的方法和代码,最好是适合数据量大一点的代码,告诉我,请朋友们能提供下。

解决方案 »

  1.   

    思路
    先把第一级数据取出,然后依次添加到Treeview
    在TreeView的Expanding事件中写,根据该节点code,取出下级记录,然后添加到该节点下这样做避免一次读入所有数据,速度太慢的问题,和windows资源管理器是一个原理
      

  2.   

    用SELECT语句选出CODE,NAME where PID=1做根目录,然后逐级加下。第二级就是where code=1.依次类推吧
      

  3.   

    朋友,你的数据库设计可优化一下:
    字段endflag和PID纯属多余,没有任何必要数据内容应为:
    code            name        
     01             酒水  
     0101           白酒
     0102           啤酒
     010101         九江米酒
     010102         小糊涂酒
     010201         青鸟啤酒如果数据量较大,则应存储为:
    code            name        
     001            酒水  
     001001         白酒
     001002         啤酒
     001001001      九江米酒
     001001002      小糊涂酒
     001002001      青鸟啤酒
    其他情况类推
      

  4.   

    编码很简单:
    可根据code的长度来判断级数,如上述01为1级,0101为二级,如果是纯粹想显示成一个树状图形,不用treeview,也不用其他任何控件,就能做到,而且非常简单的处理就可做到
      

  5.   


    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;
      

  6.   

    简单,兄弟不用愁,我以前做过比你这个更复杂的,用treeviee可以做的
    treeview是可以加图片在每个节点前面的,这样的话,你同一类的(同一级别的节点)就可以设置一个一样的图片,每个图片的imageindex不一样,另外treeview的每个节点都有一个指针data,你也可以把相关的参数附加到这个里面,通过treeview的click事件,把所选择的节点的相关参数提取出来去查相关的数据库,这样就把复杂的问题简单化了。
      

  7.   

    1.建表的SQL语句:create table SHOWBOM(code varchar(10),[name] varchar(50), endflag varchar(10),pid INT)
    insert SHOWBOM select '1','酒水','false',1  
    union all select '101','白酒','false',2  
    union all select '102','啤酒','false',2  
    union all select'1010001','九江米酒','true',3  
    union all select'1010002','小糊涂酒','true',3  
    union all select'1020001','青鸟啤酒','true',3
    /*
    SELECT * FROM showbom 
    ---结果:
    1 酒水 false 1
    101 白酒 false 2
    102 啤酒 false 2
    1010001 九江米酒 true 3
    1010002 小糊涂酒 true 3
    1020001 青鸟啤酒 true 3
    */
    2:DELPHI的建树初步代码,有待优化,只提供一般的方法(用DELPHI自带的TreeView控件):procedure TForm1.btn1Click(Sender: TObject);
    var
      List: TStringList;
      Nodea,Node,nodec: TTreeNode;
      Index: Integer;
      i:Integer;
      str:string;
    begin
       with qry1 do begin{--qry1是TADOQuery控件--}
          Open;
          if not IsEmpty  then  begin
             TreeView1.Items.BeginUpdate;
             TreeView1.Items.Clear;
             List := TStringList.Create;
             Nodea:=TreeView1.Items.AddFirst(nil,'展BOM');{最顶层大标题}
             List.AddObject('展BOM',nodea);
             while not eof do begin
               i:=Length(Trim(FieldByName('code').AsString));
               case i of
                1:begin
                  Node := TreeView1.Items.AddChild(nodea,FieldByName('code').AsString+
                          FieldByName('name').AsString);
                  List.AddObject(FieldByName('code').AsString,node);
                end;
                3:begin
                 str:=FieldByName('code').AsString;
                 Index := List.IndexOf(Copy(str,1,1));
                 nodec := TreeView1.Items.AddChild(TTreeNode(List.Objects[Index]),
                          FieldByName('code').AsString+
                          FieldByName('name').AsString);             List.AddObject(str,nodec);
                end;
                else begin
                  str:=FieldByName('code').AsString;
                 Index := List.IndexOf(Copy(str,1,3));
                 nodec := TreeView1.Items.AddChild(TTreeNode(List.Objects[Index]),
                          FieldByName('code').AsString+
                          FieldByName('name').AsString);             List.AddObject(str,nodec);
                end;           end;
             next;
            end;
            TreeView1.Items.EndUpdate;
            List.Free;
          end;
       end;
    end;
    3:本代码DELPHI 2009 测试通过。
      

  8.   

    这种用CASE的方式对于CODE多时,不是很适合吧
      

  9.   

    1.你的问题:
      请问:怎样将其分类内容用treeview按级数方式显示出来,我想知道思路和代码.2.我的回答:
      DELPHI的建树初步代码,有待优化,只提供一般的方法(用DELPHI自带的TreeView控件)3.我的数据库结构已固定了,因为它是一个软件的数据库来的,不可以随便更改的,从数据结构看,你给我看到的是唯一规则是:CODE字段.endflag    末级标志到了第三层就为TRUE,明显这个软件是三层树的.