首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 兩個 TextBox 聯動賦值避免無限循環:標志位法

     編輯:程式設計綜合問答

兩個 TextBox 互為計算依賴(如金額 ↔ 百分比),在 TextChanged 事件中相互賦值會觸發無限循環。使用布爾標志位鎖定重入可完美解決。

問題代碼(死循環)

private void txtAmount_TextChanged(object sender, EventArgs e) {
  txtPercent.Text = (double.Parse(txtAmount.Text) / 100).ToString(); // 觸發 txtPercent_TextChanged
}

private void txtPercent_TextChanged(object sender, EventArgs e) {
  txtAmount.Text = (double.Parse(txtPercent.Text) * 100).ToString(); // 觸發 txtAmount_TextChanged → 循環
}

標志位解決方案

private bool _isChanging = false;

private void txtAmount_TextChanged(object sender, EventArgs e) {
  if (_isChanging) return;
  _isChanging = true;
  try {
    if (double.TryParse(txtAmount.Text, out double amt))
      txtPercent.Text = (amt / 100).ToString("F2");
  } finally {
    _isChanging = false;
  }
}

private void txtPercent_TextChanged(object sender, EventArgs e) {
  if (_isChanging) return;
  _isChanging = true;
  try {
    if (double.TryParse(txtPercent.Text, out double pct))
      txtAmount.Text = (pct * 100).ToString("F2");
  } finally {
    _isChanging = false;
  }
}

關鍵點

  • _isChanging 為字段級標志,標識「正在程序化修改」
  • try/finally 保證異常時也能重置標志,防止永久鎖死
  • 使用 TryParse 避免格式錯誤拋異常
  • 格式化輸出 ToString("F2") 保持精度一致

替代方案

  1. 事件暫時移除:txtPercent.TextChanged -= handler; ... txtPercent.TextChanged += handler; 代碼繁瑣
  2. 單一來源驅動:只在「確認」按鈕點擊時計算另一值,不實時聯動
  3. MVVM 雙向綁定 (WPF/UWP):UpdateSourceTrigger=PropertyChanged + 轉換器,框架層面處理循環

標志位法簡單、通用、無框架依賴,是 WinForms 處理雙向聯動的首選模式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved