Я работаю с DataGridView и использую событие CellValueChanged
.
Я не хочу, чтобы это событие запускалось, когда я изменяю значение ячейки с помощью кода. Однако я хочу, чтобы он запускался, когда пользователь редактирует его.
Вот почему я заключаю свои операции по изменению значений ячеек в следующий код:
void changeCellOperation()
{
dgv.CellValueChanged -= new DataGridViewCellEventHandler(dgv_CellValueChanged);
...
cell.Value = myNewCellValue
...
dgv.CellValueChanged += new DataGridViewCellEventHandler(dgv_CellValueChanged);
}
В итоге у меня появилось несколько разных функций, в которых мои ячейки DataGridView обновляются таким образом.
Поскольку эти функции вызываются из разных мест и могут быть вложенными, я не могу позволить себе оставить этот код как есть, чтобы избежать повторной активации нежелательного события.
Итак, я закончил так:
int valueChangedEventMask = 0;
void changeCellOperation()
{
valueChangedEventMask++;
...
cell.Value = myNewCellValue
...
valueChangedEventMask--;
}
void dgv_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (valueChangedEventMask > 0)
return
...
}
Это прекрасно работает. Также, когда вызовы вложены, в том числе внутри самого события.
Но событие CellValueChanged
теперь запускается слишком много раз без причины.
Поскольку мне часто приходится сталкиваться с этим шаблоном, я ищу решение, которое может быть применимо в целом для событий в пользовательских интерфейсах, а не только для DataGridView.
Итак, мой вопрос:
Каков лучший совет, чтобы правильно замаскировать события пользовательского интерфейса и избежать ненужных срабатываний событий?