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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.06.2011, 14:05   #1
Greek9000
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 151
По умолчанию Присвоение событий

Наткнулся на такую проблему:
у меня есть контекстное меню с несколькими элементами ToolStripMenuItem.
Каждому элементу присвоено собственное событие (точнее - обработчик события).
Можно ли как то получить метод-обработчик по известному событию для того что бы назначить этот обработчик другому событию?

Код примерно такой:
Код:
ContextMenuStrip tMenu = AForm.PageMenu; // Это моё всплывающее меню

// Перебираем все элементы заданного меню
foreach (ToolStripMenuItem itm in
                tMenu.Items)
            {
                // Создаём дубликат текущего элемента
                ToolStripMenuItem newItem = new ToolStripMenuItem();

                // Присваиваем дубликату тот же текст
                newItem.Text = itm.Text;

                // ВОТ ТУТ НАЧИНАЕТСЯ ПРОБЛЕМА
                // как присвоить новому элементу тот 
                // же обработчик, что и у старого
                // newItem.Click += ??? - 
                // newItem.Click = itm.Click - не работает
                // newItem.Click += new EventHendler(itm.Click) - не работает
            }
Т.о. необходимо получить метод на который ссылается некий делегат.
Как это сделать?
Greek9000 вне форума Ответить с цитированием
Старый 09.06.2011, 22:34   #2
Spawn™Production®
Форумчанин
 
Аватар для Spawn™Production®
 
Регистрация: 06.05.2011
Сообщений: 287
По умолчанию

Reflection (по ссылке подробнее, но менее понятно ^_^, лучше спросите тут снова, если не поймёте)
Код:
// Находим нужное событие на форме
var evnt = this.GetType().GetEvent("Click");
// Добавляем делегат обработчика события
evnt.AddEventHandler(this, new EventHandler(Form1_Load));
Spawn™Production® вне форума Ответить с цитированием
Старый 10.06.2011, 09:42   #3
Greek9000
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 151
По умолчанию

Цитата:
Сообщение от Spawn™Production® Посмотреть сообщение
Код:
// Находим нужное событие на форме
var evnt = this.GetType().GetEvent("Click");
// Добавляем делегат обработчика события
evnt.AddEventHandler(this, new EventHandler(Form1_Load));
Аналогично можно было бы сделать так:
this.Click += new EventHandler(Form1_Load);

В обоих случаях мы знаем, что к событию надо привязать обработчик Form1_Load.
А вот если есть, например, кнопка с уже привязанным обработчиком, то как присвоить этот обработчик другой кнопке, не зная о нём ничего. Т.е. в нашем случае - не указывая в явном виде имя Form1_Load.
Greek9000 вне форума Ответить с цитированием
Старый 10.06.2011, 19:51   #4
Spawn™Production®
Форумчанин
 
Аватар для Spawn™Production®
 
Регистрация: 06.05.2011
Сообщений: 287
По умолчанию

Код:
            // Некое событие с обработчиком, например Load
            var evntWithHandler = this.GetType().GetEvent("Load");
            // Некое событие без обработчика, например Click
            var evntWithouHandler = this.GetType().GetEvent("Click");
            // Находим объект, который нужен, чтобы вытащить из коллекции событий элемента управления нужный делегат
            var eventObject = typeof(Form).GetField("EVENT_LOAD", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic).GetValue(null);
            // Извлекаем делегат из коллекции
            var mi = this.Events[eventObject];
            // Присваиваем делегат обработчику другого события
            evntWithouHandler.AddEventHandler(this, mi);
Spawn™Production® вне форума Ответить с цитированием
Старый 10.06.2011, 23:12   #5
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Вот тоже рабочий пример нашел. Есть button1 с событием и button2 без оного.
Код:
FieldInfo eventClick = typeof(Control).GetField("EventClick", BindingFlags.NonPublic | BindingFlags.Static);
            object secret = eventClick.GetValue(null);
            // Извлекаем событие клика 
            PropertyInfo eventsProp = typeof(Component).GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance);
            EventHandlerList events = (EventHandlerList)eventsProp.GetValue(button1, null);
            Delegate click = events[secret];
            //Удаляем событие с первой кнопки
            events.RemoveHandler(secret, click);
			//Добавляем событие на вторую кнопку
            events = (EventHandlerList)eventsProp.GetValue(button2, null);
            events.AddHandler(secret, click);
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Присвоение переменной gajubas PHP 1 21.04.2010 20:18
присвоение значения Stjernen Microsoft Office Excel 5 04.01.2010 14:44
присвоение номера С++ Annabel Помощь студентам 13 15.11.2009 23:44
Присвоение ID artemavd БД в Delphi 2 20.04.2009 14:45
Присвоение значений в ComboBox maxi_mum Помощь студентам 6 09.04.2009 12:48