Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
 Аватар для ssementsov
0 / 0 / 1
Регистрация: 02.11.2011
Сообщений: 89

Обработка событий вне класса

23.07.2012, 15:28. Показов 1490. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Помогите оценить и дополнить решение.

Суть такая: есть 3-4 таблицы, с похожей структурой. В частности, в них есть колонки "IntervalFrom", "IntervalTo", т.е. записаны в них интервалы.

0-100
100-250
250-270 и т.д.

Мне необходимо, чтобы при изменении цифры 100 в колонке "IntervalTo" (первая строка), менялась сразу и колонка "IntervalFrom" (вторая строка).

Написан был обработчик событий в таком виде:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        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;
                }
            }
        }
stratigraphy - это DataTable.

Т.е. можно сделать копипаст для остальных таблиц, но хотелось бы всё же сделать один класс, который бы обрабатывал события. В итоге я написал следующий класс:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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; 
                }                
            }
        }     
    }
А в классе, где обрабатывается исходная таблица добавил:
C#
1
2
3
4
  private void StratigraphyDataModuleIntervalChanged(object sender, DataColumnChangeEventArgs e)
        {
            IntervalChange.IntervalChanged(sender, e);
        }
Теперь при изменении следующей строки: previousRow["IntervalTo"] = e.ProposedValue происходит снова событие.
От которого я безуспешно пытаюсь отписаться (см. комментарий в коде).

Верно ли вообще моё решение со static классом, который бы обрабатывал события в похожих таблицах?

Заранее спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.07.2012, 15:28
Ответы с готовыми решениями:

Вызвать обработчики событий из класса отличного от класса в котором зарегистрировано событие
Здравствуйте, можно ли вызвать обработчики события, объявленного в классе А в классе В? Вот так сделать не дает: class A { ...

Обработка событий
Есть событие. Есть метод-обработчик события, в котором полученные данные обрабатываются и результат пишется в файл. Подскажите...

Обработка событий
Создать визуальную форму для работы. Форма должна содержать поля для ввода данных, кнопку для вычислений и поле для вывода результатов. ...

6
25 / 25 / 5
Регистрация: 21.10.2009
Сообщений: 95
Записей в блоге: 1
23.07.2012, 16:13
А разве там этот обработчик запускается? Может этот?

C#
1
2
3
4
private void StratigraphyDataModuleIntervalChanged(object sender, DataColumnChangeEventArgs e)
        {
            IntervalChange.IntervalChanged(sender, e);
        }
?
И отписываться от него нужно?
1
 Аватар для ssementsov
0 / 0 / 1
Регистрация: 02.11.2011
Сообщений: 89
23.07.2012, 17:11  [ТС]
Да, но как от него отписаться? Это же ведь для нескольких классов надо объединить.

Добавлено через 42 минуты
Может моя реализация вовсе не верна? Подскажите пожалуйста тогда верную идею..
0
25 / 25 / 5
Регистрация: 21.10.2009
Сообщений: 95
Записей в блоге: 1
23.07.2012, 17:15
Я не претендую на истину в последней инстанции
Я бы сделал так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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)
                {
                    ((DataTable)sender).ColumnChanged -= StratigraphyDataModuleIntervalChanged;
                    previousRow["IntervalTo"] = e.ProposedValue;
                    ((DataTable)sender).ColumnChanged += StratigraphyDataModuleIntervalChanged;
                }
            }
            if (e.Column.ColumnName == "IntervalTo" && e.Row.RowState != DataRowState.Detached)
            {
                DataRow nextRow = DataSetHelper.GetNextRow(e.Row);
                if (nextRow != null)
                {
                    ((DataTable)sender).ColumnChanged -= StratigraphyDataModuleIntervalChanged;
                    nextRow["IntervalFrom"] = e.ProposedValue;
                    ((DataTable)sender).ColumnChanged += StratigraphyDataModuleIntervalChanged;
                }
            }
        }
И повесил этот обработчик на все таблицы...
0
 Аватар для ssementsov
0 / 0 / 1
Регистрация: 02.11.2011
Сообщений: 89
23.07.2012, 17:22  [ТС]
Дело в том, что такой обработчик уже написал был. Я его код выше приводил.

Да, его можно повесить в 3 файлах, для каждой таблицы. Но если что-то придется изменить в обработчике, то менять в каждом файле не удобно.

Я хотел бы реализовать один класс, для всех 3-х таблиц. Чтобы просто подписка на событие была в своем классе, а обработка события была универсальная и не зависела от таблицы, в которой оно произошло..

Добавлено через 2 минуты
Как такое реализовать? Я вот пробовал написать класс, но в нем я не могу отписать от события в нужные моменты..(
0
25 / 25 / 5
Регистрация: 21.10.2009
Сообщений: 95
Записей в блоге: 1
23.07.2012, 17:32
Да, я тот код и скопировал, только изменил
C#
1
stratigraphy.ColumnChanged
на
C#
1
((DataTable)sender).ColumnChanged
Соответственно можно каждую из таблиц на форме подписать на единственный вариант этого обработчика.
1
 Аватар для ssementsov
0 / 0 / 1
Регистрация: 02.11.2011
Сообщений: 89
23.07.2012, 17:59  [ТС]
IgorTsapko, сейчас попробую..

Добавлено через 7 минут
Вот класс в котором обрабатывается событие.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using System.Data;
using Modem.Utils;
 
namespace W2.Domain
{
    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)
                {
                    ((DataTable)sender).ColumnChanged -= IntervalChanged;
                    previousRow["IntervalTo"] = e.ProposedValue;
                    ((DataTable)sender).ColumnChanged += IntervalChanged; 
                }              
            }
            if (e.Column.ColumnName == "IntervalTo" && e.Row.RowState != DataRowState.Detached)
            {                
                DataRow nextRow = DataSetHelper.GetNextRow(e.Row);
                if (nextRow != null)
                {
                    ((DataTable)sender).ColumnChanged -= IntervalChanged;
                    nextRow["IntervalFrom"] = e.ProposedValue;
                    ((DataTable)sender).ColumnChanged += IntervalChanged; 
                }                
            }
        }     
    }
}
В другом классе я подписываюсь на это событие:

C#
1
2
3
4
5
6
7
8
        protected override void OnDataLoaded()
        {
            base.OnDataLoaded();
            profile = LithologyProfileMapper.ToProfile(dataSet);
            stratigraphy = dataSet.Tables["Stratigraphy"];
        
            stratigraphy.ColumnChanging += IntervalChange.IntervalChanged; // вот тут
        }
Но дело в том, что в этой строчке не удаётся отписаться от события:
C#
1
 ((DataTable)sender).ColumnChanged -= IntervalChanged;
Почему так происходит?

Добавлено через 10 минут
Сделал класс:
C#
1
public static class IntervalChange
не static, получилось отписаться от событий. Кто-нибудь может пояснить механизм работы, почему так произошло?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.07.2012, 17:59
Помогаю со студенческими работами здесь

Отложенная обработка событий
Здравствуйте, предположим, у нас есть Логика и Отображение. Отображение подписано на событие НовыйОбъект, рассылаемое Логикой и когда оно...

обработка событий мыши
если на форме находится Picturebox необходимо если левой кнопкой мыши на него щелкнуть и не отпуская перемещать затем отпустить Picturebox...

Создание и обработка событий
Всем добрый день. К данной программе нужно создать какое либо событие. Тема: Создание и обработка событий. Цель работы: Закрепить...

Обработка событий в UserControl
Интересует как лучше согласно принципап ООП обработать из формы событие , которое происходит в расположенном на этой форме UserControl (...

Динамическое создание и обработка событий
Здравствуйте. Помогите разобраться, как в С# создаются события. Ситуация такая: Есть демка проекта. Во время запуска демки она...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
[В процессе разработки] SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru