.Net中的树
树是很常见,下午写了棵树,不过感觉速度有些慢,但还找不出原因
加载树有两种情况,
l 一种是全部把所有的节点都加载
l 一种是即点即插式
1. 即点即插式,记得去年开发消息系统的时候就遇到这种情况(即点即插式),原因是用户点击某节点时,要去消息服务端去读此节点的子节点,很显然这有个延时,假设您是根据鼠标的坐标来判断读回来的节点的父节点时,问题来了,当然用户点A节点后,马上去点B节点,这时本该A的子节点,全跑到B节点去了.所有解决的办法是点击节点时要把节点的ID也发送服务端上,回来以便找到原来ID.把子节点加上去
2. 全部把所有的节点都加载, 如果节点量大的话,对服务器要求也高,暂时的性能也减小,好处是加载后用户感觉速度快.
下面就把全部加载的例子作为全程介绍
l 确定数据源,一般情况下分为数据库和XML,前者是二维关系的,如果要表示树形结构的话,一定要有个字段作为父子关系的标识,而XML本身就可表示树,所以方便些
为了方便起见,我们采用XML来表示,XML不用.Net本身自带的一些方法来读,为了和数据库一致性,都采用DataSet来封装,表的字段表示如下
图1
生成OpusType.Xml文件来保存数据
读取数据源
Config.cs
public static DataTable GetClassType()
{
DataTable dtOpusClass=new DataTable();
NewDataSet nds=new NewDataSet();
string configFile = HttpContext.Current.Server.MapPath("OpusType.xml");
nds.ReadXml(configFile);
dtOpusClass=(DataTable)nds._Table;
return dtOpusClass;
}
{
DataTable dtOpusClass=new DataTable();
NewDataSet nds=new NewDataSet();
string configFile = HttpContext.Current.Server.MapPath("OpusType.xml");
nds.ReadXml(configFile);
dtOpusClass=(DataTable)nds._Table;
return dtOpusClass;
}
下面开始构造树
Tree.cs
public void maketree()
{
DataView dv= Config.GetClassType().DefaultView;
dv.RowFilter = "FatherID =0"; //选出根
for(int rowindex=0;rowindex < dv.Count ;rowindex ++)
{
TreeNode n= new TreeNode();
n.ID=dv[rowindex].Row["ClassID"].ToString();
n.Text =dv[rowindex].Row["ClassName"].ToString();
maketreedetail(n);//去创建子节点
this.TreeView1.Nodes.Add(n);
}
}
void maketreedetail(TreeNode parent_node)
{
DataView dv= Config.GetClassType().DefaultView;
dv.RowFilter = "FatherID="+parent_node.ID;
for(int rowindex=0;rowindex < dv.Count ;rowindex ++)
{
TreeNode n= new TreeNode();
n.ID=dv[rowindex].Row["ClassID"].ToString();
n.Text =dv[rowindex].Row["ClassName"].ToString();
parent_node.Nodes.Add(n);
maketreedetail(n);//递归构造
}
}
{
DataView dv= Config.GetClassType().DefaultView;
dv.RowFilter = "FatherID =0"; //选出根
for(int rowindex=0;rowindex < dv.Count ;rowindex ++)
{
TreeNode n= new TreeNode();
n.ID=dv[rowindex].Row["ClassID"].ToString();
n.Text =dv[rowindex].Row["ClassName"].ToString();
maketreedetail(n);//去创建子节点
this.TreeView1.Nodes.Add(n);
}
}
void maketreedetail(TreeNode parent_node)
{
DataView dv= Config.GetClassType().DefaultView;
dv.RowFilter = "FatherID="+parent_node.ID;
for(int rowindex=0;rowindex < dv.Count ;rowindex ++)
{
TreeNode n= new TreeNode();
n.ID=dv[rowindex].Row["ClassID"].ToString();
n.Text =dv[rowindex].Row["ClassName"].ToString();
parent_node.Nodes.Add(n);
maketreedetail(n);//递归构造
}
}
需要注意的,DataView作为视图过滤,不用保存为源