Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> События компонента 
V
    Опции темы
Unsane
Дата 14.3.2008, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 8.6.2007

Репутация: 2
Всего: 5



Вот возник такой вопрос.
На одно и тоже событие можно повесить несколько обработчиков. Например:
Код

this.button1.Click += new System.EventHandler(this.button11_Click);
this.button1.Click += new System.EventHandler(this.button12_Click);
this.button1.Click += new System.EventHandler(this.button13_Click);

Можно ли получить список этих обработчиков и отключить, например, первый и третий?
--------------------
Я дурак.. Этим и интересен!
PM MAIL   Вверх
HAL707
Дата 14.3.2008, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 6.9.2007

Репутация: 1
Всего: 4



Код

System.EventHandler h1= new System.EventHandler(this.button11_Click);
System.EventHandler h2= new System.EventHandler(this.button12_Click);
System.EventHandler h3= new System.EventHandler(this.button13_Click);

//подключаем
this.button1.Click += h1
this.button1.Click += h2
this.button1.Click += h3

//отключаем
this.button1.Click -= h1
this.button1.Click -= h3

PM MAIL   Вверх
CYBERDREAM
Дата 14.3.2008, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 8
Всего: 28



Думаю он не совсем это имел ввиду, а вывести к примеру список подключенных обработчиков..


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
Unsane
Дата 14.3.2008, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 8.6.2007

Репутация: 2
Всего: 5



Цитата(CYBERDREAM @ 14.3.2008,  17:20)
Думаю он не совсем это имел ввиду, а вывести к примеру список подключенных обработчиков..

Именно так. smile 
--------------------
Я дурак.. Этим и интересен!
PM MAIL   Вверх
vponomarov
Дата 14.3.2008, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 11.8.2007
Где: Киев

Репутация: 2
Всего: 12



Unsane, по-моему нет готового механизма для решения вашей задачи
как вариант, можно при добавлении обработчика событий записывать его куда-нить и в случае необходимости удалять его оператором -=
хотя конечно как-то некрасиво получается smile 


--------------------
user posted image
user posted image
PM MAIL ICQ   Вверх
Ctrl
Дата 16.3.2008, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 12.2.2008
Где: Tula

Репутация: нет
Всего: 7



Тут все зависит от того является ли это событие собственным событием класса или это событие другого класса.
Во втором случае простых решений нет, а вот в первом вполне можно кое чего сделать.
Вот пример из которого становится ясна моя идея:
Код

using System;
using NUnit.Framework;

namespace TestOwnEventManagement {
    public class Foo {
        public event EventHandler SomeEvent;
        public EventHandler[] Listeners {
            get { return GetListenersCore(); }
        }
        public void RemoveListener(int index) {
            EventHandler[] list = Listeners;
            if (index < list.Length) SomeEvent -= list[index];
        }
        EventHandler[] GetListenersCore() {
            EventHandler[] list = new EventHandler[0];
            if (SomeEvent != null) {
                Delegate[] delegates = SomeEvent.GetInvocationList();
                list = new EventHandler[delegates.Length];
                for(int i = 0; i< delegates.Length;i++){
                    list[i] = delegates[i] as EventHandler;
                }
            }
            return list;
        }
    }
    class Program {
        static void Main(string[] args) {
            TestIt();
        }
        static void TestIt() {
            Foo foo = new Foo();
            Assert.AreEqual(0, foo.Listeners.Length);
            foo.SomeEvent += new EventHandler(foo_OnSomeEvent_00);
            foo.SomeEvent += new EventHandler(foo_OnSomeEvent_01);
            Assert.AreEqual(2, foo.Listeners.Length);
            foo.RemoveListener(1);
            Assert.AreEqual(1, foo.Listeners.Length);
        }
        static void foo_OnSomeEvent_00(object sender, EventArgs e) { }
        static void foo_OnSomeEvent_01(object sender, EventArgs e) { }
    }
}

PM MAIL ICQ   Вверх
vponomarov
Дата 17.3.2008, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 11.8.2007
Где: Киев

Репутация: 2
Всего: 12



Ctrl, сорри за глупый вопрос, но почему нельзя вызвать GetInvocationList из класса формы для какого-нить события (например, MouseDown)?


--------------------
user posted image
user posted image
PM MAIL ICQ   Вверх
Ctrl
  Дата 17.3.2008, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 12.2.2008
Где: Tula

Репутация: нет
Всего: 7



Вопрос не глупый, на самом деле в данной ситуации есть одна засада:
Вот кусок кода:
Код

   public class Foo {
   // ... something
        public event EventHandler SomeEvent;
   // ... something
}

А вот как он выглядит в IL:
Код

.class public auto ansi beforefieldinit TestOwnEventManagement.Foo
       extends [mscorlib]System.Object
{
   // ... something

    .field private class [mscorlib]System.EventHandler SomeEvent

    .event [mscorlib]System.EventHandler SomeEvent
    {
      .addon instance void TestOwnEventManagement.Foo::add_SomeEvent(class [mscorlib]System.EventHandler)
      .removeon instance void TestOwnEventManagement.Foo::remove_SomeEvent(class [mscorlib]System.EventHandler)
    } // end of event Foo::SomeEvent

   // ... something

} // end of class TestOwnEventManagement.Foo


Компилятор завернул все что надо в поле, которое поддерживает только 2 операции (+=  -= ), и на любое действие со стороны он скажет следующее:
Код

The event 'TestOwnEventManagement.Foo.SomeEvent' can only appear on the left hand side of += or -= 
(except when used from within the type 'TestOwnEventManagement.Foo')

и будет прав  smile

Добавлено через 1 минуту и 23 секунды
Так что, как я писал выше простых решений тут нет
PM MAIL ICQ   Вверх
RedsAn
Дата 18.3.2008, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 12.3.2008

Репутация: 1
Всего: 1



Спасибо Ctrl!
Показательный пример.
Только для тестирования надо атрибуты указать: [TestFixture] для Program и [Test] для TestIt()
 + сделать этот метод экземплярным. 
PM MAIL   Вверх
Ctrl
Дата 18.3.2008, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 12.2.2008
Где: Tula

Репутация: нет
Всего: 7



2RedsAn: с этими аттрибутами и с техникой юнит-тестирования я отлично знаком...
Ну на самом деле целью было просто попользовать Assert, дабы не возникали при взгляде на код лишние вопросы
 "ЭЭЭЭЭ ... а как это работает?" 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0956 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.