delphi - 如何使用 "levels"填充基于平面列表的 TreeView ?

标签 delphi treeview hierarchy

我有一个从第三方项目文件填充的对象列表。该文件的设计方式是使每个项目都位于层次结构的“级别”上。因此第一个项目位于级别 0,其所有子项目位于级别 1,依此类推。

举个例子:

  1. Node 1     (Level 0)
  2. Node 1.1   (Level 1)
  3. Node 1.2   (Level 1)
  4. Node 1.3   (Level 1)
  5. Node 1.3.1 (Level 2)
  6. Node 1.4   (Level 1)
  7. Node 2     (Level 0)
  8. Node 2.1   (Level 1)
  9. Node 2.1.1 (Level 2)
 10. Node 3     (Level 0)

这将产生如下所示的层次结构:

- Node 1
--- Node 1.1
--- Node 1.2
--- Node 1.3
----- Node 1.3.1
--- Node 1.4
- Node 2
--- Node 2.1
----- Node 2.1.1
- Node 3

我的问题是弄清楚如何根据每个列出的对象的这些“级别”属性将此结构填充到 VCL TTreeView 中。如果我设计了这个第三方文件结构,我会使用父属性而不是级别属性。

此列表中的对象可以像这样迭代:

var
  I: TMyItem;
  N: TTreeNode;
begin
  for X := 0 to MyList.Count - 1 do begin
    I := MyList[X];
    //TMyItem has property "Level" which specifies hierarchy
    //  as well as "Title" property for the node's caption
    //How to create node based on Level?

    N.Data := I;
  end;  
end;

基于这个结构,我如何在 TreeView 中填充它?

最佳答案

尝试这样的事情:

var
  Item: TMyItem;
  Node: TTreeNode;
  NodeLevel: Integer;
  X: Integer;
begin
  Node := nil;
  NodeLevel := 0;
  for X := 0 to MyList.Count-1 do
  begin
    Item := MyList[X];
    if (Node = nil) or (Item.Level <= 0) then
    begin
      Node := TreeView1.Items.AddObject(nil, Item.Text, Item);
      NodeLevel := 0;
    end
    else if Item.Level = NodeLevel then
    begin
      Node := TreeView1.Items.AddObject(Node, Item.Text, Item);
    end else
    begin
      while Item.Level <= NodeLevel do
      begin
        Node := Node.Parent;
        Dec(NodeLevel);
      end;
      Node := TreeView1.Items.AddChildObject(Node, Item.Text, Item);
      Inc(NodeLevel);
    end;
    // set Node properties as needed...
  end;
end;

关于delphi - 如何使用 "levels"填充基于平面列表的 TreeView ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19772367/

相关文章:

c# - WPF TreeView - 选择和扩展节点

perl - 需要有关分层数据分页的建议

Python将字典的平面列表转换为层次结构树

delphi - 已排序的TStringList,排序是如何工作的?

Delphi JSONValue 获取值

delphi - 在 Delphi 中将对象转换为 OleVariant

delphi - 具有 TabOrder 属性的 TSpeedButton

c# - 如何防止事件导致其自身的事件在 C# 中触发?

asp.net treeview 以编程方式设置节点颜色

mysql - 带 WHERE 条件的分层 MYSQL 查询