Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Удалить обработчик событий Добавлено: 02.11.06 16:42  

Автор вопроса:  Sacred Phoenix | ICQ: 304238252 
Public Class Form1
   Private Sub Form1_Load(ByVal eventSender As Object, ByVal eventArgs As System.EventArgs) Handles Me.Load
      [myClass].RemoveEventHandler(Me)
   End Sub

   Private Sub Button1_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Button1.Click
      MessageBox.Show("Button1_Click")
   End Sub
End Class

Public Class [myClass]
   Public Shared Sub RemoveEventHandler(ByVal mainForm As Form)
      AddHandler mainForm.Controls("Button1").Click, AddressOf Button1_MyHandler
   End Sub

   Private Shared Sub Button1_MyHandler(ByVal eventSender As Object, ByVal eventArgs As System.EventArgs)
      MessageBox.Show("Button1_MyHandler")
   End Sub
End Class


Здесь добавляется новый обработчик события Button1.Click. А как удалить старый (т.е. Form1.Button1_Click)?

Ответить

  Ответы Всего ответов: 12  

Номер ответа: 1
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #1 Добавлено: 02.11.06 22:03
    Private Sub Form1_Load(ByVal sender As System.Object, _
                           ByVal e As System.EventArgs) Handles MyBase.Load

        RemoveHandler Button1.Click, AddressOf Button1_Click

    End Sub

Ответить

Номер ответа: 2
Автор ответа:
 Sacred Phoenix



ICQ: 304238252 

Вопросов: 52
Ответов: 927
 Профиль | | #2 Добавлено: 02.11.06 23:00
Если бы было так хитро, я бы и не спрашивал :)
Удалить обработчик нада из [myClass].

Ответить

Номер ответа: 3
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #3 Добавлено: 03.11.06 00:15
А что тебе мешает передать в процедуру в качестве параметра ссылку на этот делегат?

Ответить

Номер ответа: 4
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #4 Добавлено: 03.11.06 00:36
вот как то так ...

Public Class Form1

    Private Sub Form1_Load(ByVal eventSender As Object, _
                           ByVal eventArgs As System.EventArgs) Handles Me.Load

        TestEventHandlerClass.ReplaceEventHandler(Button1, _
                                     AddressOf Button1_Click)
    End Sub

    Private Sub Button1_Click(ByVal eventSender As System.Object, _
                              ByVal eventArgs As System.EventArgs) Handles Button1.Click

        MessageBox.Show("Button1_Click";)
    End Sub
End Class

Public Class TestEventHandlerClass

    Public Shared Sub ReplaceEventHandler(ByVal Ctrl As Button, _
                                         ByVal MyEventHandler As EventHandler)
        If Ctrl Is Nothing OrElse _
           MyEventHandler Is Nothing Then
            Throw New ArgumentException
        End If

        RemoveHandler Ctrl.Click, MyEventHandler
        AddHandler Ctrl.Click, AddressOf Button1_MyHandler

    End Sub

    Private Shared Sub Button1_MyHandler(ByVal eventSender As Object, _
                                         ByVal eventArgs As System.EventArgs)
        MessageBox.Show("Button1_MyHandler";)
    End Sub
End Class

Ответить

Номер ответа: 5
Автор ответа:
 Sacred Phoenix



ICQ: 304238252 

Вопросов: 52
Ответов: 927
 Профиль | | #5 Добавлено: 03.11.06 11:08
А что тебе мешает

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

Я вот копал-копал, нашел mainForm.Controls("Button1";).GetType().GetEvent("Click";).EventHandlerType. Мож это как-то поможет?
Кстати, можно ли, зная System.Type объекта, получить сам объект?

Ответить

Номер ответа: 6
Автор ответа:
 SergeyR



Вопросов: 5
Ответов: 9
 Профиль | | #6 Добавлено: 03.11.06 13:39
Кстати, можно ли, зная System.Type объекта, получить сам объект?


Activator.CreateInstance(t)

Ответить

Номер ответа: 7
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #7 Добавлено: 03.11.06 15:56
1. GetEvent("Click";) возвращает объект EventInfo, который в свою очередь имеет метод RemoveEventHandler которому опять таки необходимы 2 (ДВА) параметра.. объект и делегат!

Признаться честно, я вообще не понимаю твоей логики.. ты пытаешься инкапсулировать в классе то, чего сам еще не знаешь. Ничего не напоминает? Принеси то, не знаю что.. и т.д. по аналогии..
Постарайся ответить для себя на следующие вопросы..
- Откуда твой класс будет знать На какой из процедур в mainForm висит обработчик события для этой кнопки? А может этот обработчик подключен к нескольким делегатам???

-Есть ли на той форме эта кнопка вообще???

-А если в той форме обработчик события объвлен как Private, что тогда??

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

Ответить

Номер ответа: 8
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #8 Добавлено: 03.11.06 16:00
Хочу добиться того, чтобы можно было переопределять обработчики событий нужных контролов


Ну вот смотри.. ты сам ответил на свой вопрос.. Чтобы их переопределить ты их должен, как минимум - знать!!!.. контрол и делегат..

На данный момент нельзя же точно сказать, чей и какой обработчик нужно удалить.


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

Ответить

Номер ответа: 9
Автор ответа:
 Sacred Phoenix



ICQ: 304238252 

Вопросов: 52
Ответов: 927
 Профиль | | #9 Добавлено: 03.11.06 19:12
Откуда твой класс будет знать На какой из процедур в mainForm висит обработчик события для этой кнопки? А может этот обработчик подключен к нескольким делегатам???
дык я расчитывал на то, что эту инфу можно получить. Например, через тот же самый Reflection.

Есть ли на той форме эта кнопка вообще???
да хотя бы так:

If (TypeOf mainForm.Controls("Button1";) Is Button) Then MessageBox.Show("Кнопка есть";)

Узнаю не только, что такой контрол есть, но и еще что это кнопка

А вот в тот момент, когда можно будет это точно сформулировать
этого момента по идее вообще не будет, ведь не главное приложение должно подстраиваться под плагины и их возможности, а наоборот, плагины под приложение.
Конечно, тут два выхода:
1) Максимально продумать устройство плагинов, чтобы предусмотреть как можно большее
2) в данном примере с переопределением обработчика Click кнопки поступить по-другому: скрыть или удалить кнопку с формы и создать программно другую, с подгонкой свойств

Хм...

      Dim myButton As Control = mainForm.Controls("Button1";)
      mainForm.Controls.Remove(myButton)
      myButton.Name = "Button2"
      mainForm.Controls.Add(myButton)

Старый обработчик остался... Он получается "вшит" в этот экземпляр?..

Ответить

Номер ответа: 10
Автор ответа:
 Sacred Phoenix



ICQ: 304238252 

Вопросов: 52
Ответов: 927
 Профиль | | #10 Добавлено: 03.11.06 19:25
блин, так че, получается тока такой выход?

      Dim myNewButton As New Button

      With mainForm.Controls("Button1";)
         myNewButton.Anchor = .Anchor
         myNewButton.Bounds = .Bounds
         myNewButton.Text = .Text
      End With

      mainForm.Controls.Remove(mainForm.Controls("Button1";))
      mainForm.Controls.Add(myNewButton)

      AddHandler myNewButton.Click, AddressOf Button1_MyHandler

Ответить

Номер ответа: 11
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #11 Добавлено: 03.11.06 23:14
If (TypeOf mainForm.Controls("Button1";) Is Button) Then MessageBox.Show("Кнопка есть";)

А откуда твой класс будет знать, что это кнопка называется именно Button1? )))) Через интерфейс?

Старый обработчик остался... Он получается "вшит" в этот экземпляр?..

Разумеется нет! Это стандартная ошибка, которую допускают очень многие.. Фишка в том, что:
Dim myButton As Control = mainForm.Controls("Button1";)

НЕ СОЗДАЕТ НОВЫЙ ЭКЗЕМЛЯР КНОПКИ!
Ты просто получил ссылку на уже существующую кнопку со всеми ее свойствами и делегатами.. После чего ты удалил ее из коллекции Controls, дал ей новое имя и снова добавил в ту же коллекцию.. И после этого ты думаешь,что обработчик куда то денется??? Объект-то остался один и тот же.. только с новым именем..:-))) Надеюсь не надо тебе рассказывать о значении ключевого слова New ? :-))

Ответить

Номер ответа: 12
Автор ответа:
 Sacred Phoenix



ICQ: 304238252 

Вопросов: 52
Ответов: 927
 Профиль | | #12 Добавлено: 04.11.06 10:16
А откуда твой класс будет знать, что это кнопка называется именно Button1? ))))
Это знаю, например, я :))

НЕ СОЗДАЕТ НОВЫЙ ЭКЗЕМЛЯР КНОПКИ!
Тьфу, блин!!! Ступил :)))

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам