文本框使用AutoPostback会失去焦点

7
一个 TextBox 已经设置为 AutoPostback,因为改变它的值应该导致一些(只读)字段被重新计算和显示。这个功能运行良好。然而,当该字段被切换后,焦点会暂时移动到下一个字段,然后在页面重新绘制时消失,因此没有任何焦点。我想让焦点放在新字段上,而不是我刚刚更改的文本框上。有办法确定哪个字段有焦点并强制它重新拥有焦点吗?
3个回答

4

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

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


1
问题在于我需要将焦点设置到它移动到的控件上。有没有一种方法可以识别它? - Little JB
谢谢你的回答,korchev,但这不是我想要的。我已经澄清了我的问题。 - Little JB
我们尝试了几个不起作用的,而你的确起了作用。感谢你,korchev。 - Little JB

1
这是正在发生的事情:
1)在字段上按TAB键-客户端事件 2)聚焦到下一个字段-客户端事件 3)Postback-服务器事件 4)页面重绘-客户端事件新页面覆盖之前的客户端事件
解决您的问题的方法是:
a)在postback之前获取已获得焦点的元素
<script>
var idSelected;
 $("input").focusin(function () {
         idSelected = this.id;
    });
</script>

b) 存储ClientID(实际上在var idSelected中)在postback之前将其存储在某个地方(即一个带有ViewState = true的隐藏文本框中)

** b) 获取ClientID **(从隐藏的TextBox中提取并将其放入var idSelected中)在postback之后

d) 获取具有ClientID的元素并设置焦点在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即可工作。
请查看此答案:要使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 只是一个函数),以便它们在 postback 时再次被调用。谢谢! - Emmanuel F

1

你也可以考虑使用 AJAX UpdatePanel 刷新仅显示的字段。这样,您就不会从新字段失去焦点。

此外,我提出了基于 WebControl.Controls.TabIndex 分析的纯服务器端solution,如果您喜欢,可以使用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接