vb.net - 如何找到 ContextMenuStrip 的发件人?

标签 vb.net

情况:

我有一个 VB.NET 窗体的上下文菜单,它在 ItemClicked 上触发了一个事件处理程序。自动生成的子例程接收 sendere 作为参数。由于我不会多次重新发明轮子,因此我将此上下文菜单链接到三个文本框。我们将它们命名为 Textbox1、Textbox2 和 Textbox3。

问题:如何确定菜单是在哪个文本框中打开的?

好的,我已经尝试了什么?

  • sender 包含菜单本身,
  • e.ClickedItem 仅返回所选的单个菜单项。
  • sender.Parent 始终为空
  • sender.OwnerItem 也始终为 Nothing`
  • Me.Textbox1.Focused 始终是 False,即使它是菜单的“父”控件也是如此。

最佳答案

好的,我找到了一个工作正常的解决方案,下面是所有遇到相同问题的 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

关于vb.net - 如何找到 ContextMenuStrip 的发件人?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31429616/

相关文章:

sql - 如何从 VB.NET 中的存储过程中获取返回值

.net - 查找字符串,然后使用正则表达式向后查找另一个字符串

javascript - ASP 按钮点击验证

mysql - vb.net 的最小值和最大值

c# - 在 WPF(C# 或 vb.net)中查找我的应用程序的可执行文件的位置?

vb.net - Asp.net MVC3 合适的模型通过VB.net

c# - 从 VB.NET 到 C# 的属性和方法覆盖转换

vb.net - 无法使用 mshtml.HTMLInputElement 找到并单击提交按钮

.net - VB.NET 空字符串数组

asp.net - 错误: "is already declared as protected WithEvents"