没有用于在特定级别扩展多个项目或项目的内置功能,因此没有其他方法可以遍历这些项目。对所有二级项目调用Expand 方法。以及所有第一级项目,否则不会显示第二级项目。它的Recurse 参数应该是False,以免扩展可能的第三层或更深的层次。
有两种方法可以遍历 TreeView 的项:按项索引和按节点。通常,对 TreeView 项目的操作最好由 Node 完成,因为 Items 属性的 getter 遍历 所有项目 以找到具有特定索引的单个项目。但是,TTreeNodes 缓存了最后检索到的项目,因此通过将循环索引增加 1,可以将危害降至最低。
那么简单的解决方案就变成了:
procedure ExpandTreeNodes(Nodes: TTreeNodes; Level: Integer);
var
I: Integer;
begin
Nodes.BeginUpdate;
try
for I := 0 to Nodes.Count - 1 do
if Nodes[I].Level < Level then
Nodes[I].Expand(False);
finally
Nodes.EndUpdate;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ExpandTreeNodes(TreeView1.Items, 2);
end;
请注意,Items 属性的 getter 仍会被调用两次。尽管有缓存机制,但我认为仍然应该避免这种情况:
procedure ExpandTreeNodes(Nodes: TTreeNodes; Level: Integer);
var
I: Integer;
Node: TTreeNode;
begin
Nodes.BeginUpdate;
try
for I := 0 to Nodes.Count - 1 do
begin
Node := Nodes[I];
if Node.Level < Level then
Node.Expand(False);
end;
finally
Nodes.EndUpdate;
end;
end;
但是你不妨使用:
procedure ExpandTreeNodes(Nodes: TTreeNodes; Level: Integer);
var
Node: TTreeNode;
begin
Nodes.BeginUpdate;
try
Node := Nodes.GetFirstNode;
while Node <> nil do
begin
if Node.Level < Level then
Node.Expand(False);
Node := Node.GetNext;
end;
finally
Nodes.EndUpdate;
end;
end;
这仍然会遍历所有项目。好的,就一次。但是,如果您有一个非常大和/或深的树,并且您想要最大效率,并且您不关心可读性,或者您只是想尝试使用 TreeView 的节点以获得乐趣,那么请使用:
procedure ExpandTreeNodes(Nodes: TTreeNodes; Level: Integer);
var
Node: TTreeNode;
Next: TTreeNode;
begin
if Level < 1 then
Exit;
Nodes.BeginUpdate;
try
Node := Nodes.GetFirstNode;
while Node <> nil do
begin
Node.Expand(False);
if (Node.Level < Level - 1) and Node.HasChildren then
Node := Node.GetFirstChild
else
begin
Next := Node.GetNextSibling;
if Next <> nil then
Node := Next
else
if Node.Level > 0 then
Node := Node.Parent.GetNextSibling
else
Node := Node.GetNextSibling;
end;
end;
finally
Nodes.EndUpdate;
end;
end;