求助:ASP.NET中Timer事件触发输入框onChange(输入时触发)
解决方案:Timer异步回发触发TextBox TextChanged的问题
方案1:服务器端判断回发来源,跳过Timer触发的TextChanged事件
在TextBox1_TextChanged方法中,检查当前回发是否由Timer触发,若是则直接跳过逻辑执行:
Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged ' 校验回发是否来自Timer1 If Page.Request.Params("__EVENTTARGET") = Timer1.UniqueID Then Return End If lblNewText.Text = TextBox1.Text End Sub Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick lblTimer.Text = CInt(lblTimer.Text) + 1 End Sub
方案2:客户端控制编辑状态,避免Timer回发时触发事件
通过JavaScript标记用户是否正在编辑文本框,在Timer回发前后临时禁用/恢复TextBox的事件绑定,同时保留编辑焦点:
首先在页面添加客户端脚本:
<script type="text/javascript"> var isEditing = false; // 文本框获取焦点时标记为编辑中 function textBoxFocus() { isEditing = true; } // 文本框失去焦点时取消标记 function textBoxBlur() { isEditing = false; } // 拦截Timer回发请求,编辑中时移除TextBox的事件绑定 Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(BeginRequestHandler); Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler); function BeginRequestHandler(sender, args) { if (isEditing) { var textBox = document.getElementById('<%= TextBox1.ClientID %>'); textBox.onchange = null; } } function EndRequestHandler(sender, args) { if (isEditing) { var textBox = document.getElementById('<%= TextBox1.ClientID %>'); // 恢复TextChanged的回发绑定 textBox.onchange = function() { __doPostBack('<%= TextBox1.UniqueID %>', ''); }; // 重新聚焦文本框 textBox.focus(); } } </script>
然后修改TextBox的属性,绑定客户端焦点事件:
<asp:TextBox ID="TextBox1" runat="server" onfocus="textBoxFocus()" onblur="textBoxBlur()" />
方案3:改为手动触发文本框提交(适合非即时响应场景)
关闭TextBox的自动回发,添加按钮让用户主动提交内容:
修改前台UpdatePanel代码:
<asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="false"> <Triggers> <asp:AsyncPostBackTrigger ControlID="btnSubmit" EventName="Click" /> </Triggers> <ContentTemplate> <div> <asp:TextBox ID="TextBox1" runat="server" AutoPostBack="false" /> <asp:Button ID="btnSubmit" runat="server" Text="提交" /> <asp:Label ID="lblNewText" runat="server" Text="-" /> </div> </ContentTemplate> </asp:UpdatePanel>
后台添加按钮点击事件:
Private Sub btnSubmit_Click(sender As Object, e As EventArgs) Handles btnSubmit.Click lblNewText.Text = TextBox1.Text End Sub
内容的提问来源于stack exchange,提问作者Web4Deb
相关产品推荐
相关产品推荐

