刷新后控制TAB键到下一个控件

   页面上的控件能一直TAB下去,这是系统的一个很基本的要求。在网上没有搜索到相关的方法。我觉得一般做法都是使页面无刷新,但是如果遇到页面不得不刷新的情况,如何去控制呢?
   思路是很简单的,首先是获取引起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();
                            }
                        }
                    }

                }
            }
        }

 
   发此文的更多是希望能看到各位的思路,我认为要实现这个功能应该还有更简单的方法。
   
  
  
posted on 2007-12-11 17:36  仁面寿星  阅读(2113)  评论(4编辑  收藏  举报