Здравствуйте.
Давно назрел вопрос но все никак не могу найти объективное решение.
Допустим у меня есть два объекта которые завязаны на одно событие.
В событии производится некоторая операция которая опять приводит к срабатыванию того же самого события. Существует ли какой нибудь способ в C# поставить игнор в определенном месте но чтобы событие не ожидало (Mutex, lock) а игнорировало выполнение.
Сейчас я просто создаю логический флаг
bool BlockChanging = false;
private void lvUserGrid_ColumnWidthChanged(object sender, DataGridViewColumnEventArgs e)
{
if (!BlockChanging)
{
BlockChanging = true;
.. какой то код...
BlockChanging = false;
}
}
Код работает но создавать кучу флагов как то кажется неправильным.
почему кучу? ровно столько, сколько процедур с критическим кодом (которые не должны вызываться повторно (реентерабельно)), пока тело процедуры не выполнилось.
я бы только имя переменным дал исходя из имени метода, к которому они относятся
например, для lvUserGrid_ColumnWidthChanged переменная islvUserGrid_ColumnWidthChanged_Execute
это раз.
а теперь второе.
многие методы для обработки изменений можно выключать обработчик в начале и включать в конце.
например,
private void lvUserGrid_ColumnWidthChanged(object sender, DataGridViewColumnEventArgs e)
{
sender.ColumnWidthChanged -= lvUserGrid_ColumnWidthChanged; // условно так
.. какой то код...
sender.ColumnWidthChanged += lvUserGrid_ColumnWidthChanged; // условно так
}
кто сказал - что нет? я про такой не знаю, но это совершенно не говорит о том, что такого механизма нет.
кстати, а какой такой страшный код скрывается за
что он не допускает повторного вызова?
ведь как раз встроенный механизм сам отработает несколько одновременных вызовов и, в общем случае, конфликт не должен возникать.
Да ничего страшного просто там нужно все столбцы сделать по ширине такими же как последний измененный. И если не закрывать обработчик то они будут бесконечно друг друга порождать пока не вылетят в Exception.
А чего там может быть такого встроенного? В делфи, например, или флаг, или, на крайний случай, сброс в nil значение свойства, с последующим восстановлением естесно. А ситуации такие случаются, в OnChange например
Тут это вряд ли как-то поможет, тут же всё просто об UI: при изменении ширины столбца установить такую же ширину столбцу в другой таблице. И на всех висит один и тот же обработчик события.
Чтобы не было бесконечных циклов можно проверять не стоит ли уже это значение. Так часто делают в сетерах свойств, странно, что DataGridView не так (хотя тут может более сложный случай если при изменении ширины одного столбца меняются другие).