Поиск узлов дерева в TreeView - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть TreeView, содержащий немного TreeNode, как показано ниже:

TreeView with text box

Моя идея состоит в том, чтобы использовать textBox1 какпоисковая система, отображающая только те TreeNodes, которые содержат текст textBox1.У меня уже есть функция, которая может анализировать различные узлы и проверять, содержится ли текст, содержащийся в textBox1, каждого узла:

private void textBox1_TextChanged(object sender, EventArgs e)
{
    foreach (var node in Collect(treeView1.Nodes))
    {
        if (node.Text.ToLower().Contains(textBox1.Text.ToLower()))
        {
            //I want to show those nodes 
            Debug.Write("Contained : ");
            Debug.WriteLine(node.Text);
        }
        else
        {
            //I want to hide those nodes
            Debug.Write("Not contained : ");
            Debug.WriteLine(node.Text);
        }
    }
}

Поскольку свойство isVisible для TreeNode является только получателем, какскрыть TreeNodes, которые не содержат искомый текст?

1 Ответ

0 голосов
/ 14 декабря 2018

В документации нет способа скрыть триод.Но вместо этого вы можете удалить и повторно добавить этот узел.Вы можете сделать это с помощью следующего подхода:

public class RootNode : TreeNode
{
    public List<ChildNode> ChildNodes { get; set; }

    public RootNode()
    {
        ChildNodes = new List<ChildNode>();
    }

    public void PopulateChildren()
    {
        this.Nodes.Clear();

        var visibleNodes = 
            ChildNodes
            .Where(x => x.Visible)
            .ToArray();

        this.Nodes.AddRange(visibleNodes);
    }

    //you would use this instead of (Nodes.Add)
    public void AddNode(ChildNode node)
    {
        if (!ChildNodes.Contains(node))
        {
            node.ParentNode = this;
            ChildNodes.Add(node);
            PopulateChildren();
        }
    }

    //you would use this instead of (Nodes.Remove)
    public void RemoveNode(ChildNode node)
    {
        if (ChildNodes.Contains(node))
        {
            node.ParentNode = null;
            ChildNodes.Remove(node);
            PopulateChildren();
        }

    }
}

public class ChildNode : TreeNode
{
    public RootNode ParentNode { get; set; }
    private bool visible;
    public bool Visible { get { return visible; } set { visible = value;OnVisibleChanged(): } }
    private void OnVisibleChanged()
    {
        if (ParentNode != null)
        {
            ParentNode.PopulateChildren();
        }
    }
}
...