我在这里遇到了一个情况。
我的页面中有大约5个ASP控件,包括一些文本框和单选按钮。这些控件是表单的一部分,用户将逐个填充数据到这些控件中。现在,问题是这些控件中的每一个都有与之关联的AutoPostBack = True
和OnTextChanged
或OnCheckedChanged
事件。
这就是问题所在。每当用户填充其中一个控件并尝试导航到下一个控件时,该控件需要双击才能获得焦点。填写表格时双击每个控件非常不方便。
我尝试通过在每个Page.SetFocus(<control>);
事件中将OnTextChanged
设置为表单中的下一个控件来解决问题。但是在单选按钮的情况下同样不起作用。当焦点序列发生变化时,它也不起作用。
我需要一个解决问题的解决办法。由于要求,我无法移除OnTextChanged
或OnCheckedChanged
事件。
答案 0 :(得分:1)
实际发生的是页面被回发,然后焦点转移回导致回发的控件。实际上并没有严格的双击。第一次单击会导致第一个控件失去焦点,从而导致回发。然后第二次单击会在回发发生后聚焦所需的控件。
您可以执行的操作是捕获在回发之前已获得焦点的控件以及页面重新加载时将焦点重新设置回该控件。
以下是一个示例(已更新):
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<div>
<asp:TextBox ID="TextBox1" runat="server" OnTextChanged="TextBox1_TextChanged" AutoPostBack="True"
onFocus="SetNextControl(this);"></asp:TextBox>
<asp:RadioButton ID="RadioButton1" runat="server" OnCheckedChanged="RadioButton1_CheckedChanged"
AutoPostBack="True" GroupName="RBGroup" onClick="SetNextControl(this);" />
<asp:RadioButton ID="RadioButton2" AutoPostBack="True" GroupName="RBGroup" runat="server" onClick="SetNextControl(this);"/>
<asp:TextBox ID="TextBox2" runat="server" OnTextChanged="TextBox2_TextChanged" AutoPostBack="True"
onFocus="SetNextControl(this);"></asp:TextBox>
</div>
<asp:HiddenField ID="HiddenField1" runat="server" />
<script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function() {
if (document.getElementById("<%=HiddenField1.ClientID %>").value != "") {
var controlToFocus = document.getElementById(document.getElementById("<%=HiddenField1.ClientID %>").value);
controlToFocus.focus();
document.getElementById("<%=HiddenField1.ClientID %>").value = "";
}
})
function SetNextControl(e) {
document.getElementById("<%=HiddenField1.ClientID %>").value = e.id;
}
</script>
</asp:Content>
上面的示例并不完美,我不确定它是否会按照您想要的方式使用RadioButtons,因为它们没有onFocus事件。我已将它们更改为使用onClick,以便至少焦点仍保留在最后选择的单选按钮上。希望这至少让你更接近你想要的东西。