单击按钮时 WebForms Textbox.TextChanged 事件触发两次

WebForms Textbox.TextChanged event is firing twice on button click

似乎有一百个问题非常相似,但 none 似乎解决了我的问题。

我有一个非常基本的 bootstrap 网络表单,带有两个文本框 - 每个文本框都接受一个序列号,该序列号由连接到 PC 的手持扫描仪填充。当用户扫描第一个条形码时,txtLabelA 的 TextChanged 事件会触发一个方法来验证序列号并将焦点切换到 txtLabelB。当用户扫描第二个条形码时,它会为 txtLabelB 触发 TextChanged 事件。这会将这两个值插入到数据库中的交叉引用 table 中,显示成功消息并清除下一组序列号的表单。非常直接。这已经完美地工作了很长时间。

但是,最近有人要求我在表单中添加一个按钮,允许用户手动输入序列号并单击提交。现在一切都搞砸了,因为单击提交按钮会触发 OnClick AND OnTextChanged 事件导致表单回发两次。我该如何防止这种情况?

<div class="card-body">
            <div class="form-group">                    
                <asp:TextBox ID="txtLabelA" runat="server" EnableViewState="true" CssClass="form-control" AutoPostBack="true" OnTextChanged="txtLabelA_TextChanged"></asp:TextBox>
                <span class="help-block"></span>
            </div>               
            <div class="form-group">
                <asp:TextBox ID="txtLabelB" runat="server" EnableViewState="true" CssClass="form-control" AutoPostBack="true" OnTextChanged="txtLabelB_TextChanged"></asp:TextBox>
                <span class="help-block"></span>
            </div>
            <div class="form-group">
                <asp:Button ID="btnSubmit" runat="server" Text="Submit" CssClass="btn btn-primary" OnClick="btnSubmit_Click" />
                <asp:Button ID="btnCancel" runat="server" Text="Clear" CssClass="btn btn-secondary" OnClick="btnCancel_Click" />
                <div style="margin-top: 10px;">
                    <p>
                        <asp:Label ID="lblError" runat="server" CssClass="text-danger"></asp:Label>
                        <asp:Label ID="lblSuccess" runat="server" CssClass="text-success"></asp:Label>
                    </p>
                </div>
            </div>
        </div>

下面是一段代码(内容不多):

 protected void txtLabelA_TextChanged(object sender, EventArgs e)
    {
        GetLabelDetails();
    }
 protected void txtLabelB_TextChanged(object sender, EventArgs e)
    {
        SyncLabels();
    }

 protected void btnSubmit_Click(object sender, EventArgs e)
    {
        SyncLabels();
    }

我什至尝试将按钮的 OnClick 事件更改为 OnTextChanged 事件,但没有帮助。

有没有人有什么想法?

谢谢。

https://docs.microsoft.com/en-us/dotnet/api/system.web.ui.webcontrols.textbox.autopostback?view=netframework-4.8

Use the AutoPostBack property to specify whether an automatic postback to the server will occur when the TextBox control loses focus. Pressing the ENTER or the TAB key while in the TextBox control is the most common way to change focus.

根据我个人的经验,条形码扫描仪基本上模仿用户输入条形码编号然后按下 ENTER 键。如果用户手动输入条形码编号,然后单击“提交”按钮,那么 TextBox 无论如何都会失去焦点并导致额外的回传。

建议:删除 Button.Click 事件(或至少是 Click 处理程序中的逻辑。)

Note: If the TextBox control's parent container contains a button marked as the default button (for example, if the container's DefaultButton or DefaultButton property is set), the default button's Click event is not raised in response to the automatic postback.

好的伙计们,我们找到了解决方案。我合并了上面两个海报的建议以找到解决方案。我从 Daniel 的建议开始,不在按钮的单击事件中放置任何内容,以确保它不会触发 SyncLabels() 方法,但仅凭这一点并不能完全解决问题,因为事件本身仍在导致回发。诀窍是包括 Bmils 上面的注释,以向按钮的 OnClientCLick() 事件添加无意义的 javascript 函数。这使我能够“return: false;”,有效地阻止了客户端的第二次回发。谢谢你们的投入。在你的帮助下我无法解决这个问题。