最近项目需要使用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代码了,你可以以任何的代码替代。实际上原理很简单:
- 通过TreeView的客户端ID,获取该容器下的所有链接
- 循环屏蔽节点的链接A的事件(onclick)及href
- 在链接的文本(最终输出<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/