簡體   English   中英

WebForms Textbox.TextChanged 事件在按鈕單擊時觸發兩次

[英]WebForms Textbox.TextChanged event is firing twice on button click

似乎有一百個問題非常相似,但似乎沒有一個能解決我的問題。

我有一個非常基本的引導網絡表單,其中包含兩個文本框 - 每個文本框都接受一個序列號,該序列號由連接到 PC 的手持掃描儀填充。 當用戶掃描第一個條形碼時,txtLabelA 的TextChanged事件會觸發一個驗證序列號並將焦點切換到 txtLabelB 的方法。 當用戶掃描第二個條形碼時,它會觸發 txtLabelB 的TextChanged事件。 這會將兩個值插入數據庫中的交叉引用表中,顯示成功消息並清除下一組序列號的表單。 非常直截了當。 這已經完美地工作了很長時間。

然而,最近我被要求在表單中添加一個按鈕,允許用戶手動輸入序列號並單擊提交。 現在一切都搞砸了,因為單擊提交按鈕會觸發OnClickOnTextChanged事件,導致表單回發兩次。 我怎樣才能防止這種情況?

<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 事件,但沒有幫助。

有人有想法嗎?

謝謝。

好的,伙計們,我們找到了解決方案。 我合並了上面兩張海報的建議以找到解決方案。 我從 Daniel 的建議開始,即在按鈕的單擊事件中不添加任何內容,以確保它不會觸發 SyncLabels() 方法,但僅此一項並不能完全解決它,因為事件本身仍在導致回發。 訣竅是在上面的 Bmils 注釋中添加一個無意義的 javascript function 到按鈕的 OnClientCLick() 事件。 這使我能夠“返回:false;”,有效地阻止了客戶端的第二次回發。 謝謝你們的意見。 在你的幫助下,我不會解決這個問題。

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

使用 AutoPostBack 屬性指定當 TextBox 控件失去焦點時是否自動回發到服務器。 在 TextBox 控件中按 ENTER 或 TAB 鍵是更改焦點的最常用方法。

以我個人的經驗,條形碼掃描儀本質上是模仿用戶輸入條形碼編號然后按 ENTER 鍵。 如果用戶手動輸入條形碼編號,然后單擊“提交”按鈕,則 TextBox 無論如何都會失去焦點並導致額外的回發。

建議:刪除 Button.Click 事件(或至少刪除 Click 處理程序中的邏輯。)

注意:如果 TextBox 控件的父容器包含標記為默認按鈕的按鈕(例如,如果設置了容器的 DefaultButton 或 DefaultButton 屬性),則不會引發默認按鈕的 Click 事件以響應自動回發。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM