Delphi:检查树视图中的选择

时间:2011-07-27 02:45:38

标签: delphi select treeview

有一个包含2个级别项目的树视图。我需要将所有选定的“子”(1级)项目的文本添加到备忘录中。

for i := 0 to pred(TreeView1.Items.count) do 
if (TreeView1.Items.Item[i].Selected) and (TreeView1.Items.Item[i].Level=1)
   then 
       begin
            Memo1.Lines.Add(TreeView1.Items.Item[i].Text)
       end;

但是,如果选择了父级(级别0),如何在不检查(选择或不选择)的情况下立即添加所有“子”项目?例如。我选择级别为0的3个项目,并将他们的孩子添加到备忘录中。

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

仅获取具有所选父级的1级节点:

var
  Node: TTreeNode;
  Sub: TTreeNode;
begin
  Node := TreeView.Items.GetFirstNode;
  while Node <> nil do
  begin
    if Node.Selected then
    begin
      Sub := Node.GetFirstChild;
      while Sub <> nil do
      begin
        Memo1.Lines.Add(Sub.Text);
        Sub := Sub.GetNextSibling;
      end;
    end;
    Node := Node.GetNextSibling;
  end;
end;

因评论而更新:

获取具有所选父级的1级节点,或者自行选择:

var
  I: Integer;
begin
  for I := 0 to TreeView.Items.Count - 1 do
    with TreeView.Items[I] do
      if (Level = 1) and (Selected or Parent.Selected) then
        Memo1.Lines.Add(Text);
end;

答案 1 :(得分:1)

在我看来,您正在寻找具有父节点的所有选定节点。最简单的方法如下:

procedure EnumerateSelectedNonTopLevelItems(TreeView: TTreeView; List: TStrings);
var
  Node: TTreeNode;
begin
  for Node in TreeView.Items do
    if Node.Selected and Assigned(Node.Parent) then
      List.Add(Node.Text);
end;

此例程将为您提供级别为2,3,4等的节点。由于您只有级别0和级别1,这很好。如果您确实需要作为顶级节点的直接后代的节点,那么您可以像这样修改测试:

if Node.Selected and Assigned(Node.Parent) and not Assigned(Node.Parent.Parent) then