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