新手发帖:怎么用C#建立一个动态树 C#中如果需要建立一个动态树的话,除了在界面里创建一个TreeView控件和在系统数据库里建立一个目录树的表之外,还需要怎么做? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 更具需要new 一个节点类 赋值属性 填到treeview中 那就从数据库中读取然后填充到treeview中去啊,so easy 如果不是很复杂的话,,直接读取出ID,NAME,父ID就可以了吧,访问数据库的时候ID,NAME,父ID一起读出,赋值给LIST<节点类> 给你个二叉搜索树,。 class Node // 节点 { public int data; // 数据,类型可用泛型 public Balance balance; // 平衡状态 public Node left; // 左节点 public Node right; // 右节点 public Node(int d) { data = d; balance = Balance.balanced; left = right = null; } public void Traversed() // 单个节点的访问 { Console.Write("{0} ", data); } public static void PrintTree(Node t, int level) // 显示树(左转90度) { if (t == null) return; PrintTree(t.right, level + 1); string s = new string(' ', level * 4); Console.Write(s); Console.WriteLine("{0}", t.data); PrintTree(t.left, level + 1); } public static void Inorder(Node p) // 中序遍历 { if (p == null) return; Inorder(p.left); p.Traversed(); Inorder(p.right); } public static void Preorder(Node p) // 前序遍历 { if (p == null) return; Preorder(p.left); p.Traversed(); Preorder(p.right); } public static void Postorder(Node p) // 后序遍历 { if (p == null) return; Postorder(p.left); p.Traversed(); Postorder(p.right); } public static void Levelorder(Node p) // 层序遍历 { Queue<Node> nodes = new Queue<Node>(); nodes.Enqueue(p); while (nodes.Count > 0) { Node tmp = nodes.Dequeue(); if (tmp != null) { tmp.Traversed(); nodes.Enqueue(tmp.left); nodes.Enqueue(tmp.right); } } } } class BinSTree // 二叉搜索树 { private Node root; public BinSTree() { root = null; } public void Add(int data) { Node node = new Node(data); Insert(ref root, node); } private void Insert(ref Node tree, Node newNode) { if (tree == null) tree = newNode; else if (newNode.data < tree.data) Insert(ref tree.left, newNode); else Insert(ref tree.right, newNode); } public void Print() { Node.PrintTree(root, 1); } } 查询数据递归绑定到treeviewprivate void InitTree(TreeNodeCollection Nds,string parentId){DataView dv=new DataView();TreeNode tmpNd;string intId;dv.Table=ds.Tables["tree"];dv.RowFilter="ParentId='" + parentId + "'" ;foreach(DataRowView drv in dv){tmpNd=new TreeNode();tmpNd.Tag=drv["NodeId"].ToString();tmpNd.Text=drv["NodeName"].ToString();Nds.Add(tmpNd);intId=drv["ParentId"].ToString();InitTree(tmpNd.Nodes,tmpNd.Tag.ToString());}} TreeNode 递归添加到treeview中! 那么在节点类的属性中可以定义除了节点在目录树表中的ID,NAME,父ID之外还可以定义节点本身的一些属性吗?比如节点对应的某个特定的对象。 我补充一点吧,关于treeview.treenode有几个重要的属性:1.treenode.name; 2.treenode.text; 这两个属性类似于 hashtable的(key,value),name可以作为唯一识别一个树控件下唯一结点的标识,比如treeview1.nodes[key1]; 而text则是该节点在树中显示的文本3.treenode.tag这个属性可以用一个object对象赋值,换句话说你可以在每个节点下挂载一个object,当然里面可以包含任何数据。其他的动态建树的思路楼上讲了我就不赘述了纯手工回复,给点分噢 怎么样实现excel中一列数的赋值 窗口上有很多控件,怎么始终让窗体本身感知到鼠标移动的事件,而不是被控件捕获。 刚刚开始的程序人生 请问有没有本地中外词典的类库 各位高手,我们的无聊老师又布了这样的一个题目 求助:帮忙使用合理的设计模式给出类的详细设计 请问大家一个简单的问题。语法方面。 怎样使自己的程序,缩到任务兰右下角?((系统托盘) IList排序问题,高手手请进 如何把BitArray里面的数据转换成byte,或byte[]型的数据 求一段C#连Oracle数据库代码 C#连接mysql抛出异常出错!
{
public int data; // 数据,类型可用泛型
public Balance balance; // 平衡状态
public Node left; // 左节点
public Node right; // 右节点 public Node(int d)
{
data = d;
balance = Balance.balanced;
left = right = null;
} public void Traversed() // 单个节点的访问
{
Console.Write("{0} ", data);
} public static void PrintTree(Node t, int level) // 显示树(左转90度)
{
if (t == null) return; PrintTree(t.right, level + 1);
string s = new string(' ', level * 4);
Console.Write(s);
Console.WriteLine("{0}", t.data);
PrintTree(t.left, level + 1);
} public static void Inorder(Node p) // 中序遍历
{
if (p == null) return; Inorder(p.left);
p.Traversed();
Inorder(p.right);
} public static void Preorder(Node p) // 前序遍历
{
if (p == null) return; Preorder(p.left);
p.Traversed();
Preorder(p.right);
} public static void Postorder(Node p) // 后序遍历
{
if (p == null) return; Postorder(p.left);
p.Traversed();
Postorder(p.right);
} public static void Levelorder(Node p) // 层序遍历
{
Queue<Node> nodes = new Queue<Node>();
nodes.Enqueue(p); while (nodes.Count > 0)
{
Node tmp = nodes.Dequeue();
if (tmp != null)
{
tmp.Traversed();
nodes.Enqueue(tmp.left);
nodes.Enqueue(tmp.right);
}
}
}
}
class BinSTree // 二叉搜索树
{
private Node root; public BinSTree()
{
root = null;
} public void Add(int data)
{
Node node = new Node(data);
Insert(ref root, node);
} private void Insert(ref Node tree, Node newNode)
{
if (tree == null)
tree = newNode;
else if (newNode.data < tree.data)
Insert(ref tree.left, newNode);
else
Insert(ref tree.right, newNode);
} public void Print()
{
Node.PrintTree(root, 1);
}
}
private void InitTree(TreeNodeCollection Nds,string parentId)
{
DataView dv=new DataView();
TreeNode tmpNd;
string intId;
dv.Table=ds.Tables["tree"];
dv.RowFilter="ParentId='" + parentId + "'" ;
foreach(DataRowView drv in dv)
{
tmpNd=new TreeNode();
tmpNd.Tag=drv["NodeId"].ToString();
tmpNd.Text=drv["NodeName"].ToString();
Nds.Add(tmpNd);
intId=drv["ParentId"].ToString();
InitTree(tmpNd.Nodes,tmpNd.Tag.ToString());
}
}
1.treenode.name;
2.treenode.text;
这两个属性类似于 hashtable的(key,value),name可以作为唯一识别一个树控件下唯一结点的标识,比如treeview1.nodes[key1]; 而text则是该节点在树中显示的文本
3.treenode.tag
这个属性可以用一个object对象赋值,换句话说你可以在每个节点下挂载一个object,当然里面可以包含任何数据。其他的动态建树的思路楼上讲了我就不赘述了纯手工回复,给点分噢