我是这样创建表的,也不知对否. 请问如何实现如下的形式呢 可以无限级的增加删除,请指教
create table yp_type
(type_id nvarchar (20)  NOT NULL ,
 type_name nvarchar(100) not null,
 parent_id int null-- 父ID
CONSTRAINT pk_yp_type_type_id  PRIMARY KEY (type_id))
 例如: 江西省 
    九江市
       星子县
           乐观镇
    南昌市
       新建县 广东省
    深圳市
      .
      .
      .

解决方案 »

  1.   

    字段
    id  pid namepid就是上级id
      

  2.   

    到www.2ccc.com找,有许多例子可以参考。
      

  3.   

    最好设置两个数据表,关联一下,再treeview中编程分别从对应表中取数据显示
      

  4.   

    你要把数据显示在什么地方如果使用数据控件显示的话,很简单,控件有dxdbtreelist,cx系列的等等,只需要设置keyid,和parentid就可以了表结构
    字段 
    id  pid name pid就是上级id
      

  5.   


    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[PlaceName]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[PlaceName]
    GOCREATE TABLE [dbo].[PlaceName] (
    [Code] [varchar] (6) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [ShortName] [varchar] (2) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [Province] [varchar] (16) COLLATE Chinese_PRC_CI_AS NULL ,
    [City] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [Place] [varchar] (30) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [Class] [varchar] (2) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [Postalcode] [varchar] (6) COLLATE Chinese_PRC_CI_AS NULL ,
    [ZoneLetter] [varchar] (5) COLLATE Chinese_PRC_CI_AS NULL 
    ) ON [PRIMARY]
    GO
    上面是以前搞过的一个全国地名库,如果想以树形式显示的话,最好加上ID和PID字段
      

  6.   

    同意bdmh, 数据库中至少三个字段:ID, PID, NAME.
      

  7.   

    001       001         江西省
    002       002         湖南省
    003       001001 九江市
    004       001002 南昌市
    005       003 广东省
    006       003001        深圳市
    007       003002 汕头市
    008       003002001 XX县
    009       003002001001 XXX镇
      
    江西省
        九江市
        南昌市
    湖南省
    广东省
         深圳市
         汕头市
              XX县
                XXX镇怎么用treeview显示成如上所示的效果呢???
      

  8.   

    字段
    prv_id   treeparent  prv_name001      001         江西省 
    002      002         湖南省 
    003      001001 九江市 
    004      001002 南昌市 
    005      003 广东省 
    006      003001        深圳市 
    007      003002 汕头市 
    008      003002001 XX县 
    009      003002001001 XXX镇 
      
    江西省 
        九江市 
        南昌市 
    湖南省 
    广东省 
        深圳市 
        汕头市 
            XX县 
                XXX镇 怎么用treeview显示成如上所示的效果呢???
      

  9.   

    可以用第三方控件的dbtreeView 设置ParentField 和显示字段后就可以达到这个效果
      

  10.   

    建的表好像也有问题 parent_id int null-- 父ID 和 type_id nvarchar (20)  NOT NULL 两个字段类型不一致
      

  11.   

    我这里有个例子,你不如看看!http://topic.csdn.net/u/20090106/22/d8c30445-9d94-490b-9181-f4fb5258c99b.html我总结了一下,还是用递归的方法procedure TForm1.SetTreeView(atreenode: TTreeNode; aIndex: string);
    var
      adoquery: TAdoquery;
      temp: TTreeNode;
    begin
      adoquery := TAdoquery.Create(nil);
      try
        with adoquery do
        begin
          Connection := self.ADOConnection1;
          close;
          sql.Clear;
          sql.Add('select * from list1 where lastbh = '''+aIndex+''' ');
          open;
          while not eof do
          begin
            temp := treeview1.Items.AddChild(atreenode,adoquery.FieldByName('cname').AsString);
            SetTreeView(temp,adoquery.FieldByName('bh').AsString);
            next;
          end;
        end;
      finally
        adoquery.Free;
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      SetTreeView(nil,'0');
      treeview1.FullExpand;
    end;
      

  12.   

    // 下面的代码很好,仔细研读后给分吧function tyDumpToTree(ptv:TTreeView;pActiveDSet:TDataSet;pCaption,pCodeFldName,pTextFldName1:String;
                          const pTextFldName2:String='';const pDefFormat:String='333'):Integer;
    const cMaxLevel = 10; // 最多级数
    var
      MyNode:array[0..cMaxLevel] of TTreeNode;
      myLevel:array[1..cMaxLevel] of Byte;
      viI,Level:Integer;
      vsFormat,NowID,ShowTxt:String;
      vbB:Boolean;
     function GetLevel(sCode:String):Integer;
     var vii,viLevel,viLen:Integer;
     begin
       viLevel := -1; //如果代码不符合标准,则返回-1
       viLen   := Length(sCode);
       if viLen > 0 then
       for viI := 1 to cMaxLevel do
       if viLen <= mylevel[viI] then begin
          vilevel := vii;
          break;
       end;
       Result := viLevel;
     end;
    begin
      Result := 0;
      with pActiveDSet do
      if Active then begin
         vsFormat := pDefFormat; // 默认分级格式
         First;
         if Locate(pCodeFldName,'+1',[]) then begin
            vsFormat := Trim(Fieldbyname(pTextFldName1).AsString);
            Next;
         end;
         viI := strToIntDef(vsFormat,-1);
         if viI < 0 then vsFormat := '333'; // 默认分级格式
         fillchar(myLevel,sizeof(myLevel),0);
         Level := 0;
         for vii := 1 to Length(vsFormat) do begin
           Level := Level + StrToInt(vsFormat[vii]);
           if viI <= cMaxLevel then
              myLevel[viI] := Level;
         end;
         ptv.Items.Clear;
         // 以下是增加第一项
         Level := 0;
         if Length(pCaption) > 0 then begin
            MyNode[0] := ptv.Items.Add(ptv.TopItem,pCaption);
            // MyNode[0].ImageIndex := 0;
            // MyNode[0].SelectedIndex := 0; // 处理图标
         end
         else
            MyNode[0] := nil;
         // 以上是增加第一项
         vbB := Len(pTextFldName2) > 0; // 有否第二显示字段
         While Not Eof do begin
           NowID := Trim(FieldByName(pCodeFldName).AsString);
           if vbB then
              ShowTxt := Format('[%S]%S<%S>',[NowID,FieldByName(pTextFldName1).AsString,FieldByName(pTextFldName2).AsString])
           else
              ShowTxt := Format('[%S]%S',[NowID,FieldByName(pTextFldName1).AsString]);
           Level := GetLevel(NowID); // 返回代码的级数
           // 以下是增加子项
           if Level > 0 then begin //确保代码符合标准
              if Level = 1 then // 重新开始一个分类
                 for viI := 1 to cMaxLevel do MyNode[viI] := nil;
              if (Level = 1) or (MyNode[Level-1] <> nil) then begin
                 MyNode[Level] := ptv.Items.AddChild(MyNode[Level-1],ShowTxt); // 以下用上一级节点为父节点添加子节点
                 // MyNode[Level].ImageIndex:=1;
                 // MyNode[Level].SelectedIndex:=2; // 处理图标
              end;
           end;
           //以上是增加子项
           Next;
         End;
         if MyNode[0] <> nil then
            MyNode[0].Expand(False);//将首节点展开
      end;
    end;
      

  13.   

    1、广度优先
    2、如果数据量不大,建议用dataset的过滤,而不是用重复查询,内存操作,数据更快
    3、tv.items.beginupdate,... .endupdate.http://www.delphibbs.com/delphibbs/dispq.asp?lid=1508737
      

  14.   


    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;
      

  15.   

    看看myy这个巧妙的办法,效率比用递归和广度优先算法效率要高
    http://blog.csdn.net/myy/archive/2004/10/09/129886.aspx
      

  16.   

    你看看这个部门树形结构:
    http://117.21.247.37/cbx/AppSvr.dll/Demo.ao
    这是基于CBX框架开发的SmartClient程序。
      

  17.   

    CBX RIA框架几乎是国产多Delphi层框架中最好的一个,同时体现SmartClient和RIA思想。 
    CBX RIA Demo(需要客户端初始化): http://117.21.247.37/cbx/AppSvr.dll/Splash.ao
    有关CBX RIA的评论:http://www.firebird.net.cn/forum_view.asp?forum_id=2& view_id=2251
    刚创建的CBX RIA讨论区
    http://www.firebird.net.cn/forum_list.asp?forum_id=11

    CBX RIA案例:
    http://www.firebird.net.cn/forum_list.asp?forum_id=12
    CBX RIA QQ群
    主讨论群:53623431(已满)
    第二群:16169282(已满)
    第三群:63756040
    第四群:64740999
    第五群:511572126CBX的作品: