2010-06-22 79 views
0

我有一个ContextMenuStrip附加到更多的控件。ContextMenuStrip的SourceControl在ToolStripMenuItem中无效单击?

使用Opening事件ContextMenuStrip过滤/禁用某些上下文条目。 在这种情况下,物业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没有在这种情况下设置?

预先感谢您

回答

0

我发现了一个解决方法,它不是真正的问题答案。所以我会放一会儿。

我使用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事件里面。

0

我几个星期前就有这种完全一样的问题,在现实中,没有人能弄清楚为什么这种行为正在发生。看看question I asked,我给出的解决方案效果很好。

+0

谢谢你,但我需要链接到文本菜单中SourceControl被点击的项目时,因为此菜单上更多的DataGridView实例重用。我不喜欢为每个DataGridView创建不同的ContextMenu。 – Drake 2010-06-23 09:10:44

+0

对于每个表单对象,不需要有不同的ContextMenu。相反,只有一个ContextMenu。在窗体加载时,为每个对象添加一个Mouse.click处理程序,该处理程序调用一个方法,然后打开ContextMenu。你应该能够像那样完美地处理它。如果你真的需要源代码管理,实际上它是单击的表单对象,那么就有一个全局变量,比如“ObjectToOpenContextMenu”,它是通过右键单击处理程序设置的。这样,根据用户在上下文菜单中点击的内容,全局变量实际上是源控件。 – AndyPerfect 2010-06-23 14:47:25

1

试试这个:

DirectCast(DirectCast(DirectCast(
    tsmi.Owner, System.Windows.Forms.ToolStrip). 
    TopLevelControl, System.Windows.Forms.Control), 
    System.Windows.Forms.ContextMenuStrip).SourceControl 
相关问题