Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用快捷键时获取我的ContextMenuStrip的SourceControl_C#_Winforms_Contextmenu - Fatal编程技术网

C# 使用快捷键时获取我的ContextMenuStrip的SourceControl

C# 使用快捷键时获取我的ContextMenuStrip的SourceControl,c#,winforms,contextmenu,C#,Winforms,Contextmenu,我有一个ContextMenuStrip附加到两个控件(DataGridView)。 在ToolStripMenuItem单击事件中,我使用以下代码设法获取原始调用者(DataGridView): var menu = (ToolStripDropDownItem)sender; var strip = (ContextMenuStrip)menu.Owner; var dgv = (DataGridView)strip.SourceControl; 当我点击我的ToolStripMenu

我有一个
ContextMenuStrip
附加到两个控件(
DataGridView
)。
ToolStripMenuItem
单击事件中,我使用以下代码设法获取原始调用者(DataGridView):

var menu = (ToolStripDropDownItem)sender;
var strip = (ContextMenuStrip)menu.Owner;
var dgv = (DataGridView)strip.SourceControl;  
当我点击我的
ToolStripMenuItem

但是当我使用链接到
ToolStripMenuItem
的sortcut键时,strip.
SourceControl
返回空值。

有人知道原因吗?

SourceControl属性显示导致ContextMenuStrip打开的控件。由于在本例中不显示ContextMenuStrip,因此没有用于打开它的控件,因此该属性为null

此属性最好在开始事件的上下文中使用。看

更新:确定哪个DataGridView是ToolStripMenuItem的预期接收者的一种方法是单击以查看哪个具有焦点:

var dgv = this.ActiveControl as DataGridView;
if ( dgv != null) // make sure to check for null before trying to use this var
    //...

可能是因为您有两个datagridview和一个菜单,所以当您使用快捷方式时,事件不知道触发事件的datagridview是什么,您可以尝试为每个datagrid或不同的菜单设置不同的快捷方式。快捷方式是ToolStripMenuItem的属性。由于只有一个ToolStripMenuItem,我无法设置不同的快捷方式。一个解决方案是创建两个菜单,但我想知道为什么会有这种行为。感谢您对SourceControl属性的精确性。但是,当我使用快捷键时,如何获得拥有ContextMenuStrip的控件呢?我添加了一种检查具有焦点的DataGridView的方法。如果焦点不在DataGridView上,则可能无法判断用户的目标。ActiveControl属性是一个好主意。不幸的是,我的DataGridViews位于SplitContainer中,ActiveControl属性会返回SplitContainer。SplitContainer也有ActiveControl,因为它是ContainerControl,就像Form或UserControl类一样。在这种情况下,您可以执行以下操作:
SplitContainer=this.ActiveControl作为SplitContainer;DataGridView dgv=container.ActiveControl作为DataGridView