ATextBox
设置AutoPostback
为更改值应导致重新计算和显示许多(仅显示)字段。
这很好用。
但是,当该字段退出时,焦点会短暂移动到下一个字段,然后在重新绘制页面时消失,因此任何地方都没有焦点。
我希望重点放在新字段上,而不是我刚刚更改的文本框。有没有办法确定哪个字段有焦点并在重绘页面时强制它再次拥有它?
ATextBox
设置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>