【问题标题】:SourceControl of ContextMenuStrip is Nothing in ToolStripMenuItem Click?ContextMenuStrip的SourceControl在ToolStripMenuItem Click中什么都没有?
【发布时间】:2010-06-22 08:44:52
【问题描述】:

我有一个ContextMenuStrip 附加到更多控件。

使用ContextMenuStripOpening 事件过滤/禁用某些上下文条目。 在这种情况下,属性ContexteMenuStrip.SourceControl 设置正确。

我遇到的问题是 ToolStripMenuItem 的 Click 事件。该项目位于ToolStripDropDown 内。

我得到带有代码的父项:

Dim tsmi As ToolStripMenuItem = DirectCast(DirectCast(DirectCast(sender, ToolStripMenuItem).Owner, ToolStripDropDown).OwnerItem, ToolStripMenuItem)

然后我得到 ContextMenuStrip:

Dim contextMenu As ContextMenuStrip = DirectCast(tsmi.Owner, ContextMenuStrip)

但是现在,如果我检查 contextMenu.SourceControlNothing

您是否知道在这种情况下出了什么问题或为什么没有设置 SourceControl?

提前谢谢你

【问题讨论】:

    标签: .net vb.net contextmenu toolstrip


    【解决方案1】:

    我找到了一个解决方法,它并不是问题的真正答案。所以我会让它打开一段时间。

    我使用ContextMenuStripOpening事件在本地存储源对象。

    Private Sub contextGrid_Opening(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles contextGrid.Opening
    
      _ContextSourceGrid = DirectCast(contextGrid.SourceControl, DataGridView)
    
    End Sub
    

    并直接引用所有ToolStripMenuItemClick事件中保存的对象。

    【讨论】:

    • 呃,我自己也经历了同样的事情。看来这确实是唯一体面的解决方案。事实上,我尝试清除上下文菜单的 Closed 事件中的变量,发现我什至无法做到这一点;它在ToolStripItemClick 事件之前 被调用。所以我认为这与SourceControl 属性发生的情况相同;在处理其子对象的所有事件之前清除属性的内部操作顺序错误。
    【解决方案2】:

    试试这个:

    DirectCast(DirectCast(DirectCast(
        tsmi.Owner, System.Windows.Forms.ToolStrip).
        TopLevelControl, System.Windows.Forms.Control),
        System.Windows.Forms.ContextMenuStrip).SourceControl
    

    【讨论】:

    • 这仅适用于主工具条的ItemClicked 事件...不幸的是,单击子菜单项时该事件不会触发;他们需要简单的.Click 听众。可以追溯OwnerItem 链以获取主工具条,但似乎SourceControl 属性仅在触发ItemClicked 事件时才填写,这意味着打开子菜单时它只是null项目,即使你设法得到它。
    【解决方案3】:

    几周前我也有同样的问题,实际上,没有人能弄清楚为什么会发生这种行为。看看question I asked,我得到的解决方案效果很好。

    【讨论】:

    • 谢谢,但我需要在单击项目时将 SourceControl 链接到 ContextMenu,因为此菜单在更多 DataGridView 实例上重复使用。我不喜欢为每个 DataGridView 创建不同的 ContextMenu。
    • 没有必要为每个表单对象设置不同的 ContextMenu。相反,只有一个 ContextMenu。在加载表单时,为每个对象添加一个 Mouse.click 处理程序,该处理程序调用一个方法,该方法反过来打开 ContextMenu。你应该能够像那样完美地处理它。如果您确实需要源代码控制,实际上是单击的表单对象,请使用该右键单击处理程序设置一个全局变量,例如“ObjectToOpenContextMenu”。这样,根据用户在上下文菜单中单击的内容,全局变量实际上就是源控件。
    猜你喜欢
    • 1970-01-01
    • 2011-09-13
    • 2012-01-08
    • 2014-03-22
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    相关资源
    最近更新 更多