linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘建议留言网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > 开发语言 > asp.net >
栏目导栏
  php
  JSP
  ASP
  asp.net
  JAVA
  c/c++/c#
  perl
  JavaScript
  Basic
  Delphi
资料搜索
热门文章
·NetBPM工作流的一个示例:请假
·asp.net正则表达式语法
·Office Web Components(OWC)绘
·asp.net ajax客户端编程+jquer
·asp.net 2.0 ajax中使用PopupC
·数据源为空时如何让GridView显
·如何让UpdatePanel支持文件上传
·Ado.Net读取Excel常见问题总结
·Brettle.Web.NeatUpload.dll支
·C#.Net的常见面试试题和参考答
·如何使IE的后退按钮无效
·ASP.NET DEMO 15: 同时支持行单
·ASP.NET使用Cookie
·asp.net 2.0 ajax中实现弹出窗
·如何在ASP.NET中用OWC绘制图表
最新文章
·Ajax Control Toolkit Animati
·讨论一下类似BlogEngine内一次
·使用CSS+SiteMap+UserControl+
·Asp.net中多彩下拉框的实现
·浅谈ASP.NET的Postback
·分清ASP.NET AJAX中的Extender
·Tip:在使用AjaxControlTookit
·有关注册DataItem的一些可能被
·IIRF(Ionic's Isapi Rewrite
·asp.net 客户端回调功能的实现
·关于控件部分的看法--读Progra
·为什么在vista上做开发
·如何封装JS和CSS文件为服务器端
·岂今我看过的最强的排序算法
·设计模式学习笔记之单件模式
Google
 
刷新后控制TAB键到下一个控件
[ 作者:  加入时间:2007-12-13 15:53:02  来自:Linux联盟收集整理 ]
页面上的控件能一直TAB下去,这是系统的一个很基本的要求。在网上没有搜索到相关的方法。我觉得一般做法都是使页面无刷新,但是如果遇到页面不得不刷新的情况,如何去控制呢? 3ATLinux联盟
   思路是很简单的,首先是获取引起postback的控件, Control ocontrol = this.FindControl(Request.Form["__EVENTTARGET"]);//"_EVENTTARGET"记录了上次引发postback事件的控件ID。 接着我自然会想到找到该控件的下一个控件,然后focus(),通过Page.Controls是可以找到,但是我认为这可能无法避免hardCode,因为在服务器段不好判断一个Control是否可以focus(). 3ATLinux联盟
   找了一些资料,我从 document.onkeydown = new Function("if(event.keyCode==13){event.keyCode=9;} "); 得到启发,我想,我让引发PostBack的控件获得焦点,然后引发一个tab键的事件,焦点自然会移到下一个控件,于是我经过一番折腾,得到了一个结论,这是不行的,为什么不行,我也不知道。测试代码如下: 3ATLinux联盟
   <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 3ATLinux联盟
   3ATLinux联盟
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 3ATLinux联盟
  <html xmlns="http://www.w3.org/1999/xhtml"> 3ATLinux联盟
  <head id="Head1" runat="server"> 3ATLinux联盟
   <title>Untitled Page</title> 3ATLinux联盟
   3ATLinux联盟
   <script> 3ATLinux联盟
   function ControlFocus(){ 3ATLinux联盟
   var Ka=document.createEventObject(); 3ATLinux联盟
   Ka.ctrlKey=false; 3ATLinux联盟
   Ka.keyCode=9; 3ATLinux联盟
   document.fireEvent("onkeydown",Ka); 3ATLinux联盟
   } 3ATLinux联盟
   document.onkeydown = new Function("if(event.keyCode==9){alert('Tab');} "); 3ATLinux联盟
   //该事件仅是测试时使用 3ATLinux联盟
   </script> 3ATLinux联盟
   3ATLinux联盟
  </head> 3ATLinux联盟
  <body> 3ATLinux联盟
   <form id="form1" runat="server"> 3ATLinux联盟
   <div> 3ATLinux联盟
   <input type="text" id="test" style="color: Red; border: 0;" onblur="ControlFocus();" /> 3ATLinux联盟
   <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 3ATLinux联盟
   <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox> 3ATLinux联盟
   <asp:TextBox ID="TextBox3" runat="server"></asp:TextBox> 3ATLinux联盟
   <asp:TextBox ID="TextBox4" runat="server"></asp:TextBox> 3ATLinux联盟
   <asp:TextBox ID="TextBox5" runat="server"></asp:TextBox></div> 3ATLinux联盟
   </form> 3ATLinux联盟
   3ATLinux联盟
  </body> 3ATLinux联盟
  </html> 3ATLinux联盟
   按我的想法,当test失去焦点的时候引发事件调用ControlFocus()函数,然后引发一个Tab键,结果Tab键是引发了(测试时能弹出'Tab'),但是焦点却没有转移到下一个控件。查了很多资料也得不到解释,我想既然能通过enter键转化为tab键控制焦点,那么我编程引发tab键应该有同样的效果,结果却不是,网上也不到有关的解释,有高手知道希望解释一下. 3ATLinux联盟
   3ATLinux联盟
   没办法,只能通过在服务器端找到下一个控件的办法来实现,虽然没多高的技术含量,还是发出来给大家看一下: //这里是配置文件写的可focus的控件,因为有使用第三方控件 3ATLinux联盟
   string FocusAbleControlList = System.Configuration.ConfigurationSettings.AppSettings["AbleFocusControlList"]; 3ATLinux联盟
   3ATLinux联盟
   private bool isFocusAble(string ControlType) 3ATLinux联盟
   { 3ATLinux联盟
   if (FocusAbleControlList.IndexOf("," + ControlType + ",") < 0) 3ATLinux联盟
   { 3ATLinux联盟
   return false; 3ATLinux联盟
   } 3ATLinux联盟
   else 3ATLinux联盟
   { 3ATLinux联盟
   return true; 3ATLinux联盟
   } 3ATLinux联盟
   } 3ATLinux联盟
   3ATLinux联盟
   protected override void OnLoad(EventArgs e) 3ATLinux联盟
   { 3ATLinux联盟
   base.OnLoad(e); 3ATLinux联盟
   if (Request.Form["__EVENTTARGET"] != null) 3ATLinux联盟
   { 3ATLinux联盟
   Control ocontrol = this.FindControl(Request.Form["__EVENTTARGET"]); 3ATLinux联盟
   if (ocontrol != null) 3ATLinux联盟
   { 3ATLinux联盟
   foreach(Control con in this.Controls) 3ATLinux联盟
   { 3ATLinux联盟
   //多个from的情况,这里就hardcode了 3ATLinux联盟
   if (con.ID != null && con.ID.ToLower().IndexOf("form") > -1) { 3ATLinux联盟
   int index = con.Controls.IndexOf(ocontrol); 3ATLinux联盟
   if(index != -1) 3ATLinux联盟
   { 3ATLinux联盟
   bool isableFocous = false; 3ATLinux联盟
   while (!isableFocous) 3ATLinux联盟
   { 3ATLinux联盟
   index++; 3ATLinux联盟
   string[] temp = con.Controls[index].ToString().Split('.'); 3ATLinux联盟
   string typename = temp[temp.Length - 1]; 3ATLinux联盟
   isableFocous = isFocusAble(typename); 3ATLinux联盟
   } 3ATLinux联盟
   con.Controls[index].Focus(); 3ATLinux联盟
   } 3ATLinux联盟
   } 3ATLinux联盟
   } 3ATLinux联盟
   3ATLinux联盟
   } 3ATLinux联盟
   } 3ATLinux联盟
   } 3ATLinux联盟
   3ATLinux联盟
   发此文的更多是希望能看到各位的思路,我认为要实现这个功能应该还有更简单的方法。 Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·ASP.NET验证控件详解  (2007-12-03 15:34:17)
 ·不使用任何控件的录音程序  (2007-12-03 14:45:22)
 ·ASP.NET动态创建控件之绝境求生  (2007-11-30 13:30:25)
 ·服务器控件中js脚本注册方法  (2007-11-30 13:07:09)
 ·ASP.NET 2.0中使用HiddenField控件  (2007-11-28 13:44:53)
 ·在Repeater控件中创建可隐藏区域  (2007-11-28 13:44:25)
 ·ASP.NET 2.0 服务器控件之复合控件事件  (2007-11-27 17:33:02)
 ·使用c#+(datagrid控件)编辑xml文件  (2007-11-27 17:29:26)
 ·使用 ASP+ DataGrid 控件来创建主视图/详细资料视图  (2007-11-27 17:20:49)
 ·给datagrid控件建立稳固的双向排序(asp.net)  (2007-11-27 16:58:03)