刷新后控制TAB键到下一个控件
生活随笔
收集整理的這篇文章主要介紹了
刷新后控制TAB键到下一个控件
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
頁(yè)面上的控件能一直TAB下去,這是系統(tǒng)的一個(gè)很基本的要求。在網(wǎng)上沒(méi)有搜索到相關(guān)的方法。我覺(jué)得一般做法都是使頁(yè)面無(wú)刷新,但是如果遇到頁(yè)面不得不刷新的情況,如何去控制呢?
?? 思路是很簡(jiǎn)單的,首先是獲取引起postback的控件,?? Control?ocontrol?=?this.FindControl(Request.Form["__EVENTTARGET"]);//"_EVENTTARGET"記錄了上次引發(fā)postback事件的控件ID。 ? 接著我自然會(huì)想到找到該控件的下一個(gè)控件,然后focus(),通過(guò)Page.Controls是可以找到,但是我認(rèn)為這可能無(wú)法避免hardCode,因?yàn)樵诜?wù)器段不好判斷一個(gè)Control是否可以focus().
??找了一些資料,我從 document.onkeydown?=?new?Function("if(event.keyCode==13){event.keyCode=9;}?"); ? 得到啟發(fā),我想,我讓引發(fā)PostBack的控件獲得焦點(diǎn),然后引發(fā)一個(gè)tab鍵的事件,焦點(diǎn)自然會(huì)移到下一個(gè)控件,于是我經(jīng)過(guò)一番折騰,得到了一個(gè)結(jié)論,這是不行的,為什么不行,我也不知道。測(cè)試代碼如下:
?? <%@?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');}?");
??//該事件僅是測(cè)試時(shí)使用
????</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>
? 按我的想法,當(dāng)test失去焦點(diǎn)的時(shí)候引發(fā)事件調(diào)用ControlFocus()函數(shù),然后引發(fā)一個(gè)Tab鍵,結(jié)果Tab鍵是引發(fā)了(測(cè)試時(shí)能彈出'Tab'),但是焦點(diǎn)卻沒(méi)有轉(zhuǎn)移到下一個(gè)控件。查了很多資料也得不到解釋,我想既然能通過(guò)enter鍵轉(zhuǎn)化為tab鍵控制焦點(diǎn),那么我編程引發(fā)tab鍵應(yīng)該有同樣的效果,結(jié)果卻不是,網(wǎng)上也不到有關(guān)的解釋,有高手知道希望解釋一下.
? 沒(méi)辦法,只能通過(guò)在服務(wù)器端找到下一個(gè)控件的辦法來(lái)實(shí)現(xiàn),雖然沒(méi)多高的技術(shù)含量,還是發(fā)出來(lái)給大家看一下: ????????//這里是配置文件寫的可focus的控件,因?yàn)橛惺褂玫谌娇丶?/span>
????????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)
????????????????????{
??????????????//多個(gè)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();
????????????????????????????}
????????????????????????}
????????????????????}
????????????????}
????????????}
????????}
?
?? 發(fā)此文的更多是希望能看到各位的思路,我認(rèn)為要實(shí)現(xiàn)這個(gè)功能應(yīng)該還有更簡(jiǎn)單的方法。
???
??
??
?? 思路是很簡(jiǎn)單的,首先是獲取引起postback的控件,?? Control?ocontrol?=?this.FindControl(Request.Form["__EVENTTARGET"]);//"_EVENTTARGET"記錄了上次引發(fā)postback事件的控件ID。 ? 接著我自然會(huì)想到找到該控件的下一個(gè)控件,然后focus(),通過(guò)Page.Controls是可以找到,但是我認(rèn)為這可能無(wú)法避免hardCode,因?yàn)樵诜?wù)器段不好判斷一個(gè)Control是否可以focus().
??找了一些資料,我從 document.onkeydown?=?new?Function("if(event.keyCode==13){event.keyCode=9;}?"); ? 得到啟發(fā),我想,我讓引發(fā)PostBack的控件獲得焦點(diǎn),然后引發(fā)一個(gè)tab鍵的事件,焦點(diǎn)自然會(huì)移到下一個(gè)控件,于是我經(jīng)過(guò)一番折騰,得到了一個(gè)結(jié)論,這是不行的,為什么不行,我也不知道。測(cè)試代碼如下:
?? <%@?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');}?");
??//該事件僅是測(cè)試時(shí)使用
????</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>
? 按我的想法,當(dāng)test失去焦點(diǎn)的時(shí)候引發(fā)事件調(diào)用ControlFocus()函數(shù),然后引發(fā)一個(gè)Tab鍵,結(jié)果Tab鍵是引發(fā)了(測(cè)試時(shí)能彈出'Tab'),但是焦點(diǎn)卻沒(méi)有轉(zhuǎn)移到下一個(gè)控件。查了很多資料也得不到解釋,我想既然能通過(guò)enter鍵轉(zhuǎn)化為tab鍵控制焦點(diǎn),那么我編程引發(fā)tab鍵應(yīng)該有同樣的效果,結(jié)果卻不是,網(wǎng)上也不到有關(guān)的解釋,有高手知道希望解釋一下.
? 沒(méi)辦法,只能通過(guò)在服務(wù)器端找到下一個(gè)控件的辦法來(lái)實(shí)現(xiàn),雖然沒(méi)多高的技術(shù)含量,還是發(fā)出來(lái)給大家看一下: ????????//這里是配置文件寫的可focus的控件,因?yàn)橛惺褂玫谌娇丶?/span>
????????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)
????????????????????{
??????????????//多個(gè)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();
????????????????????????????}
????????????????????????}
????????????????????}
????????????????}
????????????}
????????}
?
?? 發(fā)此文的更多是希望能看到各位的思路,我認(rèn)為要實(shí)現(xiàn)這個(gè)功能應(yīng)該還有更簡(jiǎn)單的方法。
???
??
??
轉(zhuǎn)載于:https://www.cnblogs.com/yfx1982/archive/2007/12/11/991077.html
總結(jié)
以上是生活随笔為你收集整理的刷新后控制TAB键到下一个控件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何使用SDK连接SBO?
- 下一篇: DotNetNuke(DNN)皮肤制作-