【问题标题】:Set focus back to the proper textbox after autopostback function (Page.SetFocus doesn't solve the issue)在自动回发功能后将焦点设置回正确的文本框(Page.SetFocus 不能解决问题)
【发布时间】:2015-09-03 19:32:22
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# asp.net textbox autopostback


    【解决方案1】:

    以下内容可以让你做你想做的事:

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

    网络方法:

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

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

    页面加载

    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" />
    

    【讨论】:

    • 像魅力一样工作,完美!
    【解决方案2】:

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

    【讨论】:

    • 似乎不起作用,目标始终是 TextBox1,因为 TextBox1 调用了 TextChanged 事件
    • @Jason,目标将是导致回发/处理程序到达的文本框。可以是任何形式的文本框。它可能不起作用,因为控件名称有错字。立即尝试,它应该可以正常工作。
    • 还是不行,如果你填写文本框,点击tab,它会进入_EVENTTARGET是TextBox1的TextChanged处理程序,它不会进入if语句来设置焦点到下一个控件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多