2010-12-20 3 views
1

VBnet에서 picturebox에서 어떤 이벤트가 트리거되었는지 어떻게 알 수 있습니까?VBnet의 picturebox에서 어떤 이벤트가 발생했는지 알 수있는 방법

vbnet 코드

:

Private Sub picButton_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles picButton.MouseEnter 
    'CODE HERE' 
End Sub 

Private Sub picButton_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles picButton.MouseLeave 
    'CODE HERE' 
End Sub 

그리고 난이처럼 만들고 싶어 :

내가 그것을 .MouseEnter 또는 .MouseLeave인지 트리거 된 어떤 이벤트 알고 싶어
Private Sub picButtonEVent(ByVal sender As Object, ByVal e As System.EventArgs) Handles picButton.MouseLeave, picButton.MouseEnter 
    'CODE HERE' 
    'If MouseEnter Then' 
     'Code for mouseEnter' 
    'ElseIf MouseLeave Then' 
     'Code for mouseLeave' 
    'End If' 
End Sub 

. 내가 이것을 만들고있는 이유는 사용 된 객체에 따라 코드를 더 분류하기 위해서입니다.

답변

3

당신이 할 수있는 한 가지는 이벤트 유형을 결정하는 데 사용할 수있는 추가 Enum 매개 변수를 사용하는 헬퍼 함수를 ​​만드는 것입니다. 그런 다음 영역에 더미 이벤트를 묶어서 축소 할 수 있습니다.

Private Sub picButton_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles picButton.MouseEnter 
    UniversalEvent(this, e, EventType.MouseEnter) 
End Sub 

Private Sub picButton_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles picButton.MouseLeave 
    UniversalEvent(this, e, EventType.MouseLeave) 
End Sub 

Private Sub UniversalEvent(ByVal sender As Object, ByVal e As System.EventArgs, ByVal eventType As EventType) 
    If MouseEnter Then 
     'Code for mouseEnter' 
    ElseIf MouseLeave Then 
     'Code for mouseLeave' 
    End If' 
End Sub 

편집 : 오프 손, 나는

나의 제안 (... 그 반사를 사용하지 않고있다) 실제로 이벤트 자체에서 발사 어떤 이벤트 결정하는 우아한 방법을 알고하지 않습니다 :

위에서 언급했듯이, 반사는 가능성이 있습니다. 그러나 오버 헤드의 양 때문에 이상적이지는 않습니다 (특히 꽤 자주 호출 될 수있는 이벤트의 경우). 즉, 가능한 경우를 설명하기 위해 Reflection을 사용하여 작업 예제를 작성했습니다.

Please don't send the raptors...

Public Class Form1 

    Private Sub PictureBox_Events(ByVal sender As System.Object, ByVal e As System.EventArgs) _ 
     Handles PictureBox1.MouseLeave, PictureBox1.MouseEnter 

     Select Case GetEventType(New StackTrace()) 
      Case EventType.MouseEnter 
       Console.WriteLine("Enter") 
      Case EventType.MouseLeave 
       Console.WriteLine("Leave") 
      Case Else 
       Console.WriteLine("Dunno") 
     End Select 

    End Sub 

    Private Function GetEventType(ByRef callStack As StackTrace) As EventType 
     'I laugh in the face of NullReferenceExceptions...' 
     Dim callerName As String = callStack.GetFrames()(1).GetMethod().Name 

     If "OnMouseEnter".Equals(callerName, StringComparison.OrdinalIgnoreCase) Then 
      Return EventType.MouseEnter 
     ElseIf "OnMouseLeave".Equals(callerName, StringComparison.OrdinalIgnoreCase) Then 
      Return EventType.MouseLeave 
     End If 

     Return EventType.Dunno 

    End Function 

    Enum EventType 
     Dunno 
     MouseEnter 
     MouseLeave 
    End Enum 

End Class 
+1

또한 추가 할 것 (사실 StackTrace, 내가 사용하는 무엇 인 .... System.Diagnostics에 정확 하 Reflection이지만 나를 위해 충분히 가까이) 대부분의 이벤트가'전자가 있지만, 그 ''EventArgs'에서 상속받은 이벤트는 꽤 자세한 이벤트 정보를 가지고 있습니다. 위와 같이 할 수 있지만,''DirectCast()''가 없으면 이벤트에 대한 추가 정보가 없어집니다. – Basic

+0

좋은 지적 , 감사! – Pwninstein

관련 문제