原来设计四个字段:ID,key,up_key,level解释:ID - 主键
key - 节点关键字
up_key - 父级节点关键字
level - 级数发现操作很不方便。因为当我想要增加一个节点,就定义level,然后在level-1层里面寻找父级关键字(而不是ID,因为ID不够直观,操作不方便),但是父级关键字可能重复,这时候我需要通过ID来唯一识别他的父级节点,或者再往上溯(总有不重复的父级节点,否则无意义),这样操作很不方便。请问有没有更加好的结构?或者算法?
key - 节点关键字
up_key - 父级节点关键字
level - 级数发现操作很不方便。因为当我想要增加一个节点,就定义level,然后在level-1层里面寻找父级关键字(而不是ID,因为ID不够直观,操作不方便),但是父级关键字可能重复,这时候我需要通过ID来唯一识别他的父级节点,或者再往上溯(总有不重复的父级节点,否则无意义),这样操作很不方便。请问有没有更加好的结构?或者算法?
http://community.csdn.net/Expert/topic/3104/3104644.xml?temp=.373562
标题:数据集处理成可视树
说明:处理父节点标识字段、节点文本字段、节点标识字段这种表结构
设计: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
FID 节点编号
FParent 父节点ID
FChildCount 子节点个数
Flevel 同节点位置
.......