【问题标题】:AutoPostback with TextBox loses focus带有 TextBox 的 AutoPostback 失去焦点
【发布时间】:2008-10-06 10:27:28
【问题描述】:

TextBox 设置为 AutoPostback,因为更改值会导致重新计算和显示许多(仅显示)字段。
效果很好。

但是,当该字段被选项卡出来时,焦点会短暂移动到下一个字段,然后在重新绘制页面时消失,因此任何地方都没有焦点。

我希望将焦点放在新字段上,而不是我刚刚更改的文本框上。 有没有办法确定哪个字段具有焦点并在重绘页面时强制它再次拥有它?

【问题讨论】:

    标签: asp.net textbox focus autopostback


    【解决方案1】:

    这是“设计使然”。如果您使用的是 ASP.NET 2.0+,则可以在回发发生后尝试调用 TextBox 的 Focus 方法(最好在 TextBox 的 TextChanged 事件中)。

    我不确定是否有任何内置方法来跟踪焦点,但我在 CodeProject 中找到了 this 文章,它应该可以解决问题。

    【讨论】:

    • 问题是我需要将焦点设置到它移动到的控件上。有没有办法识别?
    • 感谢您的回答,korchev,但这并不是我想要的。我已经澄清了我的问题。
    • 我们尝试了一些不起作用的方法。你的做到了。谢谢,科尔切夫。
    【解决方案2】:

    您还可以考虑使用 AJAX UpdatePanel 刷新仅显示字段。这样您就不会失去对新领域的关注。

    另外我根据WebControl.Controls.TabIndex分析提出了纯服务端solution,你可以用,如果你喜欢。

    【讨论】:

      【解决方案3】:

      这是正在发生的事情:

      1) 字段上的 TAB - 客户端事件
      2) 关注下一个领域 - 客户事件
      3) 回发 - 服务器事件
      4) 页面重绘 - 客户端事件新页面覆盖先前的客户端事件

      您的问题的解决方案是:

      a) 在回发之前获取获得焦点的元素

      <script>
      var idSelected;
       $("input").focusin(function () {
               idSelected = this.id;
          });
      </script>
      

      b) 在回发之前存储 ClientID(实际上是在 var idSelected某处(即隐藏的文本框,vith ViewState = true)

      ** b) 回发后获取 ClientID **(从隐藏的 TextBox 中提取并放入 var idSelected

      d) 使用 ClientID 获取元素并设置焦点 AFTER postback

      <script>
      $(document).ready(function () {
        if (idSelected != null) {
             $("#" + idSelected).focus();
             idSelected = null;
           });
      });
      </script>
      

      注意:此示例脚本使用 JQuery
      请记住将Jquery.js 放入您的解决方案并在您的页面中添加参考

      <form id="form1" runat="server" enctype="multipart/form-data" method="post">
         <asp:ScriptManager   runat="server" >
        <Scripts>
         <asp:ScriptReference Path="~/Scripts/jquery.js" ScriptMode="Auto" />
      ....
      

      注意 2:此解决方案无需 AJAX
      看看this answer:要让Javascript在Ajax上工作,你必须使用这样的代码:

      <script type="text/javascript">
        Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(BeginRequestHandler);
      
        function EndRequestHandler(sender, args)
        {
          MyScript(); 
        }   
      </script>
      

      【讨论】:

      • 这对我来说是一个非常有用的解决方案,尽管我必须将它们都放入Sys.Application.add_load(LoadHandler)(其中LoadHandler 只是一个函数),以便在回发时再次调用它们。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      • 2020-05-27
      相关资源
      最近更新 更多