使用TextBox的AutoPostback失去焦点
-
05-07-2019 - |
题
TextBox
设置为 AutoPostback
,因为更改该值会导致重新计算和显示多个(仅显示)字段。
这很好。
然而,当字段被标记出来时,焦点会暂时移动到下一个字段,然后在重新绘制页面时消失,因此任何地方都没有焦点。
我希望焦点放在新字段上,而不是我刚刚更改过的文本框。 有没有办法解决哪个字段有焦点,并在重绘页面时强制它再次使用它?
解决方案
这是“按设计”。如果您使用的是ASP.NET 2.0+,则可以在发生回发后尝试调用TextBox的Focus方法(最好是在TextBox的TextChanged事件中)。
我不确定是否有任何内置方式来跟踪焦点,但我发现 CodeProject中的这篇文章应该可以解决这个问题。
其他提示
您还可以考虑使用AJAX刷新仅显示字段 UpdatePanel的。这样你就不会失去新领域的焦点。
我还建议基于 WebControl.Controls的纯服务器端解决方案 .TabIndex 分析,如果你愿意,你可以使用它。
这就是发生的事情:
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的情况下 。
请查看此答案:让Javascript在Ajax上运行你必须使用这样的代码:
<script type="text/javascript">
Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(BeginRequestHandler);
function EndRequestHandler(sender, args)
{
MyScript();
}
</script>