2015-01-12 1 views
0

다른 사용자 정의 컨트롤과 폼에 포함 된 VB.NET 사용자 정의 컨트롤이 있습니다. 내부 사용자 정의 컨트롤에는 DataGridView 행 클릭에 의해 트리거되는 컨텍스트가 있습니다. 이렇게하면 이벤트 처리기가 성공적으로 활성화되지만 ("확인"메시지가 표시됨) 보낸 사람이 선택한 항목을 보내지 않습니다 (다른 MsgBox 메시지가 표시되지 않음). 다음은 코드입니다.ContextMenuStrip 선택한 항목이 UserControl에서 손실되었습니다.

Public CMSV As ContextMenuStrip 

Private grdSourceViewerCurrentRow As Long 

Public Sub grdSourceViewer_RowHeaderMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles grdSourceViewer.RowHeaderMouseClick 
    'code to review/edit source details 
    Select Case e.Button 
     Case Windows.Forms.MouseButtons.Right 
      grdSourceViewerCurrentRow = e.RowIndex 'retain for downstream code 
      CMSV = New ContextMenuStrip 
      AddHandler CMSV.MouseClick, AddressOf SourceViewDocumentationEdit 
      CMSV.Items.Add("Edit") 
      CMSV.Items.Add("Transfer to Evidence") 
      Dim Pt As Point = New Point() 
      Pt.X = grdSourceViewer.PointToClient(Cursor.Position).X 
      Pt.Y = grdSourceViewer.PointToClient(Cursor.Position).Y + 20 

      CMSV.Show(sender, Pt) 

     Case Windows.Forms.MouseButtons.Left 
      Exit Sub 
     Case Else 
      Exit Sub 
    End Select 
End Sub 

Public Sub SourceViewDocumentationEdit() 
    MsgBox("OK") 'I can see it reaches here 
    Dim cc As ToolStripItemCollection = CMSV.Items 
    Dim SelectedItem As Integer = -1 
    Dim SelectedValue As String = "" 

    For i As Integer = 0 To cc.Count - 1 
     If cc.Item(i).Selected Then 
      SelectedItem = i 
      SelectedValue = cc.Item(SelectedItem).Text 
      Exit For 
     End If 
    Next 

    Select Case SelectedValue 
     Case "Edit" 
      MsgBox("Edit code here") 
     Case "Transfer to Evidence" 
      MsgBox("Transfer code here") 
    End Select 
End Sub 

무엇이 잘못 되었나요? 클릭 한 항목에 대한 정보를 잃어 버리는 이유는 무엇입니까?

답변

0

왜 때마다 메뉴를 다시입니까?

아무튼 CMSV.Items.Add()에서 반환 한 ToolStripMenuItem을 저장하고 대신 연결합니다.

간단한 예 :

이 나를 위해 작동하지 않습니다
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    CMSV = New ContextMenuStrip 
    Dim TSMI As ToolStripMenuItem 
    TSMI = CMSV.Items.Add("Edit") 
    AddHandler TSMI.Click, AddressOf TSMI_Click 
    TSMI = CMSV.Items.Add("Transfer to Evidence") 
    AddHandler TSMI.Click, AddressOf TSMI_Click 
    ' ... 
End Sub 

Private Sub TSMI_Click(sender As Object, e As EventArgs) 
    Dim TSMI As ToolStripMenuItem = DirectCast(sender, toolstripmenuitem) 
    Select Case TSMI.Text 
     Case "Edit" 
      Debug.Print("...Edit Code...") 
      ' use "grdSourceViewerCurrentRow " in here? 
     Case "Transfer to Evidence" 
      Debug.Print("...Transfer to Evidence Code...") 
      ' use "grdSourceViewerCurrentRow " in here? 
    End Select 
End Sub 
+0

둘 다 정확하고 도움이됩니다. CM을 한 번 설정하고 두 CM 항목의 이벤트 처리기를 설정해야했습니다. 이 작동합니다. 내 전략은 중첩되지 않은 사용자 컨트롤에서 작동했지만이 복잡성으로 인해 결함이있는 논리가 나타났습니다. –

0

문자열이 아닌 ToolStripMenuItem을 사용해야합니다. 그런 다음 클릭 이벤트 인 핸들러를 추가 할 수 있습니다.

Dim tsmi As New ToolStripMenuItem 
tsmi.Text = "Edit" 
AddHandler tsmi.Click, AddressOf ItemClicked 
CMSV.Items.Add(tsmi) 

그런 다음 이벤트 서브 :

Private Sub ItemClicked(sender As Object, e As EventArgs) 
'item clicked 
'sender object would be the ToolStripMenuItem 
End Sub 
+0

; 나는 그것을 시도했다. CMSV.Items.Add는 텍스트 문자열 또는 ToolStripMenuItem 중 하나를 사용할 수 있습니다. 두 경우 모두 항목을 만듭니다. 그래서이 문제를 일으키는보다 복잡한 것이 있습니다. –

관련 문제