涂雅[博客园]
最新文章请访问独立博客:http://iove.net

最近项目需要使用TreeView,客户说点击一下刷屏很不爽,查了查TreeView,发现MS居然不提供客户端响应事件的功能,也就说一定要使用服务器端响应事件,这个白痴的MS,很多时候TreeView是不需要服务器响应的,居然把什么都做到服务器中去,想考验服务器的水平啊。
先是到网上找了一大堆资料,结果发现都不能解决问题,过程就不说了,结果才是别人的,过程就留给自己吧。最后还是自己想办法,基本的思路是从客户端相办法。在客户端用javascript把树的节点链接中的onclick及href给替换掉,有了这个思路就好解决了。看代码:

     var treeView = document.getElementById("<% = this.treeClass.ClientID %>");  //获取容器对象
     var items = treeView.getElementsByTagName("A");  //获取所有A的tag(也就是链接了)
   //循环替换
     for(var i = 0; i < items.length; i++)
     {
         var eventStr = items[i].href;
        //要判断链接中是否包含TreeView_ToggleNode,因为TreeView_ToggleNode这个函数是负责折叠的,所以不能置空
         if (eventStr.indexOf("TreeView_ToggleNode") == -1)
         {
             items[i].onclick = "";   //将链接的onclick事件置空
             items[i].href = "###";
         }
     }

然后我们在创建树的时候:

 TreeNode  node = new TreeNode();
 node.Value = value;
 node.Text = string.Format(
 "<span onclick="return ClickNode('{0}','{1}', this)">{0}</span>", 
 text, value);

这里的ClickNode就是客户端的JS代码了,你可以以任何的代码替代。实际上原理很简单:

  1. 通过TreeView的客户端ID,获取该容器下的所有链接
  2. 循环屏蔽节点的链接A的事件(onclick)及href
  3. 在链接的文本(最终输出<a></a>中间的内容)加入<span onclick=Event>Text</span>

说明:今天发现了一个方法,就是把node的SelectAction设置为TreeNodeSelectAction.Expand或者TreeNodeSelectAction.None可以解决这个问题,我为我自己的无知向读者道歉,并为自己未了解TreeView的功能而向微软抱怨及大放厥词感到羞愧。我决定不删除这篇文章,以警示我在以后的道路上谨慎求知。

  

注意:本文为我的独立博客镜像博客,自发表不再更新,原文可能随时被更新,敬请访问原文。同时,请大家不要在此评论,如果有什么看法,请点击这里:http://iove.net/1705/

本文来自http://iove.net,欢迎转载,转载敬请保留相关链接,否则视为侵权,原文链接:http://iove.net/1705/

posted on 2008-01-16 09:03  Conis  阅读(262)  评论(0)    收藏  举报