Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2013, 17:44   #1
inmyacid
Пользователь
 
Аватар для inmyacid
 
Регистрация: 17.04.2012
Сообщений: 42
По умолчанию Можно ли узнать инициатора события?

Привет!
Ситуация следующая.
Программа пишется по mvp паттерну.
В моделе описывается класс, и свойство , при изменении которого происходит событие.
Код:
class A
{
public prop
{
public event EventHandler evnt;
get{return prop}
set {prop=value; evnt(this,null);};
}
В презентере создается множество объектов где для каждого объекта идет подписка на метод лежащий в View. Для этого метода в параметрах нужно передать того кто его инициировал. Это нужно для того чтобы метод смог оповестить компоненты на форме о том что произошло обновление свойства объекта.
Presenter:
Код:
 for (int i = 0; i < n; i++)
           {
               lst.Add(new A());
             
           lst[i].evnt += delegate {
                   View.method( lst[i], "prop"); 
               };
               
            
           }
При создании коллекции объектов подписка происходит и все хорошо. НО когда по факту происходит изменения свойства, дебагер перепрыгивает на строчку внутри анонимного делегата по сути как и должно быть
Код:
 lst[i].evnt += delegate {
                   View.method( lst[i], "prop");
но при этом переменная i достигла уже максимального значения когда работал цикл и получается выполняется строчка View.method( lst[max i], "prop"); а мне нужно чтобы метод вызвался для того объекта который инициировал событие.
Подскажите как грамотно сделать
inmyacid вне форума Ответить с цитированием
Старый 03.04.2013, 15:24   #2
inmyacid
Пользователь
 
Аватар для inmyacid
 
Регистрация: 17.04.2012
Сообщений: 42
По умолчанию

Сделал по другому:
вместо анонимного метода создал делегат и запихал туда метод в котором уже вызываю нужный метод из VIEW:
Код:

 for (int i = 0; i < n; i++)
           {
               lst.Add(new A());
              EventHandler dkg;
              dkg = RunD;
           lst[i].evnt += dkg;
               
            
           }
void Rund():
Код:
 void RunD(object sender, EventArgs e)
{
  View.method((sender as A), "prop"); 
}
inmyacid вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Можно ли через Hibernate узнать расположение БД tank01 Java Базы данных (JDBC, JPA, Hibernate) 0 18.11.2012 20:01
Как узнать имя события/функции, которое было выполенно в Run Time? artemavd Общие вопросы Delphi 14 07.09.2012 19:06
Как можно сделать так, чтобы дочерняя форма была поверх всех окон после наступления определённого события? Вадим Мошев Общие вопросы Delphi 4 10.06.2011 13:01
Можно ли добавить события и свойства во Frame befame Общие вопросы Delphi 1 11.03.2010 17:33
Как узнать можно ли открыть... Domovoy Общие вопросы Delphi 2 10.12.2007 14:13