c# - 由于 OnTextChanged 事件,ASP 控件需要双击才能获得焦点

标签 c# asp.net

我这里有个情况。

我的页面中有大约 5 个 ASP 控件,包括一些文本框和单选按钮。这些控件是表单的一部分,用户将在其中将数据一个一个地填充到这些控件中。现在,问题是这些控件中的每一个都有 AutoPostBack = TrueOnTextChangedOnCheckedChanged与之相关的事件。

问题来了。每当用户填充这些控件之一并尝试导航到下一个控件时,该控件需要双击才能获得焦点。填表的时候每一个控件都要双击,非常不方便。

我试图通过设置 Page.SetFocus(<control>); 来克服这种情况。在每个OnTextChanged事件传递给表单中的下一个控件。但在单选按钮的情况下同样不起作用。当焦点顺序改变时,它也不起作用。

我需要一个解决方法来解决这个问题。我无法删除 OnTextChangedOnCheckedChanged由于要求而发生的事件。

最佳答案

实际发生的是页面被回发,然后焦点转移回导致回发的控件。双击实际上并不是严格发生的。第一次单击导致第一个控件失去焦点,从而导致回发。第二次单击然后在回发发生后聚焦您想要的控件。

您可以做的是捕获在回发之前获得焦点的控件,并在页面重新加载时将焦点设置回该控件。

这是一个示例(已更新):

 <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,以便至少将焦点保留在最后选择的单选按钮上。希望这至少能让你更接近你想要的东西。

关于c# - 由于 OnTextChanged 事件,ASP 控件需要双击才能获得焦点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22141621/

相关文章:

c# - IIS7.5 Server.ClearError()不起作用

c# - Azure Application Insights Analytics 查询联合和列比较

javascript - ASP.NET WebForms - 同时执行 JavaScript 验证和验证控制

asp.net - CSS 样式不适用于 ID

asp.net - 为什么这个错误经常发生 "asp.net, sql server"?

c# - 解除绑定(bind)绑定(bind)源

c# - 如何在与机器人聊天时获取用户的位置?

c# - 从排序列表中删除重复项 C#

c# - asp.net mvc 中的 HttpPostedFileBase 状态

c# - 如何在 Repeater 中应用样式