组织和遍历TreeView里面的数据
关键字:asp.net2.0,treeview,数据,遍历
经常有朋友问如何把数据添加进TreeView,其实更多的是要问为什么treeview不能绑定数据库里面的数据,而只能绑定xml的数据.
这个问题要从数据的结构来阐述,TreeView的数据结构是树状的,而表里的数据是平面的,平面的数据结构表达树状的结构就有很多种方法,所以笔者认为这也就是为什么微软没有提供直接的数据表绑定方法而是把这个空间留给了用户.
下面简单描述如何把简单的数据库里的数据遍历到TreeView中.
首先假定有如下的数据表,结构有:id主键,nodetext节点文本,fathernode父节点id.其中fathernode这个字段默认值是0,代表是根节点,如果是非0的话那么就说明是主键为这个值的子节点,结构就是这么简单,当然在数据表中实现树形结构的存储还有很多,这里只讨论如上的情况.
数据表定义如下图:
为了测试往里面写几条数据:
这里为了简便,假定树只有两层.在这种情况下用两个for 循环就可以实现了,当然也可以用递归,不过为了简单说明问题,这里只用循环的方式来做.
外层循环读取所有FatherNode为0的节点,里面套用的循环是读取当前节点的子节点.代码大致如下:
private void GenerateTreeView()
{
DataSet1TableAdapters.test_tableTableAdapter ta1 = new DataSet1TableAdapters.test_tableTableAdapter();
DataTable dt1 = ta1.GetDataByFatherNode(0);
for (int i = 0; i < dt1.Rows.Count; i++)
{
TreeNode tn1 = new TreeNode();
tn1.Text = dt1.Rows[i]["NodeText"].ToString();
DataSet1TableAdapters.test_tableTableAdapter ta2 = new DataSet1TableAdapters.test_tableTableAdapter();
int currentid=int.Parse(dt1.Rows[i]["id"].ToString());
DataTable dt2 = ta2.GetDataByFatherNode(currentid);
for (int j = 0; j < dt2.Rows.Count; j++)
{
TreeNode tn2 = new TreeNode();
tn2.Text = dt2.Rows[j]["NodeText"].ToString();
tn1.ChildNodes.Add(tn2);
}
TreeView1.Nodes.Add(tn1);
}
}
其中的是读取数据用的,用的是数据集进行的操作.关于数据集的定义请下载本文附带的源码,很简单的,同样,通过数据集的方式来访问数据也很方便.
比较复杂的情况,需要用到递归,比如读取文件目录信息.可以参考我的这篇文章.
附:参考代码下载.数据库在App_Data中,请附加到SqlServer2005里.
---------------------------------------------------------------
aspnetx的BI笔记系列索引:
使用SQL Server Analysis Services数据挖掘的关联规则实现商品推荐功能
---------------------------------------------------------------