在autopostback功能后将焦点设置回正确的文本框(Page.SetFocus无法解决问题)

时间:2015-09-03 19:32:22

标签: c# asp.net textbox autopostback

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

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

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

这就是问题所在。 我不认为这里需要代码,因为它是一个通用的解决方案,可以专注于具有autopostback功能的文本框。 如果需要代码,请在评论中提问。

2 个答案:

答案 0 :(得分:2)

以下内容可让您按照自己的意愿行事:

我们需要做的是让js协助接下来的控制,在这种情况下,任何获得焦点的控件(无论是通过制表符,shift-tab,click,还是任何控件组合都会跳出文本盒子和不同的控制)。通过使用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

<head>

中的

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

ASP控件

在这个例子中,一个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" />

答案 1 :(得分:0)

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