在项目开发的过程中,树状结构用的很多,树结构不但能够很好的分类汇总,而且还能明确层次关系,方便操作
这里写一个简单的C#填充数的程序,一般要填充树状结构就会用递归的方法
先看数据库表结构:
parentID为改name的父节点id
C#代码:
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 private void button1_Click(object sender, EventArgs e)
{
DataSet ds = GetData();
if (ds.Tables.Count <= 0) return;
NodeAdd(treeView1, ds.Tables[0], true);
}
private static DataSet GetData()
{
using (SqlConnection con = new SqlConnection("data source=.;initial catalog=Test;user id=sa"))
{
con.Open();
SqlCommand cmd = new SqlCommand("select * from Student", con);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adapter.Fill(ds);
return ds;
}
}
//填充数
private static void NodeAdd(TreeView tree, DataTable table, bool expandall)
{
foreach (DataRow row in table.Rows)
{
string id = row["id"].ToString().Trim();
string name = row["name"].ToString().Trim();
string parentID = row["parentID"].ToString().Trim();
TreeNode node = new TreeNode(name);
node.Tag = id;
//在树中根据id来查找这个节点,如果没有找到,则说明这个节点是父节点,如果查找到这个节点,则返回,返回的节点为node节点的父节点
TreeNode parentNode = GetNodeByID(tree,parentID);
if (parentNode == null)
{
tree.Nodes.Add(node);
}
else //如果不为空,则说明当前的节点为返回节点(parentNode)的子节点
{
parentNode.Nodes.Add(node);
}
if (expandall)
{
tree.ExpandAll();
}
}
}
private static TreeNode GetNodeByID(TreeView tree, string id)
{
TreeNode result = null;
foreach (TreeNode node in tree.Nodes)
{
if (node.Tag.ToString() == id)
{
result = node;
break;
}
//判断当前节点是不是要查找的节点,如果不是,则查看当前节点是否有子节点,然后递归判断
if (node.Nodes.Count > 0)
{
result = GetNodeByID(node, id);
if (result != null)
break;
}
}
return result;
}
private static TreeNode GetNodeByID(TreeNode parentNode, string id)
{
TreeNode result = null;
foreach (TreeNode node in parentNode.Nodes)
{
if (node.Tag.ToString() == id)
{
result = node;
break;
}
if (node.Nodes.Count > 0)
{
result = GetNodeByID(node, id);
if (result != null)
break;
}
}
return result;
}
//运行结果