在自动回发功能之后将焦点设置回正确的文本框(Page.SetFocus 不能解决问题)



现在,这可能看起来是重复的,但它不是。互联网上的每个解决方案都向您展示了如何将焦点放在触发事件的文本框上。

但是如果用户按tab键呢?应该有焦点的文本框是下一个。所以我们做了一个变通,把焦点放在TabIndex高于触发事件的那个文本框上。

但是如果用户按下Shift+tab呢?更糟糕的是:如果用户点击另一个随机文本框怎么办?

这就是问题所在。我不认为这里需要代码,因为它是一个通用的解决方案,以集中在具有自动回退功能的文本框。如果需要代码,请在评论中询问。

你可以这样做:

我们需要做的是有js协助什么控制将是下一个,在这种情况下,任何控制得到焦点(无论是通过tab, shift-tab,点击,或任何控制组合跳出文本框和到不同的控制)。通过使用WebMethod,我们可以将此信息传递到服务器以进行AutoPostBack焦点。

WebMethod:

[WebMethod]
public static void set_nextFocus(string id)
{
    _toFocus = id;
}

很简单,_toFocus是类变量static string _toFocus,它保存下一个要关注的控件的值。

Page_Load

protected void Page_Load(object sender, EventArgs e)
{
    if (Page.IsPostBack)
    {
        //sets focus to the proper control
        Page.SetFocus(Page.FindControl(_toFocus));
    }
}
JavaScript

in <head>

<script type="text/javascript">
    function setFocus(x) {
        PageMethods.set_nextFocus(x);
    }
</script>
<<h2> ASP控制/h2>

在这个例子中,一个TextBox。注意OnFocusIn的使用。它是ASP控件的一个expando属性,它将实现没有服务器端定义,并恢复为javascript的onfocusin属性。

<asp:TextBox ID="TextBox1" runat="server" AutoPostBack="True" TabIndex="1" 
        ontextchanged="TextBox1_TextChanged" OnFocusIn="setFocus(this.id)" >
</asp:TextBox>

另外,为了使用PageMethods,您必须在表单中启用它,像这样:

<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />

你可以检查表单的__EVENTTARGET属性,它会告诉你事件被引发的文本框名称。在这种情况下,假设我有两个名为TextBox1TextBox2的文本框,将AutoPostBack设置为true,并将textChanged事件连接到单个处理程序TextBox1_TextChanged。您可以使用下面的代码并将焦点设置回特定的文本框控件

    protected void TextBox1_TextChanged(object sender, EventArgs e)
    {
        string target = Request.Form["__EVENTTARGET"];
        if (target == "Textbox2") //conrol name should be exact
        {
            Page.SetFocus(this.TextBox2);
        }
    }

最新更新