代码之家  ›  专栏  ›  技术社区  ›  Scott Mitchell

在部分页面回发后在UpdatePanel中选择ASP.NET文本框的内容

  •  1
  • Scott Mitchell  · 技术社区  · 15 年前

    我在IE8中UpdatePanel的文本框中选择文本时遇到问题。请考虑一个包含单个UpdatePanel的非常简单的页面。在该UpdatePanel中有两个Web控件:

    1. 具有三个静态定义的列表项的DropDownList,其AutoPostBack属性设置为True,并且
    2. 文本框Web控件

    DropDownList有一个用于SelectedIndexChanged事件的服务器端事件处理程序,在该事件处理程序中有两行代码:

    TextBox1.Text = "Whatever";
    ScriptManager.RegisterStartupScript(this, 
                          this.GetType(), 
                          "Select-" + TextBox1.ClientID,
                          string.Format("document.getElementById('{0}').select();", 
                                                           TextBox1.ClientID), 
                          true);
    

    其思想是,每当用户从DropDownList中选择和项目时,就会有一个部分页面回发,此时TextBox的Text属性被设置和选择(通过注入的JavaScript)。不幸的是,这不是工作的现状(我还尝试过将脚本放入pageLoad函数,但没有成功,如: 我的剧本 ... }"); )所发生的情况是代码运行,但页面上的其他内容在部分页面回发结束时接收焦点,从而导致TextBox的文本被取消选择。

    我可以通过使用JavaScript的setTimeout来延迟JavaScript代码的执行来“修复”这个问题。例如,如果我将发出的JavaScript更新为以下内容:

    setTimeout("document.getElementById('{0}').select();", 111);
    

    令人困惑的是.Focus()方法工作得很好。也就是说,如果我废弃JavaScript并用调用 TextBox1.Focus(); 然后文本框接收焦点(尽管文本未被选中)。我已经检查了 微软webforms.js 注意,焦点是在注册的脚本运行之后设置的,但我很抱歉,我的JavaScript技能不足以解码这里发生的一切,以及为什么在选中文本和部分页面回发结束之间取消选中所选文本。我还尝试过使用Firebug的JavaScript调试器,看到当我的脚本运行时,TextBox的文本被选中。当我继续一步一步地浏览时,文本仍然处于选中状态,但是在退出脚本的最后一行之后(显然),它突然被取消选中。

    有什么想法吗?我在拔头发。

    提前谢谢。。。

    编辑: 在进一步的测试中,我注意到这种行为只发生在IE8中

    2 回复  |  直到 15 年前
        1
  •  3
  •   Justin    15 年前
    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(
            function(sender, args) {
                document.getElementById('TextBox1.ClientID').focus();
            });
    

        2
  •  2
  •   Adam Sills    15 年前

    我没有经常使用UpdatePanel,因此不知道这在您的特定环境中是否有用,但是使用jQuery document.ready包装器成功地解决了焦点问题。如果您还没有使用jQuery,那么可能需要进行一次测试—尝试更改RegisterStartupScript以输出如下内容:

    $(document).ready(function() {
        document.getElementById('TextBox1.ClientID').select();
    });