2015-05-23 3 views
-1

Я хочу «переопределить» событие из производного класса - например, из Forms-Control.Переопределение производного события

Мое фактическое состояние заключается в том, что переопределение (выполняемое командой «Тени») работает, когда я использую обработчик этого элемента управления напрямую. Является ли элемент управления членом коллекции, он работает только с такими событиями, которые я создал сам - если я пытаюсь использовать переопределенное событие, оно не работает. Я полагаю, что коллекция использует событие из базового класса. Возможно ли это? И если «Да» - что я мог сделать?

Code-Отрывки из описанных «проблем»:

Этой часть собирает обработчик событий внутри пользовательского элемента управления:

Private KalenderElemente As New Collection 

Private Sub CreateElements() 

    KalenderElemente.Clear() 

    For i As Integer = 1 To 42 
     Dim myKalenderTag As New PP_Monatskalender_Tag 
     myKalenderTag.Name = "Tag_" + i.ToString("00") 
     myKalenderTag.ForeColor = my_ForeColor_Days 
     myKalenderTag.BackColor = my_BackColor_Days 
     myKalenderTag.Parent = Me 

     AddHandler myKalenderTag.Click, AddressOf KalenderTag_Click 
     AddHandler myKalenderTag.MouseMove, AddressOf KalenderTag_MouseMove 
     AddHandler myKalenderTag.MouseEnter, AddressOf KalenderTag_MouseEnter 
     AddHandler myKalenderTag.MouseLeave, AddressOf KalenderTag_MouseLeave 

     KalenderElemente.Add(myKalenderTag) 
    Next 

End Sub 



Private Sub Kalender_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) Handles MyBase.MouseMove 
    If Not KalenderElemente.Item(0).Visible Then 
     KalenderElemente.Item(0).DatumsTag = 0 
     RaiseEvent MouseMove(KalenderElemente.Item(0), e) 
    Else 
     KalenderElemente.Item(41).DatumsTag = 0 
     RaiseEvent MouseMove(KalenderElemente.Item(41), e) 
    End If 
End Sub 

Private Sub KalenderTag_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) 
    RaiseEvent MouseMove(sender, e) 
End Sub 

Shadows Event MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) 

Private Sub KalenderTag_MouseEnter(ByVal sender As Object, ByVal e As EventArgs) 
    RaiseEvent MouseEnter(sender, e) 
End Sub 

Shadows Event MouseEnter(ByVal sender As Object, ByVal e As EventArgs) 

Private Sub KalenderTag_MouseLeave(ByVal sender As Object, ByVal e As EventArgs) 
    RaiseEvent MouseLeave(sender, e) 
End Sub 

Shadows Event MouseLeave(ByVal sender As Object, ByVal e As EventArgs) 

Теперь каждый из внутреннего контроля поставить это мышь-событие наружу , Если я поместил его в форму и написал сценарий, который принимает событие, я мог видеть, что все работает нормально (и, как ожидалось).

Ниже вы видите часть коллекции, которая должна управлять этим контроль (и других):

Public Class MessageDefinition 

    Public WithEvents Control As Control 
    Public HeaderText As String 
    Public MessageText As String 
    Public DisplayShadow As Boolean 
    Public ToolTipLocation As ToolTipLocationDefintion 
    Public Location As Point 

End Class 

Public Class Message_Collection 
    Inherits CollectionBase 

    Public Shadows Sub Clear() 

     Dim myItem As MessageDefinition 

     For i As Integer = 1 To List.Count 
      myItem = List.Item(i - 1) 
      RemoveHandler myItem.Control.MouseEnter, AddressOf Item_MouseEnter 
      RemoveHandler myItem.Control.MouseMove, AddressOf Item_MouseMove 
      RemoveHandler myItem.Control.MouseLeave, AddressOf Item_MouseLeave 
     Next 

     List.Clear() 
    End Sub 

    Overrides Function ToString() As String 
     Return "[...]" 
    End Function 

    Public Sub Dispose() 
     Clear() 
    End Sub 

    ' ================================ 

    Public Sub SetMessage(item As MessageDefinition) 

     Dim myItem As MessageDefinition 

     For i As Integer = 1 To List.Count 
      myItem = List.Item(i - 1) 
      If myItem.Control.GetType Is item.Control.GetType _ 
      AndAlso myItem.Control.Name = item.Control.Name Then 
       'List.Item(i - 1) = item 
       'RaiseEvent MouseEnter(item, System.EventArgs.Empty) 
       Exit Sub 
      End If 
     Next 

     AddHandler item.Control.MouseEnter, AddressOf Item_MouseEnter 
     AddHandler item.Control.MouseMove, AddressOf Item_MouseMove 
     AddHandler item.Control.MouseLeave, AddressOf Item_MouseLeave 
     List.Add(item) 
     RaiseEvent MouseEnter(item, System.EventArgs.Empty) 
    End Sub 

    Private Sub Item_MouseEnter(sender As Object, e As System.EventArgs) 

     Dim myItem As MessageDefinition 
     Dim mySender As Control = sender 

     For i As Integer = 1 To List.Count 
      myItem = List.Item(i - 1) 
      If myItem.Control Is mySender Then 
       RaiseEvent MouseEnter(myItem, e) 
       Exit Sub 
      End If 
     Next 

    End Sub 

    Private Sub Item_MouseMove(sender As Object, e As System.EventArgs) 

     Dim myItem As MessageDefinition 
     Dim mySender As Control = sender 

     For i As Integer = 1 To List.Count 
      myItem = List.Item(i - 1) 
      If myItem.Control Is mySender Then 
       RaiseEvent MouseMove(myItem, e) 
       Exit Sub 
      End If 
     Next 

    End Sub 

    Private Sub Item_MouseLeave(sender As Object, e As System.EventArgs) 

     Dim myItem As MessageDefinition 
     Dim mySender As Control = sender 

     For i As Integer = 1 To List.Count 
      myItem = List.Item(i - 1) 
      If myItem.Control Is mySender Then 
       RaiseEvent MouseLeave(myItem, e) 
       Exit Sub 
      End If 
     Next 

    End Sub 

    Public Event MouseEnter(sender As Object, e As System.EventArgs) 
    Public Event MouseMove(sender As Object, e As System.EventArgs) 
    Public Event MouseLeave(sender As Object, e As System.EventArgs) 

End Class 

Как описано (на вершине) в перехваченных События увольняют с «Стандарт», но не-элементы управления с «Индивидуальным» управлением.

Если я изменю его и создаю свои собственные события (с разными именами), которые не затеняют события из производного элемента управления, он также работает так, как ожидалось.

+1

Это не правильный способ сделать это. Отправьте свой код, поэтому нам не нужно писать руководство. –

+0

Коллекция не имеет ничего общего с событием. – OneFineDay

+0

@Hans Passant: Я обязал вас как хотел ... –

ответ

3

Вы не переопределяете события в .NET - вы можете только override inherited event handlers, если таковые имеются.

картина событий в .NET является создание public событие в базовом классе, и способ, который вызывает это событие, и что может быть переопределен в производном классе protected virtual (VB Protected Overridable). Этот метод следует называть OnEventName.

Элементы управления Windows Forms следуют этому шаблону, так, например, переопределения, когда произойдет событие Click, переопределить OnClick метод:

Public Class MyTextBox 
    Inherits TextBox 

    Protected Overrides Sub OnClick(ByVal e As System.EventArgs) 
     If SomeCondition() Then 
      MyBase.OnClick(e) 
     Else 
      Return 'Do not click 
     End If 
    End Sub 
End Class 

Очевидно, что вы можете возиться с e аргумента, а также.

+0

Я пробовал это хорошо. Изменений не было. Если я переопределяю (например) метод OnMouseEnter и не вызываю базовый метод, базовое событие все еще называется ...! Я думаю, что это то же самое, что «проблема» с Enabled-Property ... –

Смежные вопросы