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 递归测试
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
list = DataAccess.SelectAll();
CreateNode(list[0]);
}
List<Type> list;
TreeNode parentNode;
private void CreateNode(Type type)
{
if (list.Count > 0) list.RemoveAt(0);
else return;
TreeNode node = new TreeNode();
node.Text = type.TypeName;
node.Tag = type.TypeID;
if (type.ParentID == 0)
{// 根节点
this.treeView1.Nodes.Add(node);
}
else
{// 遍历 树控件 找到子节点
CheckForNode(type.ParentID);
parentNode.Nodes.Add(node);
}
if (list.Count > 0) CreateNode(list[0]);
}
// 遍历树控件 找到节点的tag为parentid的节点
void CheckForNode(int parentid)
{
if (this.treeView1.Nodes.Count == 0) return ;
FindNode(this.treeView1.Nodes[0], parentid);
//return node;
}
// 为当前新产生的节点找到它的父节点 赋值给全局变量parentNode
// 这里没有使用返回父节点的原因 如若返回递归并不会正确执行
void FindNode(TreeNode node, int parentid)
{
if (Convert.ToInt32(node.Tag) == parentid)
{
parentNode = node;
}
foreach (TreeNode item in node.Nodes)
{
FindNode(item, parentid);
}
}
}
}
分好多,大概看了下,实现的是从数据库读取记录,按照父级ID加载到树形控件中。
我给你优化了一下,思路是先创建树形结构,然后按照树形结构递归加载到控件中,性能应该还行,没有刻意优化。
效果:
代码:
private void button1_Click(object sender, EventArgs e) { treeView1.Nodes.Clear(); var list = new List<WinFormTest.MyType>();//DataAccess.SelectAll(); //生成测试用数据 0为根节点 若没有自己建一个 for (int i = 0; i <= 50; i++) { list.Add(new MyType { ParentID = new Random().Next(i), TypeID = i, TypeName = i + "" + i }); } //设置子节点 foreach (var myType in list) { var parent = list.FirstOrDefault(b => b.TypeID == myType.ParentID); if (myType.TypeID != 0 && parent != null) { parent.Childs.Add(myType); } } //加载到控件中 var root = list.FirstOrDefault(b => b.TypeID == 0); root.Childs.ForEach(b => CreateNode(b, treeView1.Nodes)); treeView1.ExpandAll(); } //递归加载 void CreateNode(MyType myType, TreeNodeCollection node) { var treeNode = new TreeNode() { Text = myType.TypeName, Tag = myType.TypeID }; node.Add(treeNode); if (myType.Childs.Count > 0) { myType.Childs.ForEach(b => CreateNode(b, treeNode.Nodes)); } }
另外,你的数据结构里面增加一个子节点
public class MyType { public int TypeID { get; set; } public string TypeName { get; set; } public int ParentID { get; set; } public List<MyType> Childs = new List<MyType> { }; }
等我回去 试一下啊 莫急
var parent = list.FirstOrDefault(b => b.TypeID == myType.ParentID);
请问下 这句 linq 为啥要这句
@空野指针: 哦哦哦,满足这个条件的 第一个 。。。。看蒙了
@空野指针: 嗯,明白就行。就是找到他的父级点,建立树形关系。
不能用插入代码的形式么?
我觉得写的可以了,最好FindNode方法返回你找到的TreeNode,那么foreach那个你就好break出去了。
用栈来实现,抛弃递归。