我在上下文菜单中遇到了一些问题。 我有一个datagridview,我希望用户能够右键单击一个单元格并显示上下文菜单。用户可以多选连续或不连续的单元。右键单击并获取上下文菜单。我已经阅读了堆栈溢出问题并尝试了建议,但没有一个对我有用。上下文菜单不会显示在所选单元格附近。
我正在编码datagridview cellmouse down事件并检查鼠标右键。这是我的代码:
$('body>:last-child').remove()
我无法将一个参数传递给Show方法,因为它抱怨它无法找到它(即使MSDN说你可以)。
非常感谢任何帮助将上下文菜单显示在靠近单元格的位置。
C#,Visual Studio 2015 Professional,.NET 4.5.2
答案 0 :(得分:0)
让上下文菜单显示在最后一个“选定”单元格旁边是可行的;但是,它不会非常用户友好。在大多数情况下,当用户“右键单击”某事时,当用户“右键单击”鼠标“指针”时,预期上下文菜单会出现在“下面”。您所描述的是将上下文菜单“移开”鼠标“箭头”所在的位置。我相信大多数用户都不会期待这一点。
我猜测你发布了什么...用户在网格中选择多个单元格,然后用户在网格上的某处“右键单击”。这将显示上下文菜单(在MOUSE下面,而不是将菜单移动到某个选定的单元格)。上下文菜单将显示“OffLine / OnLine”菜单项。然后,在用户选择“在线/离线”之后,某些方法将使用网格中的“选定”单元格作为数据来在线或离线设置单元格。这与我可以从你的问题中解读一样多。
为了提供帮助,以下是一些建议。帖子中的最后一行代码......
m.Show(machineGrid, new Point(e.X, e.Y));
上面的行使用UI坐标将上下文菜单移动到网格X,Y值。这似乎与“选择”哪些细胞无关。然而,这会将上下文菜单移动到用户右键单击的位置上方...强制用户“追逐”上下文菜单。
最后,我质疑使用“CellMouseDown”事件来执行此上下文菜单逻辑。 DataGridView
有自己的“ContextMenuStrip”,您可以设置它。使用DataGridView’s
ContextMenuStrip
可能是一种更简单的方法。以下是使用DataGridView
设置名为dgv_PlayerPool
的{{1}}的示例。
ContextMenuStrip
项目在上面添加一行,在菜单中显示一个字符串,一个图像,最后点击时要调用的事件。
用户选择上下文菜单项时触发的事件。
private void SetContexMenu() {
ContextMenuStrip cms = new ContextMenuStrip();
cms.Items.Add("Set OnLine", null, setOnline_Click);
cms.Items.Add("Set OffLine", null, setOffline_Click);
dgv_PlayerPool.ContextMenuStrip = cms;
}
希望这是有道理的。