Обработка событий вне класса - 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