Обработка событий вне класса - C#
Формулировка задачи:
Здравствуйте. Помогите оценить и дополнить решение.
Суть такая: есть 3-4 таблицы, с похожей структурой. В частности, в них есть колонки "IntervalFrom", "IntervalTo", т.е. записаны в них интервалы.
0-100
100-250
250-270 и т.д.
Мне необходимо, чтобы при изменении цифры 100 в колонке "IntervalTo" (первая строка), менялась сразу и колонка "IntervalFrom" (вторая строка).
Написан был обработчик событий в таком виде:
stratigraphy - это DataTable.
Т.е. можно сделать копипаст для остальных таблиц, но хотелось бы всё же сделать один класс, который бы обрабатывал события. В итоге я написал следующий класс:
А в классе, где обрабатывается исходная таблица добавил:
Теперь при изменении следующей строки: previousRow["IntervalTo"] = e.ProposedValue происходит снова событие.
От которого я безуспешно пытаюсь отписаться (см. комментарий в коде).
Верно ли вообще моё решение со static классом, который бы обрабатывал события в похожих таблицах?
Заранее спасибо!
private void StratigraphyDataModuleIntervalChanged(object sender, DataColumnChangeEventArgs e) { if (e.Column.ColumnName == "IntervalFrom" && e.Row.RowState != DataRowState.Detached) { DataRow previousRow = DataSetHelper.GetPreviousRow(e.Row); if (previousRow != null) { stratigraphy.ColumnChanged -= StratigraphyDataModuleIntervalChanged; previousRow["IntervalTo"] = e.ProposedValue; stratigraphy.ColumnChanged += StratigraphyDataModuleIntervalChanged; } } if (e.Column.ColumnName == "IntervalTo" && e.Row.RowState != DataRowState.Detached) { DataRow nextRow = DataSetHelper.GetNextRow(e.Row); if (nextRow != null) { stratigraphy.ColumnChanged -= StratigraphyDataModuleIntervalChanged; nextRow["IntervalFrom"] = e.ProposedValue; stratigraphy.ColumnChanged += StratigraphyDataModuleIntervalChanged; } } }
public static class IntervalChange { public static void IntervalChanged(object sender, DataColumnChangeEventArgs e) { if (e.Column.ColumnName == "IntervalFrom" && e.Row.RowState != DataRowState.Detached) { DataRow previousRow = DataSetHelper.GetPreviousRow(e.Row); if (previousRow != null) { e.Row.Table.ColumnChanged -= IntervalChanged; // вот тут previousRow["IntervalTo"] = e.ProposedValue; e.Row.Table.ColumnChanged += IntervalChanged; // вот тут } } if (e.Column.ColumnName == "IntervalTo" && e.Row.RowState != DataRowState.Detached) { DataRow nextRow = DataSetHelper.GetNextRow(e.Row); if (nextRow != null) { e.Row.Table.ColumnChanged -= IntervalChanged; nextRow["IntervalFrom"] = e.ProposedValue; e.Row.Table.ColumnChanged += IntervalChanged; } } } }
private void StratigraphyDataModuleIntervalChanged(object sender, DataColumnChangeEventArgs e) { IntervalChange.IntervalChanged(sender, e); }
Решение задачи: «Обработка событий вне класса»
textual
Листинг программы
public static class IntervalChange
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д