大虾们,请快帮帮小妹,急诊!(关于treeview,在线等待!!!) (50分)

  • 主题发起人 主题发起人 bluesea_sky
  • 开始时间 开始时间
和我的BOM做法一样,只是不知你为什么一次要在Treeview显示出来。完全没必要,数据可以在需用时才取的。
换句话说,可以在TreeViewExpanding时再加进来的。
 
to rester
我要的效果就是一次性全部加入,我还要用dbgrid来显树上每一项详细内容(在树还没有展开的时候)。
你有什么高招吗?
 
to JohnsonGuo
请你给我一些济注解!!!!!多谢!!
 
procedure TForm1.FillTree(Node: TTreeNode);
var
Child, Temp: TTreeNode;
begin
with Query1 do begin
if not Assigned(Node) then //如果是树根节点,那么读取Parent值作为根节点
SQL.Text := 'Select Distinct Parent As Child From test1'
else begin //如果是非根节点,那么根据当前父节点确定其子节点
SQL.Text := 'Select Child From test1 '
+ 'Where Parent = :Parent';
ParamByName('Parent').AsString := Node.Text;
end;

Open;
try //通过循环添加当前父节点的所有子节点(不包括子节点的子节点)
First;
while not Eof do begin
TreeView1.Items.AddChild(Node, FieldByName('Child').AsString);
Next;
end;
finally
Close;
end;

//通过递归添加子节点的子节点
if Assigned(Node) then Child := Node.GetFirstChild
else Child := TreeView1.Items[0];
while Assigned(Child) do begin
//注意:这段代码用于删除重复节点,而且它将会极大影响速度,原因是
//很难通过表中直接知道哪些节点是真正的根节点,哪些节点是非根节点,
//所以不得不先把真假根节点加入,然后再在删除之。有两个解决方法
//可以提高效率:1。在建树前,另外写一段代码来确定真根节点;2。在
//在数据表中添加入一条特殊的记录,如:-1 101,然后修改上面处理根
//节点的SQL语句,可以达到快速的理想效果,但这显然是用空间换取时间
//的方法,自己看着办吧。
if Assigned(Node) then begin
Temp := TreeView1.Items[0];
while Assigned(Temp) do begin
if Temp.Text = Child.Text then begin
Temp.Delete;
Break;
end;
Temp := Temp.GetNextSibling;
end;
end;

//递归
FillTree(Child);
Child := Child.GetNextSibling;
end;
end;
end;

procedure TForm1.FormClick(Sender: TObject);
begin
FillTree(nil);
end;

 
已经添加了注解。
 
我的解决方法是数据表结构为
id,name,parent,.....其中的parent肯定为其中一个id,注意的是id不能重复,为关键字
在添加节点的时候用adodataset如
type
pid=^tid;
Tid=record
id:integer;
end;

....
var
p:pid;//用来标志节点的data属性
Tv:TTreeview;
node1,node2:TTreenode;
.....
dsado.commandtext:='select id,name,parent from tb order by parent,id';
dsado.open
.....
//循环加入节点
repeat
new(p);
name:=dsado.fieldbyname('name').astring;
p^.id:=dsado.fieldbyname('id').asinteger;
parent:=dsado.fieldbyname('parent').asinteger;
//查找父节点
node2:=nil;
for i:=Tv.items.count-1 downto 0 do
begin
node1:=Tv.items;
if ((pid(node1.data)^.id)=parent) then
begin
node2:=node1;
break;//找到父亲,退出循环
end;//end begin
end; //end for
Tv.items.addobject(node2,name,p);//加入节点
dsaado.next;
until dsado.eof;

 
好了,大家辛苦了!这个问题已经解决,我很公平的,按劳分配,谁功劳大,
谁就得分多,大家没意见吧!!!下次有难,还请大家多相助,在此谢了!!!!
 
bluesea_sky,你好,请问你是怎样实现的,能不能告诉我以下。谢谢!!!
pacific66@xinhuanet.com
 
后退
顶部