Выберите узел TreeView по тексту - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть TreeView, где я получаю такие узлы, как:

TreeNode tn = parent.Nodes[indexProject].Nodes[currDesign].Nodes

Это устаревшие данные из старого проекта, поэтому я знаю, что индексация - это плохая практика для представлений дерева.

Что я хочуЯ знаю, есть ли способ выбрать узел по Text, я имею в виду, код выше возвращает что-то вроде этого в последнем узле:

enter image description here

ТакЯ хочу получить узел, который содержит FBOM в текстовом поле, можно ли сделать что-то вроде:

TreeNode tn = parent.Nodes[indexProject].Nodes[currDesign].Nodes.where(x => x.Text.Contains("FOB"))

Я также пытаюсь:

 TreeNode tn = (TreeNode)parent.Nodes[indexProject].Nodes[currDesign].Nodes.Cast<TreeNode>()
                                    .Where(r => r.Text.Contains("FBOM"));

Но я получаю:

System.InvalidCastException: 'Невозможно привести объект типа' WhereEnumerableIterator`1 [System.Windows.Forms.TreeNode] 'к типу' System.Windows.Forms.TreeNode '.'

1 Ответ

0 голосов
/ 27 февраля 2019

Если ваше древовидное представление не является непосредственным дочерним элементом, возможно, вам придется его немного сгладить.Например,

 var result = treeView1.FlattenTree().Cast<TreeNode>()
                                    .Where(r => r.Text == "Node3");

Где FlattenTree определено как.

public static class Extensions
{
    public static IEnumerable<TreeNode> FlattenTree(this TreeView source)
    {
        return FlattenTree(source.Nodes);
    }

    public static IEnumerable<TreeNode> FlattenTree(this TreeNodeCollection source)
    {
        return source.Cast<TreeNode>().Concat(source.Cast<TreeNode>().SelectMany(x => FlattenTree(x.Nodes)));
    }
}

Учитывая, что существует вероятность, что могут быть дублирующие узлы с одинаковым текстом, коллекция возвращается выше.Вы можете изменить linq в соответствии с вашими требованиями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...