【问题标题】:Is there a method for searching for TreeNode.Text field in TreeView.Nodes collection?是否有在 TreeView.Nodes 集合中搜索 TreeNode.Text 字段的方法?
【发布时间】:2012-09-12 12:32:36
【问题描述】:

像这样:

TreeNode[] treeNodes = treeView.Nodes.Find(searchString, true);

但我希望它在 text 字段而不是 name 字段中进行搜索。

【问题讨论】:

    标签: c# winforms treeview treenode


    【解决方案1】:

    我不知道任何内置方法,但您可以使用 LINQ

    TreeNode[] treeNodes = treeView.Nodes
                                        .Cast<TreeNode>()
                                        .Where(r => r.Text == "yourText")
                                        .ToArray();
    

    【讨论】:

    • 这比 for 循环更有效(更快)吗?可以不使用“Cast”来完成吗?而且,另一件事,这对树上的孩子不起作用。仅适用于根元素。
    • 问题要求“搜索子项”设置为 true,但在 text 字段而不是 name 字段中进行查找的事实可以解释,相当严峻的,downvote。
    • 由于我使用树视图来显示类中的数据,我更喜欢检查类中的这种信息(它是扁平的)而不是树(它包含很多分支)。
    • @ThunderGr,比 for 循环快吗?我不能说,因为 LINQ 内部使用循环。即使有差异,也可以忽略不计。是的,它不会递归搜索,L.B's Answer 有一个递归解决方案。
    • 此方法不会搜索子节点
    【解决方案2】:

    要搜索所有树节点(不仅是直接子节点),您可以使用下面的扩展方法

    var nodes = treeView1.FlattenTree()
                         .Where(n => n.Text == "sometext")
                         .ToList();
    

    --

    public static class SOExtension
    {
        public static IEnumerable<TreeNode> FlattenTree(this TreeView tv)
        {
            return FlattenTree(tv.Nodes);
        }
    
        public static IEnumerable<TreeNode> FlattenTree(this TreeNodeCollection coll)
        {
            return coll.Cast<TreeNode>()
                        .Concat(coll.Cast<TreeNode>()
                                    .SelectMany(x => FlattenTree(x.Nodes)));
        }
    }
    

    【讨论】:

    • var nodes 是一组带有.Text == "sometext" 的节点,我怎样才能在这个集合中包含其他父节点,其子节点已经在这个集合中,所以最后我将能够构建一个树?
    • 非常好的解决方案:)
    • 它帮助我根据搜索文本过滤选择节点treeview.SelectedNode = treeAccount.FlattenTree().Where(p =&gt; p.Text.StartsWith(txtSearch.Text.Trim())).FirstOrDefault();
    【解决方案3】:

    如果我理解正确(你最后一个问题很混乱),你可以自己写一个 find 方法,如下所示

    public static TreeNode[] Find(this TreeNode motherNode, string findNodeText)
    {
        List<TreeNode> nodeList = new List<TreeNode>();
        foreach (TreeNode childNode in motherNode.Nodes)
            if (childNode.Text.Equals(findNodeText, StringComparison.CurrentCulture))
                nodeList.Add(childNode);
        return nodeList.ToArray<TreeNode>();
    }
    

    这个方法可以像

    TreeView myTreeView = new TreeView();
    foreach (TreeNode node in myTreeView.Nodes)
    {
        TreeNode[] childNodes = node.Find("Text");
        // Do something...
    }
    

    我希望这会有所帮助。

    【讨论】:

      【解决方案4】:

      以下代码仅显示与搜索条件匹配的节点。

      在搜索事件中复制以下代码

         private void tbxSearch_KeyUp(object sender, KeyEventArgs e)
          {
              if (e.KeyCode == Keys.Enter)
              {
                  trvMenu.BeginUpdate();
                  if (tbxSearch.Text.Length > 0)
                  {
                      for (int i = trvMenu.Nodes.Count;  i > 0  ; i--)
                      {
                          NodeFiltering(trvMenu.Nodes[i - 1], tbxSearch.Text);
                      }
                  }
                  trvMenu.EndUpdate();
              }
      

      然后创建 serch & filter 函数

          private bool NodeFiltering(TreeNode Nodo,string Texto)
          {
              bool resultado = false;
      
              if (Nodo.Nodes.Count == 0)
              {
                  if (Nodo.Text.ToUpper().Contains(Texto.ToUpper()))
                  {
                      resultado = true;
                  }
                  else
                  {
                      Nodo.Remove();
                  }
              }
              else
              {
                  for (int i = Nodo.Nodes.Count; i > 0; i--)
                  {
                      if (NodeFiltering(Nodo.Nodes[i - 1], Texto))
                          resultado = true;
                  }
      
                  if (!resultado)
                      Nodo.Remove();
              }
      
              return resultado;
          }
      

      这段代码非常适合创建具有多个级别的 Treeview 菜单。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-18
        • 2015-02-01
        • 2020-10-17
        • 2014-10-03
        • 1970-01-01
        • 1970-01-01
        • 2021-07-06
        相关资源
        最近更新 更多