Winform TreeView 查找下一个节点

public static class TreeViewHelper
    {
        private static IEnumerable<TreeNode> childNodes(this TreeNode node)
        {
            return node.Nodes.Cast<TreeNode>()
                       .SelectMany(x => x.selfAndChildNodes());
        }

        private static IEnumerable<TreeNode> selfAndChildNodes(this TreeNode node)
        {
            return new List<TreeNode>() { node }
                       .Union(node.Nodes.Cast<TreeNode>()
                       .SelectMany(x => x.selfAndChildNodes()));
        }

        private static IEnumerable<TreeNode> nextNodes(this TreeView tree, TreeNode node)
        {
            bool after = false;
            if (node.Parent == null)
                return tree.Nodes.Cast<TreeNode>()
                           .Select(x => { bool b = after = after || (node == x); return new { x, b }; })
                           .Where(x => x.b && x.x != node)
                           .SelectMany(x => new List<TreeNode>() { x.x }.Union(x.x.childNodes()));
            else
                return node.Parent.Nodes.Cast<TreeNode>()
                           .Select(x => { bool b = after = after || (node == x); return new { x, b }; })
                           .Where(x => x.b && x.x != node)
                           .SelectMany(x => new List<TreeNode>() { x.x }.Union(x.x.childNodes()))
                           .Union(tree.nextNodes(node.Parent));
        }

        public static IEnumerable<TreeNode> NextNodes(this TreeView tree, TreeNode node)
        {
            if (tree == null || node == null)
                return new List<TreeNode>();
            return node.childNodes().Union(tree.nextNodes(node));
        }

        public static IEnumerable<TreeNode> NextNodes(this TreeView tree)
        {
            if (tree == null || tree.SelectedNode == null)
                return new List<TreeNode>();
            return tree.NextNodes(tree.SelectedNode);
        }
    }

  如何调用:

var tn = _Tv.NextNodes().FirstOrDefault(x => Regex.IsMatch(x.Text, "(?i)" + txtKey.Text.Trim()));

 if (tn == null)                

    MessageBox.Show("查找完毕");            

else                

_Tv.SelectedNode = tn;

public static IEnumerable<TreeNode> TreeWhere(this TreeNodeCollection tds, Func<TreeNode, bool> Fun)
        {
            foreach (TreeNode item in tds)
            {
                if (Fun(item))
                    yield return item;

                var list = item.Nodes.TreeWhere(Fun);
                foreach (var item1 in list)
                    yield return item1;
            }
        }

如何调用:

 var tn = treeView1.Nodes.TreeWhere(x => Regex.IsMatch(x.Text, @"(?i)" + txtKey.Text.Trim()));

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏跟着阿笨一起玩NET

通过键盘方向键控制TreeView节点的移动

本文转载:http://dengzebo.blog.163.com/blog/static/18867406201032141932204/

11510
来自专栏跟着阿笨一起玩NET

c# 播放mp3

转载:http://www.cnblogs.com/igrl/archive/2010/03/29/1699975.html

1.1K10
来自专栏我是攻城师

Joda-Time几个用法小记

32270
来自专栏葡萄城控件技术团队

Table-values parameter(TVP)系列之二: 利用DataTable将其作为参数传给SP

一,回顾         上一部分讲述了“在T-SQL中创建和使用TVP”,通过T-SQL建立如下的对象:         1)Tables ...

23990
来自专栏更流畅、简洁的软件开发方式

【开源】QuickPager ASP.NET2.0分页控件V2.0.0.1——分页控件的源码 (二)

namespace JYK.Controls.PageManage {     /**//// <summary>     /// 生成分页控件需要的SQL语句...

22660
来自专栏跟着阿笨一起玩NET

C#中格式化数据的输出

alignment:可选,是一个带符号的整数,指示首选的格式化字段宽度。如果“对齐”值小于格式化字符串的长度,“对齐”会被忽略,并且使用格式化字符串的长度作为字...

11200
来自专栏跟着阿笨一起玩NET

C# SQL多条件查询拼接技巧

本文转载:http://blog.csdn.net/limlimlim/article/details/8638080

48710
来自专栏岑玉海

RavenDb学习(五)结果转换

1)Result Transformers public class Order { public DateTime OrderedAt { get;...

28190
来自专栏跟着阿笨一起玩NET

linq to sql 三层架构中使用CRUD操作

16810
来自专栏菩提树下的杨过

DataTable,List去重复记录的方法

今天一位朋友问如何去掉DataTable里重复的记录(DataTable是别人返回过来的,不能再重新查询数据库,所以无法用sql中的select distinc...

294100

扫码关注云+社区

领取腾讯云代金券