原来设计四个字段:ID,key,up_key,level解释:ID  -  主键
      key  -  节点关键字
      up_key  -  父级节点关键字
      level  -  级数发现操作很不方便。因为当我想要增加一个节点,就定义level,然后在level-1层里面寻找父级关键字(而不是ID,因为ID不够直观,操作不方便),但是父级关键字可能重复,这时候我需要通过ID来唯一识别他的父级节点,或者再往上溯(总有不重复的父级节点,否则无意义),这样操作很不方便。请问有没有更加好的结构?或者算法?

解决方案 »

  1.   

    你可以看一下我的贴子,共同进步!
    http://community.csdn.net/Expert/topic/3104/3104644.xml?temp=.373562
      

  2.   

    (*//
    标题:数据集处理成可视树
    说明:处理父节点标识字段、节点文本字段、节点标识字段这种表结构
    设计:Zswang
    日期:2002-05-20
    支持:[email protected]
    //*)///////Begin Source
    function DataSetToTreeNode(mDataSet: TDataSet;
      mFieldNameParent: string; //父节点标识字段名
      mFieldNameTreeText: string; //节点文本字段名
      mFieldNameTreeId: string; //节点标识字段名
      mTreeView: TTreeView; mTreeNode: TTreeNode;
      mParentText: string): Boolean;
    var
      vTreeNode: TTreeNode;
      vFieldValues: Variant;
      vFieldNames: string;
    begin
      Result := False;
      if not Assigned(mDataSet) then Exit;
      if not Assigned(mTreeView) then Exit;
      if not mDataSet.Active then Exit;
      vFieldNames := Format('%s;%s;%s',
        [mFieldNameParent, mFieldNameTreeText, mFieldNameTreeId]);
      mDataSet.Filtered := False;
      mDataSet.Filter := Format('%s=%s', [mFieldNameParent, QuotedStr(mParentText)]);
      mDataSet.Filtered := True;
      if mDataSet.RecordCount = 0 then Exit;
      mDataSet.First;
      while not mDataSet.Eof do begin
        vTreeNode := mTreeView.Items.AddChild(mTreeNode,
          mDataSet.FieldByName(mFieldNameTreeText).AsString);
        vFieldValues := mDataSet[vFieldNames];
        DataSetToTreeNode(mDataSet, mFieldNameParent, mFieldNameTreeText,
          mFieldNameTreeId, mTreeView, vTreeNode,
          mDataSet.FieldByName(mFieldNameTreeId).AsString);
        ///////Begin 恢复位置
        mDataSet.Filtered := False;
        mDataSet.Filter := Format('%s=%s', [mFieldNameParent, QuotedStr(mParentText)]);
        mDataSet.Filtered := True;
        mDataSet.Locate(vFieldNames, vFieldValues, []);
        ///////End 恢复位置
        mDataSet.Next;
      end;
      Result := True;
    end;
    ///////End Source///////Begin Demo
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      TreeView1.Items.Clear;
      DataSetToTreeNode(Table1, 'up_key', 'key', 'key',
        TreeView1, nil, 'NULL');
    end;
    ///////End Source
      

  3.   

    我一般是这样定义的:
    FID                 节点编号
    FParent             父节点ID
    FChildCount         子节点个数
    Flevel              同节点位置
    .......