'How to select multiple items in a TTreeView in code

I'm trying to select all the child node of a parent node when the parent is clicked, but when I for each node set the Selected = true i only end up with the last one being selected. MultiSelect is true and I can do it with the mouse, so the setup should be ok.

For testing I use this code:

TTreeNode *node = Tv->Items->GetFirstNode();
node->Selected = true;
node = node->GetNext();
node->Selected = true;
node = node->GetNext();
node->Selected = true;
node = node->GetNext();
node->Selected = true;

Any tricks to make this work?



Solution 1:[1]

The TTreeNode::Selected property does not support multiple selections when toggling the node's selection state. Internally, it will call the Win32 TreeView_SelectItem() API, which selects a single node only.

For multi-select, use the TTreeView::Select() method instead:

The select method selects one or more tree nodes.

That being said, your example is attempting to select (potentially) every node in the TreeView, not just the child nodes of a parent node, as you claim.

Try this:

void AddNodeAndChildrenToList(TList *List, TTreeNode *Node)
{
    List->Add(Node);
    TTreeNode *child = Node->getFirstChild();
    while (child)
    {
        AddNodeAndChildrenToList(List, child);
        child = child->getNextSibling();
    }
}

...

TList *nodes = new TList;
try
{
    TTreeNode *parent = ...;
    AddNodeAndChildrenToList(nodes, parent);
    Tv->Select(nodes);
}
__finally
{
    delete nodes;
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1