情况:
我在VB.net表单中有一个上下文菜单,在ItemClicked
上触发一个事件处理程序。自动生成的子网接收sender
和e
作为参数。由于我没有多次重新发明轮胎,我将此上下文菜单链接到三个文本框,让我们将它们命名为Textbox1,Textbox2和Textbox3。
问题:如何弄清楚菜单打开的文本框?
好的,我已经尝试了什么?
sender
包含菜单本身,e.ClickedItem
只返回所选的单个菜单项。 sender.Parent
永远都不是sender.OwnerItem
也总是Nothing` Me.Textbox1.Focused
始终为False
,即使它是"父母"控制菜单。答案 0 :(得分:1)
好的,我找到了一个工作正常的解决方案,这里是所有具有相同问题的VB.net编码器的代码。
上下文菜单在TextBox1中链接,因此我们需要添加另一个事件处理程序,将发送控件保存到菜单中:
Private Sub TextBox1_MouseUp(sender As Windows.Forms.Control, e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseUp
If e.Button = Windows.Forms.MouseButtons.Right Then
ContextMenu.Tag = sender
End If
End Sub
这是单击菜单项时事件处理程序的代码:
Private Sub ContextMenu_ItemClicked(sender As System.Object, e As System.Windows.Forms.ToolStripItemClickedEventArgs) Handles ContextMenu.ItemClicked
ContextMenu.Close()
If ContextMenu.Tag Is Nothing Then
Debug.Print("debug info: forgot to set sender? well ... KABOOM!")
Exit Sub
End If
Dim oParent As Windows.Forms.Control
Try
oParent = ContextMenu.Tag
Catch ex As Exception
Debug.Print("debug info: tag contains data other than sender control. well ... KABOOM!")
Exit Sub
End Try
' do fancy stuff here.
' release sender
ContextMenu.Tag = Nothing
End Sub