![](/img/trans.png)
[英]TextBox.TextChanged event firing twice on Windows Phone 7 emulator
[英]WebForms Textbox.TextChanged event is firing twice on button click
似乎有一百個問題非常相似,但似乎沒有一個能解決我的問題。
我有一個非常基本的引導網絡表單,其中包含兩個文本框 - 每個文本框都接受一個序列號,該序列號由連接到 PC 的手持掃描儀填充。 當用戶掃描第一個條形碼時,txtLabelA 的TextChanged事件會觸發一個驗證序列號並將焦點切換到 txtLabelB 的方法。 當用戶掃描第二個條形碼時,它會觸發 txtLabelB 的TextChanged事件。 這會將兩個值插入數據庫中的交叉引用表中,顯示成功消息並清除下一組序列號的表單。 非常直截了當。 這已經完美地工作了很長時間。
然而,最近我被要求在表單中添加一個按鈕,允許用戶手動輸入序列號並單擊提交。 現在一切都搞砸了,因為單擊提交按鈕會觸發OnClick和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 事件,但沒有幫助。
有人有想法嗎?
謝謝。
好的,伙計們,我們找到了解決方案。 我合並了上面兩張海報的建議以找到解決方案。 我從 Daniel 的建議開始,即在按鈕的單擊事件中不添加任何內容,以確保它不會觸發 SyncLabels() 方法,但僅此一項並不能完全解決它,因為事件本身仍在導致回發。 訣竅是在上面的 Bmils 注釋中添加一個無意義的 javascript function 到按鈕的 OnClientCLick() 事件。 這使我能夠“返回:false;”,有效地阻止了客戶端的第二次回發。 謝謝你們的意見。 在你的幫助下,我不會解決這個問題。
使用 AutoPostBack 屬性指定當 TextBox 控件失去焦點時是否自動回發到服務器。 在 TextBox 控件中按 ENTER 或 TAB 鍵是更改焦點的最常用方法。
以我個人的經驗,條形碼掃描儀本質上是模仿用戶輸入條形碼編號然后按 ENTER 鍵。 如果用戶手動輸入條形碼編號,然后單擊“提交”按鈕,則 TextBox 無論如何都會失去焦點並導致額外的回發。
建議:刪除 Button.Click 事件(或至少刪除 Click 處理程序中的邏輯。)
注意:如果 TextBox 控件的父容器包含標記為默認按鈕的按鈕(例如,如果設置了容器的 DefaultButton 或 DefaultButton 屬性),則不會引發默認按鈕的 Click 事件以響應自動回發。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.