Я создаю простую форму в C # Windows Forms и сталкиваюсь с общей ситуацией, когда один элемент управления может изменять состояние другого, но события обоих элементов управления вызывают другой метод.
Например, рассмотрим Checkbox
и NumericUpDown
, где состояние или значение любого из них должно инициировать что-то для перерисовки. NumericUpDown
зависит от Checkbox
, означающего, что его можно отключить или игнорировать, если не отмечен Checkbox
.
Однако пользователю удобно изменить значение NumericUpDown
и автоматически проверить Checkbox
, если оно еще не было.
Итак, вот методы, о которых идет речь:
private void chkState_CheckedChanged(object sender, EventArgs e)
{
RedrawStuff();
}
private void numStateValue_ValueChanged(object sender, EventArgs e)
{
if (!chkState.Checked)
chkState.Checked = true;
RedrawStuff();
}
Проблема, конечно, в том, что при изменении значения NumericUpDown
дважды запускается RedrawStuff()
.
Мой обходной путь - ввести логическое значение, где я могу эффективно отрицать это поведение, но иногда оно может запутаться:
bool _preventStateChange;
private void chkState_CheckedChanged(object sender, EventArgs e)
{
if (_preventStateChange)
return;
RedrawStuff();
}
private void numStateValue_ValueChanged(object sender, EventArgs e)
{
_preventStateChange = true;
if (!chkState.Checked)
chkState.Checked = true;
RedrawStuff();
_preventStateChange = false;
}
Это лучший способ справиться с этой ситуацией?