tdataset转到树型,不使用filter,怎样写? 表字段为id, parentid, caption ( 积分: 200 )

H

hsgrass

Unregistered / Unconfirmed
GUEST, unregistred user!
// filter的时候使用ado,bde,和clientdataset都正确但使用kbmmemtable的时候不正确,因为它的setrecno在FILTER的时候设置recno不正确.5.51版本的.
有没有其它办法不使用filter而建立树?不修改表结构的情况下
谢谢
procedure createtree(ds: tdataset;
nodes: ttreenodes;
rootnode: ttreenode);
var
i: integer;
n: ttreenode;
fl: string;
begin
if ds.IsEmpty then
exit;
fl := ds.Filter;
ds.Filter := format('parentid = %d', [ds.FieldByName('mainmenu_id').AsInteger]);
for i := 1 to ds.RecordCountdo
begin
form1.mmo1.Lines.Add(format('reccount=%d, filter=%s', [ds.RecordCount, ds.Filter]));
ds.RecNo := i;
n := nodes.AddChild(rootnode, ds.fieldbyname('caption').AsString);
createtree(ds, nodes, n);
end;
ds.Filter := fl;
end;
 
顶,主要问题还是kbm在使用filter的时候setrecno不正确...
现在想用其它方法实现建树......
 
用cxtreelist控件,
 
哦,我都不知道有Filter这个用法,我是自己使用递归的方法来建树的。就是使用id和pid逐级把树建立起来。因为是自己手动建,所以基本就与数据库无关了。
这是以前写的,不知是否能够帮到你[:D]
procedure TSQLTree.AddSubNode( Node : TTreeNode;PID:integer);
Var
i,j : integer;
Len : integer;
ID_Array : Array of Integer;
SubNode : TTreeNode;
SubPID : integer;
S_Array : Array of String;
begin
{------------Find who's PID is givn PID--------}
FindPID(PID);
Len := FADQ.RecordCount;
SetLength(ID_Array,Len);
SetLength(S_Array,Len);
{-----------Save ID to Buffer----------}
for i := 0 to Len-1do
begin
ID_Array := FADQ[FID];
S_Array := FADQ[FTitle];
FADQ.Next;
end;

{-------------Recursion----------------}
for i := 0 to Len-1do
begin
SubNode := FTV.AddChildObject(Node,S_Array,Pointer(ID_Array));
AddSubNode(SubNode,ID_Array);
end;

end;
 
谢谢阿, 我看看先,
表里面是先按PARENTID排序(asc) 然后建树,
好像是按层遍历........
 
嗯,我也有一个字段专门标记树的顺序。
 
/////// 在delphibox上有一个建树测试的程序, 参考它的方法比较容易理解,
to: 创意人生
{------------Find who's PID is givn PID--------}
FindPID(PID);
// 我理解这段是过滤出相同parentID的记录吧, 这个用什么过滤?
// 先给分吧
procedure TForm1.FormCreate(Sender: TObject);
begin
kbmmemtable1.LoadFromDataSet(qry1, [mtcpoStructure]);
end;

procedure CreateTree(ds: tdataset;
nodes: ttreenodes);
var
root: ttreenode;
n, tn: ttreenode;
list: tstringlist;
s, id: string;
idx: integer;
begin
list := tstringlist.Create;
try
ds.First;
root := nodes.Add(nil, 'Root');
list.Addobject(ds.fieldbyname('mainmenu_id').AsString, root);
ds.Next;
while not ds.Eofdo
begin
id := ds.FieldByName('mainmenu_id').AsString;
idx := list.IndexOf(ds.FieldByName('ParentID').AsString);
if idx >= 0 then
// if find parent
begin
n := nodes.addchild(ttreenode(list.Objects[idx]), ds.fieldbyname('caption').AsString)
end else
begin
nodes.AddChild(root, ds.fieldbyname('caption').AsString);
end;
list.Addobject(id, n);
ds.Next;
end;
finally
list.Free;
end;
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
tv1.Items.Clear;
CreateTree(kbmMemTable1, tv1.Items);
end;
 
谢谢了。
就是一段SQL语句:
function TSQLTree.FindPID(Value: integer):boolean;
begin
Result := True;
Try
with FADQdo
begin
close;
SQL.Clear;
SQL.Add(Field_Select+' test where '+FPID+' =:I_Value order by priority');
parameters.ParamByName('I_Value').Value := Value;
open;
end;
Except
result := False;
end;
end;
 
顶部