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

Set focus back to the proper textbox after autopostback function (Page.SetFocus doesn't solve the issue)

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

但是如果用户按下 Tab 键怎么办?应该具有焦点的文本框是下一个。 因此,我们采取了一种解决方法,并专注于 TabIndex 高于触发事件的文本框。

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

这就是问题所在。 我认为这里不需要代码,因为它是将焦点设置在具有自动回发功能的文本框上的通用解决方案。 如果需要代码,请在评论中询问。

您可以查看表单的 __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);
        }
    }

以下内容可让您随心所欲:

我们需要做的是让 js 协助下一个控件,在这种情况下,任何获得焦点的控件(无论是通过选项卡、shift-tab、单击,还是跳出的任何控件组合)文本框和不同的控件)。通过使用 WebMethod,我们可以将此信息传递到服务器以获取 AutoPostBack 焦点。

网络方法:

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

很简单,_toFocus 是 class 变量 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

<head>

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

ASP 控件

在这个例子中,一个文本框。注意 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" />