数据库中只有两个字段:
cCode     cName
01         世界
0101       亚洲
010101     中国
01010101   北京
01010102   上海
010102     日本
01010201   东京
01010202   北海道
0102       欧洲
010201     西班牙
01020101   巴塞罗那
01020102   马德里
在TreeView中生成下面的格式:
01:世界
  0101:亚洲
      010101:中国
             01010101:北京
             01010102:上海
      010102:日本
             01010201:东京
             01010202:北海道
  0102:欧洲
      010201:西班牙
             01020101:巴塞罗那
             01020102:马德里
并且可以根据新文本框中输入的内容可以将新内容添加到数据库中,并在TreeView中显示,
而且可以对点选到的节点进行编辑,并且可以对点选到的节点进行编辑和添加同级及下级节点,
但是根节点'01:世界'需无法添加同级节点,只能添加下级节点,最底层的孩子节点例如
'01020101:巴塞罗那'只能添加同级节点而不能添加下级节点。高手们来看看啊,自己写了写,总是有问题。向大家请教。系统限制帖子最高只能给到100分,请大家见谅。

解决方案 »

  1.   

    好像是字符截取 判断长度和INDEX 然后添加吧
      

  2.   

    数据库是怎么一个结构,发来看下.根据新文本框中输入的内容可以将新内容添加到数据库中,并在TreeView中显示-----这个应该是每次要刷新一下树的.
      

  3.   


    我在问题一开始就把数据库结构给出了,两个字段,cCode,cName
      

  4.   


    procedure BuildTree(TreeView: TTreeView; Query: TADOQuery);
    var
      I: Integer;
      PNodes: array[0..1024] of TTreeNode;                   //最多级别
      PID: String;
      ALevel: Integer;
    begin
      TreeView.Items.Clear;
      for I := Low(PNodes) to High(PNodes) do PNodes[I] := nil;
      PNodes[0] := TreeView.Items.AddFirst(nil,'货品类别');  with Query, TreeView, Items do
      begin
        Close;
        Open;
        BeginUpdate;
        try
          while not Eof do
          begin
            Application.ProcessMessages;
            PID := FieldByName('Code').AsString;
            ALevel := Length(PID) div 2;  //以两位为一个级别
            if ALevel - 1 > High(PNodes) then Continue;
            PNodes[ALevel] := AddChild(PNodes[ALevel-1],FieldByName('Code').AsString + '.' + FieldByName('Name').AsString);
            Next;
          end;
        finally
          EndUpdate;
          Close;
        end;
      end;
    end;
      

  5.   


    procedure BuildTree(TreeView: TTreeView; Query: TADOQuery);
    var
      I: Integer;
      PNodes: array[0..1024] of TTreeNode;                   //最多级别
      PID: String;
      ALevel: Integer;
    begin
      TreeView.Items.Clear;
      for I := Low(PNodes) to High(PNodes) do PNodes[I] := nil;
      with Query, TreeView, Items do
      begin
        Close;
        Open;
        BeginUpdate;
        try
          while not Eof do
          begin
            Application.ProcessMessages;
            PID := FieldByName('Code').AsString;
            ALevel := Length(PID) div 2;  //以两位为一个级别
            if ALevel - 1 > High(PNodes) then Continue;
            PNodes[ALevel] := AddChild(PNodes[ALevel-1],FieldByName('cCode').AsString + '.' + FieldByName('cName').AsString);
            Next;
          end;
        finally
          EndUpdate;
          Close;
        end;
      end;
    end;添加的时候做一下判断,可以根据Items.Level来判断,如果为0的话,就不能增加同级,
    如果是3的话,就是最后一级就不能增加下一级.
    增加时要做两个动作,一个是增加到数据库,另外一个通过AddChild增加到TreeView记得要根据cCode排序.
      

  6.   

    這個像是我原來去的一家公司的考題,呵呵。按照你給的要求,我的思路是:看你給的cCode是兩位一組,如从数据库生成,你把他的長度div2,就知道他是哪层的了,copy(cCode,1,length(cCode)-2)和誰相等就是哪個节点下面的,長度=8時(最后一层),就不能添加子节点,長度等于2(第一层)不能添加兄弟节点。cCode的生成好像是treeview的index,format后拼接成的。至于添加和修改我把代碼給出來了,不是很好,參考吧
    添加:(沒涉及第一层和最后一层的問題)
    if treeview1.Selected<>nil then
        treeview1.Items.AddChild(treeview1.Selected,edit1.text)
      else
        treeview1.Items.Add(nil,edit1.Text);
      treeview1.Selected:=nil;
    修改:
    treeview1.Selected.Text:=edit1.Text
    你比我聰明多了,我原來想的是兩字段,cName和tName,cName存自己的名字,tName存父节点的名字,兩個相同時,就是是根节点,然后一层层遍立的,你的方法比我的好多了。呵呵。
      

  7.   

    考虑效能问题,将记录放入数组当中,然后用递归,在递归中分解字符串得也结点层级.数量量大时不要在DATASET反复查找.
      

  8.   

    To:chenzhuo(灼)
      请问
      for I := Low(PNodes) to High(PNodes) do PNodes[I] := nil;
      这句是在做什么操作?将所有的PNodes赋空值?
      

  9.   

    1.select
      查询是按cCode,len(cCode)排序
      

  10.   

    由于PNodes是局部变量,所以要对他进行初始化.