【问题标题】:how to expand only to the second level of the treeview如何仅扩展到树视图的第二级
【发布时间】:2015-02-06 04:24:14
【问题描述】:

例如:

- 链接 1 -- 链接 1.1 --- 链接 1.1.1(仅限) ---- 链接1.1.1.1(不展开) -- 链接 1.2 --- 链接 1.2.1(仅限) ---- 链接1.2.1.1(不展开)

我只能展开链接 1.1,链接 1.2...如何?

【问题讨论】:

  • 您应该始终将通用的delphi 标签添加到您与delphi 相关的问题中,以获得正确的语法高亮显示并更多地关注您的问题。

标签: delphi treeview delphi-xe6


【解决方案1】:

没有用于在特定级别扩展多个项目或项目的内置功能,因此没有其他方法可以遍历这些项目。对所有二级项目调用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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    相关资源
    最近更新 更多