一
-----TreeView第一次修订-------
1.目标:通过触发0级节点的展开事件,达到只加载此节点下的所有1级子节点,而没有触发的0级节点的子节点不需要加载
2.实现:每个节点前面会有一个加号,点击加号就会触发节点展开事件tv_TreeNodeExpanded,从而加载此节点下的子节点数据
3.局限:第一次只显示0级节点时(没有1级子节点),用TreeView控件显示的数据前面并没有加号,这样就意味着不能用
节点的展开事件了。
4.解决上面的局限(如何让节点前有一个加号):
1.初步解决方法:在显示0级节点的时候,把1级节点也全部加载,其主要目的就是让其在前面有一个加号,
可以触发节点的展开事件
2.第一次改进:
1.前次问题:由于上面第4步为了让TreeView控件显示一个加号,多加了整整一级的数据(如:页面加载的时候,
为了有一个加号,需要把所有0级节点的1级子节点都加载上,而事实上,用户只需要知道所有0级节点
同样,在用户点击其中的一个0级节点时,会加载此节点下所有2级子节点,而事实上只需要此节点下的1级节点。
2.主要改进:这次主要是性能上的改进,没有方法上的突破,还是在页面加载的时候,加载所有0级节点和1级节点
只不过加载1级节点的时候,只加载1条数据,即:在第一次页面加载的时候,加载所有0级节点及每个0级节点下的
“一个”1级节点,当点击某个0级节点的时候,先清除此节点下的子节点,再加载所有1级节点及每一个1级节点下
的“一个”2级节点,其中“一个”打了引号,表示用户不需要看见的节点,只查询一条数据,比如:用户点湖北
省:加载所有湖北省的市,同时每个市下面加载一个区(每个市下面只加载一个区,而不是加载该市下所有的区)
3.第二次改进:方法上的突破,是写文档到这里的时候突然想起来的,呵呵。
页面加载的时候,加载所有0级节点 同时每个0级节点下加载"一条"数据(这条数据可以是任意的,不一定要从数
据库查询,node.ChildNodes.Add(new TreeNode());这样每次加载0级节点的时候,就会有加号了,
同时也不用从数据库读取1级节点)这对我来说确实是一个令人兴奋的消息,呵呵
5.问题:上面的第二次改进有一个问题:如果节点下没有子节点,前面也会有一个加号,这样很可能迷惑用户
二
---------TreeView第二次修订的部分---------
1.第三次改进(这次把查数据 换成存储过程了):
目标:在加载页面的时候,如果0级节点下有子节点则前面有加号,如果没有子节点则没有加号
实现:在上次改进的基础上,加一个判断,原先是:在页面加载的时候,加载所有0级子节点,同时每个0级节点下加载
"一条"数据,现在在加载"一条"数据的前面加一个判断,是否这个0级节点有子节点。
2.问题及待改进:
1.第三次改进与第二次比较,实际上在遍历里面加了条件判断,而且每遍历一次都多了一次查询数据库,
我不知道对性能会有多大的影响,特别是在遍历里加条件判断,感觉会很影响性能
2.这个数据没有自增长列,我加一个自增长列应该没问题吧,呵呵
3.觉得添加根节点和添加子节点的函数很相似,想把他们和在一起。
4.每次点节点的时候,会清除子节点,然后再加载,这样不好,我只希望第一次触发那个节点的时候清除此节点的
子节点,而以后保持就可以了,不清除也不重新加载
三.关键代码:
1. 在页面加载的时候,加载所有0级节点,同时每个0级节点下加载"一条"数据,在加载之前判断下是否有子节点
DataSet sub_ds = GetDataSet("sp_searchSingleRecord", Convert.ToInt32(childNode.Value));
if (sub_ds.Tables[0].Rows.Count != 0)
{
//加载"一个"1级节点
childNode.ChildNodes.Add(new TreeNode());
}