Как вы получаете элемент управления, по которому щелкнули, чтобы открыть ContextMenuStrip? - PullRequest
9 голосов
/ 16 января 2010

Я использую ContextMenuStrip для нескольких элементов управления, и я пытаюсь найти лучший способ получить элемент управления, на который фактически щелкнули, чтобы открыть контекстное меню. Отправитель просто дает ссылку ToolStripMenuItem, которая имеет свойство Owner, которое ссылается на ContextMenuStrip, но я не могу понять, как определить, из какого элемента управления произошел щелчок. Должен быть простой способ проверить это, верно? Я проверяю это в событии click ToolStripMenuItem.

Friend WithEvents mnuWebCopy As System.Windows.Forms.ToolStripMenuItem
...
Private Sub mnuWebCopy_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles mnuWebCopy.Click

Я нашел аналогичный пост об этом, но в нем упоминается использование свойства SourceControl, которого я здесь не вижу.

Я использую Visual Studio 2008, VB.Net winforms.

Ответы [ 5 ]

22 голосов
/ 16 января 2010
Private Sub mnuWebCopy_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles mnuWebCopy.Click

Dim myItem As ToolStripMenuItem = CType(sender, ToolStripMenuItem)
Dim cms As ContextMenuStrip = CType(myItem.Owner, ContextMenuStrip)

MessageBox.Show(cms.SourceControl.Name)

End Sub
6 голосов
/ 16 января 2010

Ваш отправитель - ToolStripMenuItem - приведите его.
Его владельцем является ContextMenuStrip - получите его.

SourceControl является свойством в ContextMenuStrip и ссылается на последний элемент управления, из которого был отображен ContextMenuStrip.

0 голосов
/ 28 июля 2017
Private Sub cmsRightClick_Click(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles cmsRightClick.MouseClick
    Dim s As String = CType(sender, ContextMenuStrip).GetItemAt(CType(sender, ContextMenuStrip).DisplayRectangle.X, _
     CType(sender, ContextMenuStrip).DisplayRectangle.Y + e.Y).Text.Trim()


    MsgBox(s)
    Select Case s 
        Case Is = "Select Summary Total"
            Dim x = 0
        Case Is = "Select Collections"
            Dim x = 1
        Case Is = "UnSelect"
            Dim x = 2
        Case Is = "Reconcile"
            Dim x = 3
        Case Is = "Undo Reconciliation"
            Dim x = 4
    End Select
End Sub
0 голосов
/ 10 февраля 2015

На VB.NET 2013 все отлично работает:

Dim cms As ContextMenuStrip = CType(sender, ContextMenuStrip)
MessageBox.Show(cms.SourceControl.Name)
0 голосов
/ 10 октября 2014
Private Sub kdgToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles kdgToolStripMenuItem.Click
    Dim sms = (sender.GetCurrentParent()).SourceControl.name
    MsgBox(sms)
End Sub

/// Faster

...