使用LINQ可以在不使用foreach的情况下突出显示TreeNode?

时间:2011-11-30 13:21:34

标签: c# linq treeview

我有一些只包含父节点的TreeView(如listview)。我有一个文本框,用户可以在其中输入文本,然后我想突出显示树视图中的节点,该节点具有用户输入的相同文本。目前我使用此代码:

strring text = textBox.Text.Trim(); //the text entered by user

foreach(TreeNode node in treeView.Nodes)
{
    if(node.Text == text) node.BackColor == Color.Green;
}

我讨厌为每个树视图编写foreach。有一个简单的方法可以说:例如:

if(treeView.Nodes.Contains(text)) //do stuff

Nodes.Contains()只接受TreeNode对象。我想知道是否存在更好的代码!?

3 个答案:

答案 0 :(得分:5)

是的,您可以使用LINQ这样做:

treeView.Nodes.FirstOrDefault<TreeNode>(node => node.Text == text);

如果没有找到任何项目,您将获得null。

答案 1 :(得分:1)

要获取包含文本的所有项目,请执行以下操作:

IEnumerable<TreeNode>  foundItems = 
    from TreeNode node in tree.Nodes 
    where node.Text.Contains(searchString) select node;

或自动选择第一次出现:

TreeNode firstNodeWithText = (from TreeNode node in tree.Nodes 
  where node.Text.Contains(searchString) select node).FirstOrDefault<TreeNode>();
tree.SelectedNode = firstNodeWithText;

答案 2 :(得分:1)

您可以尝试这样

string text = textBox.Text.Trim(); //the text entered by user
foreach(TreeNode node in treeView.Nodes
                                 .Cast<TreeNode>()
                                 .Where(x=>x.Text == text))
    node.BackColor == Color.Green;

但是,正如您所看到的,您的代码并没有那么短。

PS我刚刚意识到你想要一个不使用foreach的解决方案。你应该尝试Fischermen的方法。