【转】TreeView单击事件的BUG修复及深入探讨返回事件

【转自】http://hi.baidu.com/afawwb/blog/item/5e9ab924003874024d088d34.html

 

在Microsoft的TreeView上点击已经选过的节点没有反应,这其实可以通过一定的方法解决:

其实这是TreeView的一个BUG,SelectedIndexChange是节点索引的改变事件,如果某个节点已经被选中,那它就不能触发该事件,那怎么解决呢?
我们来看看TreeView控件在前台生成的代码吧:
<tvns:treeview id="TreeView1" selectedStyle="background-color:blue;" selectedNodeIndex="0" HelperID="__TreeView1_State__" systemImagesPath="/webctrl_client/1_0/treeimages/" onexpand="javascript: if (this.clickedNodeIndex != null) this.queueEvent('onexpand', this.clickedNodeIndex)" oncollapse="javascript: if (this.clickedNodeIndex != null) this.queueEvent('oncollapse', this.clickedNodeIndex)" oncheck="javascript: if (this.clickedNodeIndex != null) this.queueEvent('oncheck', this.clickedNodeIndex)" onselectedindexchange="javascript: if (event.oldTreeNodeIndex != event.newTreeNodeIndex) this.queueEvent('onselectedindexchange', event.oldTreeNodeIndex + ',' + event.newTreeNodeIndex)" onfirequeuedevents="javascript: window.setTimeout('__doPostBack(/'TreeView1/',/'/')', 0, 'JavaScript')" style="background-color:YellowGreen;height:362px;width:112px;">

其中有一个触发该事件的函数就是queueEvent(,),看到触发条件没有:if (event.oldTreeNodeIndex != event.newTreeNodeIndex),我们现在是(event.oldTreeNodeIndex == event.newTreeNodeIndex),怎么办?
别急,我们自己给它加上一个onclick事件来调用该函数就OK了,注意里面的参数也要变喔,否则会出错滴。看看我的代码先:
在后台page_load区加入:
TreeView1.Attributes["onclick"] = "javascript: if(this.clickedNodeIndex != null)this.queueEvent('onselectedindexchange', '' + ',' + this.clickedNodeIndex)";
强调:其中的if(this.clickedNodeIndex != null)要有,否则你点在TreeView除节点以外的地方一样会触发该事件,而函数会找不到节点的索引值的。

深入探讨:
.net的后台代码经服务器编译后发送到客户端,生成相应的脚本,它的返回都是靠前台事件启动的,来让我们看看它在前台都生成了什么。
<input type="hidden" name="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" value="" />

<script language="javascript">
<!--
function __doPostBack(eventTarget, eventArgument) {
   var theform;
   if (window.navigator.appName.toLowerCase().indexOf("netscape") > -1) {
    theform = document.forms["Form1"];
   }
   else {
    theform = document.Form1;
   }
   theform.__EVENTTARGET.value = eventTarget.split("$").join(":");
   theform.__EVENTARGUMENT.value = eventArgument;
   theform.submit();
}
// -->
</script>
看到没有,它生成了两个隐藏的input,它是用来干什么的呢?告诉你吧,它们一个是用来暂存触发事件的控件的ID的,另一个则是用来暂存触发时的参数 的,前台事件会把这两个参数传给__doPostBack()函数,而真正起作用的正是这个__doPostBack()函数,如果我们自己给它加上一个 调用的事件,比如:TextBox1.Attributes["onclick"] = "__doPostBack(Button1,'')",那它不仅可以返回服务器处理,还能调用其它控件的特有函数呢。这样你能做些什么改变自己去想想 吧,不过我要说明一点,这个__doPostBack()函数不是每次后台编译都生成,拉出一个TreeView或者DataGrid它就会有,如果没有 也不用急,我们可以在后台添加它

 

转载于:https://www.cnblogs.com/yencain/articles/1321300.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值