C# 自动回发功能后将焦点设置回正确的文本框(Page.SetFocus无法解决此问题)

C# 自动回发功能后将焦点设置回正确的文本框(Page.SetFocus无法解决此问题),c#,asp.net,textbox,autopostback,C#,Asp.net,Textbox,Autopostback,现在,这看起来可能是重复的,但它不是。 互联网上的每一个解决方案都向您展示了如何关注触发事件的文本框 但如果用户按tab键呢?应该具有焦点的文本框是下一个文本框。 因此,我们做了一个变通方法,重点关注TabIndex高于触发事件的文本框 但是如果用户按下Shift+tab怎么办? 更糟糕的是:如果用户点击另一个随机文本框怎么办 这就是问题所在。 我认为这里不需要代码,因为这是一个通用的解决方案,可以将焦点设置在具有自动回邮功能的文本框上。 如果需要代码,请在注释中询问。您可以检查表单的\u EV

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

但如果用户按tab键呢?应该具有焦点的文本框是下一个文本框。 因此,我们做了一个变通方法,重点关注TabIndex高于触发事件的文本框

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

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

您可以检查表单的
\u EVENTTARGET
属性,该属性将告诉您引发事件的文本框名称。 场景中,假设我有两个名为
TextBox1
TextBox2
的文本框,用于
AutoPostBack
设置为
true
,并将
textChanged
事件连接到单个处理程序
TextBox1\u textChanged
。您可以使用下面的代码并将焦点设置回特定的textbox控件

    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帮助确定下一个控件是什么,在这种情况下,任何获得焦点的控件(无论是通过tab、shift tab、click还是任何控件组合跳出文本框并跳入另一个控件)。通过使用WebMethod,我们可以将此信息传递到服务器上,以便自动回发焦点

WebMethod: 很简单,_-toFocus是类变量
静态字符串_-toFocus
,它保存要聚焦的下一个控件的值

页面加载 JavaScript 在


函数setFocus(x){
PageMethods.set_nextFocus(x);
}
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" />


似乎不起作用,目标始终是TextBox1,因为TextChanged事件由调用TextBox1@Jason,目标将是导致回发/处理程序到达的文本框。可能是任何形式的文本框。它可能不起作用,因为控件名有输入错误。现在试试,它应该可以正常工作。仍然不起作用,如果你填写文本框,点击tab,它会进入TextChanged处理程序,其中_EVENTTARGET是TextBox1,它不会进入if语句,将焦点设置到下一个控件,效果很好,完美!
<script type="text/javascript">
    function setFocus(x) {
        PageMethods.set_nextFocus(x);
    }
</script>
<asp:TextBox ID="TextBox1" runat="server" AutoPostBack="True" TabIndex="1" 
        ontextchanged="TextBox1_TextChanged" OnFocusIn="setFocus(this.id)" >
</asp:TextBox>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />