Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Переопределить обработчик в потомке


Автор: Qwe2 29.10.2013, 08:31
Есть класс, который создает форму с ListView. Для двойного клика ListView есть обработчик события:
Код

class MyClass: Form
{
        ListView listViewSMD;

        void InitializeComponent()
        {
                <...>
                listViewSMD = new ListView();
                listViewSMD.DoubleClick += (s, e) =>
                {
                                <...>
                                this.Close();
                };
        }
}

Создал класс-наследник от MyClass, хочу, чтобы для ListView был свой обработчик события. Как переопределить обработчик в классе-наследнике? Обязательно менять в базовом классе делегата на виртуальный метод или можно обойтись без модификаций в базовом классе?

Автор: jonie 29.10.2013, 10:46
Цитата(Qwe2 @  29.10.2013,  09:31 Найти цитируемый пост)
Обязательно менять в базовом классе делегата на виртуальный метод или можно обойтись без модификаций в базовом классе?

используйте не анонимные лямбды, а обычный метод, передав при подписке делегат на него. Этот метод сделайте виртуальным. И в наследнике перегружайте.
Например:
Код

...
listViewSMD.DoubleClick += OnDoubleClick;
...

protected virtual void OnDoubleClick(object s, EventArgs e) {
....
}



Автор: Qwe2 29.10.2013, 11:35
А как переопределить? Надо listViewSMD (в базовом классе) сделать protected?

Автор: jonie 29.10.2013, 15:16
Цитата(Qwe2 @  29.10.2013,  12:35 Найти цитируемый пост)
А как переопределить? Надо listViewSMD (в базовом классе) сделать protected? 

как обычно override-нуть метод. Давайте вы что-то прочитайте про virtual слово в C#, прежде чем задавать подобные вопросы.

Автор: Qwe2 29.10.2013, 22:22
Да это понятно, что override, но у меня вызываются оба обработчика...

Автор: dzaraev 30.10.2013, 07:20
Цитата(Qwe2 @  29.10.2013,  22:22 Найти цитируемый пост)
 но у меня вызываются оба обработчика

Если вы имеете в виду, что вам нужно вызвать оба обработчика, то просто добавьте в перегруженный метод base.OnDoubleClick(s, e) в любом месте, в зависимости от сценария обработки (обычно в начале или в конце).
Например так:
базовый класс
Код

...
listViewSMD.DoubleClick += OnDoubleClick;
...
protected virtual void OnDoubleClick(object s, EventArgs e) {
//TODO базовая обработка
}

наследник
Код

protected override void OnDoubleClick(object s, EventArgs e) {
base.OnDoubleClick(s, e)
//TODO обработка наследника
}

Автор: Qwe2 30.10.2013, 08:01
Спасибо, все получилось!

Автор: dzaraev 30.10.2013, 08:25
Если вопрос решён - помечайте тему пожалуйста. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)