譬如说我现在已经用treeview成了一颗关于地区的树,树型结构如下:所有地区   中国
       浙江省
       广东省
       江苏省
       安徽省
   
  杭州
       萧山区
       余杭区
       临安区
       桐庐县
现在我要解决在成这样的树的时候,自动给地区编码存入数据库,例如中国就自动编码为1.,下挂的浙江省编为1.1.,广东省编为1.2.,类似的杭州编为2.,萧山区编为2.1.,余杭区编为2.2.,以次类推,相信我的意思大家都明白了吧。
我现在这颗树已经可以生成了,但是自动给它们赋编码还没有实现,当然在界面录入的时候自动填上去,然后代码里加上个order by 就可以实现了,但是始终违背了我的初衷,这个编码不能自己填,要自动生成,我心里有点想法,但是组织不起来,希望借CSDN把这个问题给解决了,解决的我送高分,提出好的建议和意见的我也酌情给分,关键是要快点,我已经被他烦了一个星期了,都是半途而废,最好能有赋上代码,谢谢。

解决方案 »

  1.   

    当加入数据的时候,就找到当前所加数据的父自动编码,在其基础上+.1就行了。。
    再主瓣清楚点,你在程序加一个字段为INT记录,当前数据的相同的父ID数据是否>1一条如果>1
    那么你就要找出当前数据的相同的父ID+max(自动+1 ID)在其加入的int字段+1
    update set 自动编码 = 上一层父ID的自动编码+.int字段+1, int字段 = int字段+1
    这样你应该有些思路了吧?
      

  2.   

    楼上的,我有点思路了,你说的是再插入数据的时候,查询最大的父亲节点的编码,然后再判断相同父亲节点上是否已经存在子节点了,如果存再,就找到最大的那个子节点,然后update,看你的好吃力,呵呵,我也读的不是很通顺,我觉得查询当前最大的节点这个步骤肯定要做,然后解决对他进行再次超作对吗?
      想看看其他人什么个思路,最好语句连贯些,哈哈,我语文学的不好啊。。
      

  3.   

    关键是看你的数据表结构是如何设计的, 具体的处理方法会不同的, 建议编号设成id, parentid两个,你要求的格式只在显示时处理, 没必须在数据表中如此表示
      

  4.   

    我发了两次,都应内容过长...。好现在简短点。
      数据结构:id,iparent,text,...
      主要控件:TADOTable
                TTreeView
      自定义对象:NodeData--TTreeView节点对象的数据:id,iparent  
      编程要点:根据父节点,递归查询旗下所有子节点,并插入TreeView,写入NodeData
      

  5.   

    我有个完整的TTreeViewDu控件(用C++builder实现的),已经用在产品上。本想直接给你一些代码,拉上就Ok.但想到您所学Delphi,反而会给你添麻烦。
      

  6.   

    一下给你说也说不清,我有实例QQ:195469949 注明CSDN
    有很多种实现方法,并且列表可以自动装入
    可以把STATE INDEX属性指定为你要的编码值,也可以用1stClass中的fcDBTreeView来实现
      

  7.   

    呵呵,其实这个实现在我现在的这个单位里的软件中已经实现了,但是我去看他们写的代码,我看了以后自己试不出来,只是把树给形成了,但是自动赋编码还是看不懂。
    采用的是oracle数据库,我组长建的表结构是这样的:
    列名  数据类型     允许空  默认值   备注
    YEAR   Number(4)                  年度
    EID    Varchar2(42)                单位编码  
    ID1    Number(6)      √     0      一级单位编码 
    ID2    Number(6)      √     0      二级单位编码
    ID3    Number(6)      √     0      三级单位编码 
    ID4    Number(6)      √     0      四级单位编码
    ID5    Number(6)      √     0      五级单位编码 
    ID6    Number(6)      √     0      六级单位编码
    NAME   Varchar2(60) √     ''      名称
    CODE   Varchar2()60   √     ''      简码(如汉语拼音首字母等)
    Dorder  Number(6)   √             单位显示顺序
    isleaf  Number(60)  √     1       0为非底级单位,1为底级单位
    PEID    Varchar2(42)√             父级单位编码
      

  8.   

    我再顶上来,最近在看dll的东西,把这个给忘了,大家再帮我看看啊,我给出表了。
      

  9.   

    编码不能自己填A?那你又以什么来排列他们的顺序?
    比如:中国
             上海
             江苏
             广东
    你想如何排列,是上海排先,还是广东排先。我看了你的表字段,根本不用加入下列的字段
    ID1    Number(6)      √     0      一级单位编码 
    ID2    Number(6)      √     0      二级单位编码
    ID3    Number(6)      √     0      三级单位编码 
    ID4    Number(6)      √     0      四级单位编码
    ID5    Number(6)      √     0      五级单位编码 
    ID6    Number(6)      √     0      六级单位编码
    用增长字段f_item(唯一)来代表一个地方,用F_pitem来代表其父字段ITEM号。然后在程序中用order by f_pitem,f_item就行了。如果你真的想在程序中加入代码(分长代码和短代码),也是可以的。最好是在数据库中新增字段f_shortcode,f_longcode,这样就灵活多了
    http://www.hz0752.com/UploadFile/2005-5/200552415463927.jpg
    http://www.hz0752.com/UploadFile/2005-5/2005524155546821.jpg
      

  10.   

    有时去看看金蝶的基础资料那个块,写得很精典。如果你真的想自增长ITEM,可以在触发器中写,先判断新增的节点属于那个父树ITEM,然后查出该父子节点的ITEM的最大值是多少,接着再declare @maxint=父树的最大子节点的ITEM值 ,最后set @maxint+1     Node := TreeView.Items.AddChildObjectFirst(TTreeNode(List.Objects[Index]),
          Query.FieldByName('F_Content').AsString+'(长代码:'+
             Query.FieldByName('F_Longcode').AsString+')', query.GetBook)图例:http://www.hz0752.com/UploadFile/2005-5/2005524155546821.jpg
      

  11.   

    编码当然要自动生成了,而且又顺序的,如果在界面上自己录的话就没意思了,而且很乱。
    编码一定要自动生成的。最近有点忙,没空解决这个问题,大家积极发言啊,我都一一在试了,唉,没好好学编程啊。。如果你有这方面的资料也可以传给我看看的,我的QQ29216551,MSN:[email protected],聊什么都可以,人生,事业,工作,情感,积极向上的就行,谢谢。
      

  12.   

    {---------------
    中国
    上海
    四川
    北京
    海淀
    朝阳
    美国
    加州
    佛罗里达------------------
    中国:1
    上海:1.0
    四川:1.1
    北京:1.2
    海淀:1.2.0
    朝阳:1.2.1
    美国:2
    加州:2.0
    佛罗里达:2.1
    ----------------}
    procedure TForm1.GenTreeCode(TreeNode:TTreeNode;Code:string);
    var i:integer;
        s:string;
        cCode:string;
    begin
      s:=format('%s:%s',[TreeNode.Text,Code]);
      memo1.Lines.Add(s);
      for i:=0 to TreeNode.Count-1 do
      begin
        cCode:=format('%s.%d',[Code,i]);
        GenTreeCode(TreeNode.item[i],cCode);
      end;
      if TreeNode.Parent=nil then
        if TreeNode.getNextSibling<>nil then
            GenTreeCode(TreeNode.getNextSibling,Inttostr(StrToInt(Code)+1));
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
        GenTreeCode(Treeview1.TopItem,'1');
        treeview1.SaveToFile('c:\aa.txt');
    end;
      

  13.   

    下面是一个例子。自增长ITEM号。可以灵活变换成你需要的效果CREATE TRIGGER ins_item_baseinfo ON dbo.t_baseinfo
    FOR insert
    AS
    declare @maxint int,@longcode varchar(20),@fatherid int,@caption varchar(30),@para varchar(20)
    select @maxint=max(f_item) from T_baseinfo
    update a  set a.f_item =@maxint+1  from T_baseinfo a ,inserted i
    where a.f_interid=i.f_interid表的图例如下
    http://www.hz0752.com/UploadFile/2005-5/200553020827281.jpg再多的你自己想一想吧。其实都很简单
      

  14.   

    不是将这个树画出来,而是将编码写到数据库中去,我用的是oracle817。
    打个比方:我在界面中录入中国,程序执行后自动给它赋编码,比如说是1.
              然后在中国下级有浙江,浙江自动编为1.1.,存放在数据库中,字段为AID
              我一共给出了三级编码,ID1,ID2,ID3,像刚才的中国,ID1=1,ID2=0,ID3=0,
              像浙江,ID1=1,ID2=1,ID3=0,类推,也就是查询数据库得到以下:
            
              NAME     AID       ID1     ID2    ID3
              中国      1.         1      0      0
              浙江      1.1.       1      1      0
      

  15.   

    你这个树的数据结构太死了。不应该这样写的
    我已经将例表数据放在网上了。你自己看吧。http://www.hz0752.com/UploadFile/2005-5/200553020827281.jpgQQ:33877204