2017-04-19 3 views
0

vpsGridView라는 VB.Net에 UserControl이 있고 MenuStrip 이름 툴바와 dtgvpsGV라는 Datagridview가 있습니다. 내 MenuStrip에는 두 개의 ToolStripMenu, tsAddRow (Ctrl + Ins) 바로 가기 키 및 tsDeleteRow (Ctrl + Del) 바로 가기 키가 있습니다.단축키 사용시 이벤트 발생 방법

Public Event vps_ItemClick(ByVal sender As Object, ByVal e As System.EventArgs) 

Private Sub Toolbar_ItemClick(ByVal sender As Object, ByVal e As System.EventArgs) 
    RaiseEvent vps_ItemClick(sender, e) 
End Sub 

Public Sub New() 
    ' This call is required by the Windows Form Designer. 
    InitializeComponent() 

    Dim btn As ToolStripMenuItem = Nothing 
    Dim txt As ToolStripTextBox = Nothing 

    'Loop through MenuStrip items for Custom Handler 
    For x As Integer = 0 To Toolbar.Items.Count - 1 
     If Toolbar.Items(x).GetType.ToString = "System.Windows.Forms.ToolStripMenuItem" Then 
      btn = DirectCast(Toolbar.Items(x), ToolStripMenuItem) 

      RemoveHandler btn.Click, AddressOf Toolbar_ItemClick 
      AddHandler btn.Click, AddressOf Toolbar_ItemClick 
     End If 
    Next 
End Sub 

내 문제는 내가 바로 가기 키를 사용하는 경우, vps_ItemClick이 발사되지 않은,하지만 난 클릭 사용하는 경우 그것을 잘 작동합니다 :

여기 내 코드입니다. 무엇이 잘못되었는지 확인하거나 더 나은 방법을 제안하도록 도와 줄 수 있습니까? 고맙습니다.

+0

당신은 바로 가기 키를 누르면 때 'ToolStripMenuItem'가'Click' 이벤트를 발생하지 않는 것을 제안 할 것으로 보인다 그것은 단순히 뭔가를하지 않는 경우가 아니다 실제로 깨졌습니다. 가장 먼저 할 일은 각 메뉴 항목에 대한 핸들러를 디자이너에서 두 번 클릭하고 각각에 브레이크 포인트를 설정하고 단축키를 누를 때 적중 여부를 테스트하는 것입니다. – jmcilhinney

+0

고맙습니다. 위의 코드에서 단축키를 누르면 코드가 Toolbar_ItemClick Sub를 트리거/실행하지만 내부의 RaiseEvent vps_ItemClick (보낸 사람, 전자)이 실행되지 않았습니다. 나는 틀린 것을 모른다. – Leo

+0

'Toolbar_ItemClick' 메쏘드가 호출되면,'RaiseEvent'가 실행될 것입니다. 이벤트가 발생하거나 예외가 발생합니다. 예외가 없다면 작동하고 다른 곳에서 뭔가 잘못하고있는 것입니다. 중단 점을 사용하고 코드를 단계별로 실행하여 코드를 올바르게 디버깅해야합니다. – jmcilhinney

답변

0

그 코드의 대부분을 작성할 필요가 없습니다. 여기서 AddHandler을 사용할 필요가 없습니다. 평소처럼 IDE에서 이벤트 처리기를 생성하도록하십시오. 여러 구성 요소의 이벤트를 처리하는 단일 메서드를 만들려면 :

  1. 디자이너에서 여러 구성 요소를 선택합니다.
  2. 속성 창을 엽니 다.
  3. 이벤트 버튼을 클릭하십시오.
  4. 관심있는 이벤트를 두 번 클릭하십시오.

IDE는 Handles 절에 여러 이벤트가있는 단일 메서드를 생성합니다. 원하는 경우 더 일반적인 방법의 이름을 변경할 수 있습니다. 이 경우,이 같은 끝낼 수 있습니다,

Private Sub ToolStripMenuItems_Click(sender As Object, e As EventArgs) Handles SecondToolStripMenuItem.Click, 
                       FirstToolStripMenuItem.Click 

End Sub 

그때 이름과 이벤트를 제기 당신은 .NET 규칙에 충실하는 것이 좋습니다 것이라고 즉

Private Sub ToolStripMenuItems_Click(sender As Object, e As EventArgs) Handles SecondToolStripMenuItem.Click, 
                       FirstToolStripMenuItem.Click 
    OnItemClick(EventArgs.Empty) 
End Sub 

Public Event ItemClick As EventHandler 

Protected Overridable Sub OnItemClick(e As EventArgs) 
    RaiseEvent ItemClick(Me, e) 
End Sub 

주 객체 이벤트를 제기 한 사람은 항상 sender이어야합니다. 이벤트 처리기에서 sender을 다른 이벤트로 전달하면 안됩니다. ItemClick 이벤트에서 클릭 한 항목을 지정하려면 e 매개 변수 (예 :

Public Class ItemClickEventArgs 
    Inherits EventArgs 

    Public ReadOnly Property Item As ToolStripMenuItem 

    Public Sub New(item As ToolStripMenuItem) 
     Me.Item = item 
    End Sub 

End Class 

한 다음 :

Private Sub ToolStripMenuItems_Click(sender As Object, e As EventArgs) Handles SecondToolStripMenuItem.Click, 
                       FirstToolStripMenuItem.Click 
    OnItemClick(New ItemClickEventArgs(DirectCast(sender, ToolStripMenuItem))) 
End Sub 

Public Event ItemClick As EventHandler(Of ItemClickEventArgs) 

Protected Overridable Sub OnItemClick(e As ItemClickEventArgs) 
    RaiseEvent ItemClick(Me, e) 
End Sub