刷新后控制TAB键到下一个控件
点击次数:12 次 发布日期:2008-11-26 10:33:34 作者:源代码网
|
源代码网推荐 思路是很简单的,首先是获取引起postback的控件, Control ocontrol = this.FindControl(Request.Form["__EVENTTARGET"]);//"_EVENTTARGET"记录了上次引发postback事件的控件ID。 接着我自然会想到找到该控件的下一个控件,然后focus(),通过Page.Controls是可以找到,但是我认为这可能无法避免hardCode,因为在服务器段不好判断一个Control是否可以focus(). 源代码网推荐 找了一些资料,我从 document.onkeydown = new Function("if(event.keyCode==13){event.keyCode=9;} "); 得到启发,我想,我让引发PostBack的控件获得焦点,然后引发一个tab键的事件,焦点自然会移到下一个控件,于是我经过一番折腾,得到了一个结论,这是不行的,为什么不行,我也不知道。测试代码如下: 源代码网推荐 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 源代码网推荐 源代码网推荐 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 源代码网推荐 <html xmlns="http://www.w3.org/1999/xhtml"> 源代码网推荐 <head id="Head1" runat="server"> 源代码网推荐 <title>Untitled Page</title> 源代码网推荐 源代码网推荐 <script> 源代码网推荐 function ControlFocus(){ 源代码网推荐 var Ka=document.createEventObject(); 源代码网推荐 Ka.ctrlKey=false; 源代码网推荐 Ka.keyCode=9; 源代码网推荐 document.fireEvent("onkeydown",Ka); 源代码网推荐 } 源代码网推荐 document.onkeydown = new Function("if(event.keyCode==9){alert("Tab");} "); 源代码网推荐 //该事件仅是测试时使用 源代码网推荐 </script> 源代码网推荐 源代码网推荐 </head> 源代码网推荐 <body> 源代码网推荐 <form id="form1" runat="server"> 源代码网推荐 <div> 源代码网推荐 <input type="text" id="test" style="color: Red; border: 0;" onblur="ControlFocus();" /> 源代码网推荐 <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 源代码网推荐 <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox> 源代码网推荐 <asp:TextBox ID="TextBox3" runat="server"></asp:TextBox> 源代码网推荐 <asp:TextBox ID="TextBox4" runat="server"></asp:TextBox> 源代码网推荐 <asp:TextBox ID="TextBox5" runat="server"></asp:TextBox></div> 源代码网推荐 </form> 源代码网推荐 源代码网推荐 </body> 源代码网推荐 </html> 源代码网推荐 按我的想法,当test失去焦点的时候引发事件调用ControlFocus()函数,然后引发一个Tab键,结果Tab键是引发了(测试时能弹出"Tab"),但是焦点却没有转移到下一个控件。查了很多资料也得不到解释,我想既然能通过enter键转化为tab键控制焦点,那么我编程引发tab键应该有同样的效果,结果却不是,网上也不到有关的解释,有高手知道希望解释一下. 源代码网推荐 源代码网推荐 没办法,只能通过在服务器端找到下一个控件的办法来实现,虽然没多高的技术含量,还是发出来给大家看一下: //这里是配置文件写的可focus的控件,因为有使用第三方控件 源代码网推荐 string FocusAbleControlList = System.Configuration.ConfigurationSettings.AppSettings["AbleFocusControlList"]; 源代码网推荐 源代码网推荐 private bool isFocusAble(string ControlType) 源代码网推荐 { 源代码网推荐 if (FocusAbleControlList.IndexOf("," + ControlType + ",") < 0) 源代码网推荐 { 源代码网推荐 return false; 源代码网推荐 } 源代码网推荐 else 源代码网推荐 { 源代码网推荐 return true; 源代码网推荐 } 源代码网推荐 } 源代码网推荐 源代码网推荐 protected override void OnLoad(EventArgs e) 源代码网推荐 { 源代码网推荐 base.OnLoad(e); 源代码网推荐 if (Request.Form["__EVENTTARGET"] != null) 源代码网推荐 { 源代码网推荐 Control ocontrol = this.FindControl(Request.Form["__EVENTTARGET"]); 源代码网推荐 if (ocontrol != null) 源代码网推荐 { 源代码网推荐 foreach(Control con in this.Controls) 源代码网推荐 { 源代码网推荐 //多个from的情况,这里就hardcode了 源代码网推荐 if (con.ID != null && con.ID.ToLower().IndexOf("form") > -1) { 源代码网推荐 int index = con.Controls.IndexOf(ocontrol); 源代码网推荐 if(index != -1) 源代码网推荐 { 源代码网推荐 bool isableFocous = false; 源代码网推荐 while (!isableFocous) 源代码网推荐 { 源代码网推荐 index++; 源代码网推荐 string[] temp = con.Controls[index].ToString().Split("."); 源代码网推荐 string typename = temp[temp.Length - 1]; 源代码网推荐 isableFocous = isFocusAble(typename); 源代码网推荐 } 源代码网推荐 con.Controls[index].Focus(); 源代码网推荐 } 源代码网推荐 } 源代码网推荐 } 源代码网推荐 源代码网推荐 } 源代码网推荐 } 源代码网推荐 } 源代码网推荐 源代码网推荐 发此文的更多是希望能看到各位的思路,我认为要实现这个功能应该还有更简单的方法。 源代码网推荐 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
