使用TextBox的AutoPostback失去焦点

时间:2008-10-06 10:27:29

标签: asp.net textbox focus autopostback

TextBox设置为AutoPostback,因为更改该值会导致重新计算并显示多个(仅显示)字段。
这很好。

然而,当字段被标记出来时,焦点会暂时移动到下一个字段,然后在重新绘制页面时消失,因此任何地方都没有焦点。

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

此外,我根据 WebControl.Controls.TabIndex 分析提出了纯服务器端solution,如果您愿意,可以使用它。

答案 2 :(得分:1)

这就是发生的事情:

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的元素并设置焦点在回发后

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