兩個 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") 保持精度一致txtPercent.TextChanged -= handler; ... txtPercent.TextChanged += handler; 代碼繁瑣UpdateSourceTrigger=PropertyChanged + 轉換器,框架層面處理循環標志位法簡單、通用、無框架依賴,是 WinForms 處理雙向聯動的首選模式。