首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

从某一节点开始遍历TreeView解决思路

2013-01-02 
从某一节点开始遍历TreeView看到论坛一个问这个,随手写一个,使用这段代码,可以实现从TreeView某一个节点开

从某一节点开始遍历TreeView
看到论坛一个问这个,随手写一个,使用这段代码,可以实现从TreeView某一个节点开始往后查找。(往前查找我故意不写了,因为只提供思路,不是写给拷贝粘贴党的)程序很简单,主要是给新学C#和LINQ的人一些参考和启发。

效果图
从某一节点开始遍历TreeView解决思路

代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    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);
        }
    }
}



下面是测试程序的代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var tn = treeView1.NextNodes().FirstOrDefault(x => x.Text == "stop");
            if (tn == null) MessageBox.Show("查找完毕"); else treeView1.SelectedNode = tn;
            ActiveControl = treeView1;
        }
    }
}


namespace WindowsFormsApplication1
{
    partial class Form1
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>


        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            System.Windows.Forms.TreeNode treeNode28 = new System.Windows.Forms.TreeNode("stop");
            System.Windows.Forms.TreeNode treeNode29 = new System.Windows.Forms.TreeNode("密云", new System.Windows.Forms.TreeNode[] {
            treeNode28});
            System.Windows.Forms.TreeNode treeNode30 = new System.Windows.Forms.TreeNode("昌平");
            System.Windows.Forms.TreeNode treeNode31 = new System.Windows.Forms.TreeNode("丰台");
            System.Windows.Forms.TreeNode treeNode32 = new System.Windows.Forms.TreeNode("大兴");
            System.Windows.Forms.TreeNode treeNode33 = new System.Windows.Forms.TreeNode("北京", new System.Windows.Forms.TreeNode[] {
            treeNode29,
            treeNode30,
            treeNode31,
            treeNode32});
            System.Windows.Forms.TreeNode treeNode34 = new System.Windows.Forms.TreeNode("安亭");
            System.Windows.Forms.TreeNode treeNode35 = new System.Windows.Forms.TreeNode("嘉定", new System.Windows.Forms.TreeNode[] {
            treeNode34});
            System.Windows.Forms.TreeNode treeNode36 = new System.Windows.Forms.TreeNode("金山");
            System.Windows.Forms.TreeNode treeNode37 = new System.Windows.Forms.TreeNode("松江");
            System.Windows.Forms.TreeNode treeNode38 = new System.Windows.Forms.TreeNode("stop");


            System.Windows.Forms.TreeNode treeNode39 = new System.Windows.Forms.TreeNode("上海", new System.Windows.Forms.TreeNode[] {
            treeNode35,
            treeNode36,
            treeNode37,
            treeNode38});
            System.Windows.Forms.TreeNode treeNode40 = new System.Windows.Forms.TreeNode("济南");
            System.Windows.Forms.TreeNode treeNode41 = new System.Windows.Forms.TreeNode("stop");
            System.Windows.Forms.TreeNode treeNode42 = new System.Windows.Forms.TreeNode("德州");
            System.Windows.Forms.TreeNode treeNode43 = new System.Windows.Forms.TreeNode("滕州");
            System.Windows.Forms.TreeNode treeNode44 = new System.Windows.Forms.TreeNode("枣庄", new System.Windows.Forms.TreeNode[] {
            treeNode43});
            System.Windows.Forms.TreeNode treeNode45 = new System.Windows.Forms.TreeNode("青岛");
            System.Windows.Forms.TreeNode treeNode46 = new System.Windows.Forms.TreeNode("山东", new System.Windows.Forms.TreeNode[] {
            treeNode40,
            treeNode41,
            treeNode42,
            treeNode44,
            treeNode45});
            System.Windows.Forms.TreeNode treeNode47 = new System.Windows.Forms.TreeNode("辽宁");
            System.Windows.Forms.TreeNode treeNode48 = new System.Windows.Forms.TreeNode("高碑店");
            System.Windows.Forms.TreeNode treeNode49 = new System.Windows.Forms.TreeNode("stop", new System.Windows.Forms.TreeNode[] {
            treeNode48});
            System.Windows.Forms.TreeNode treeNode50 = new System.Windows.Forms.TreeNode("唐山");
            System.Windows.Forms.TreeNode treeNode51 = new System.Windows.Forms.TreeNode("河北", new System.Windows.Forms.TreeNode[] {
            treeNode49,
            treeNode50});
            System.Windows.Forms.TreeNode treeNode52 = new System.Windows.Forms.TreeNode("太原");
            System.Windows.Forms.TreeNode treeNode53 = new System.Windows.Forms.TreeNode("运城");


            System.Windows.Forms.TreeNode treeNode54 = new System.Windows.Forms.TreeNode("山西", new System.Windows.Forms.TreeNode[] {
            treeNode52,
            treeNode53});


[解决办法]
从某一节点开始遍历TreeView解决思路
[解决办法]
从某一节点开始遍历TreeView解决思路
[解决办法]
从某一节点开始遍历TreeView解决思路不会LINQ伤不起
[解决办法]
虚心求学啦!从某一节点开始遍历TreeView解决思路
[解决办法]
好法子观摩一下
[解决办法]
观看中从某一节点开始遍历TreeView解决思路
[解决办法]
知识还是学扎实点好
[解决办法]
不错学习了从某一节点开始遍历TreeView解决思路
[解决办法]
不错学习ddd 
[解决办法]
哇,我的看不懂哦
[解决办法]
支持一下了。非常不错的
[解决办法]
从某一节点开始遍历TreeView解决思路从某一节点开始遍历TreeView解决思路
[解决办法]
感谢楼主分享从某一节点开始遍历TreeView解决思路
[解决办法]
从某一节点开始遍历TreeView解决思路好东西,但是LINQ藐视在大数据量下存在效率上的问题!
[解决办法]
支持一下了。非常不错的。
[解决办法]
观摩一下··从某一节点开始遍历TreeView解决思路
[解决办法]
虚心求学啦!
[解决办法]
感谢分享! 收藏一个
[解决办法]
从某一节点开始遍历TreeView解决思路
[解决办法]
从某一节点开始遍历TreeView解决思路

热点排行