右键单击发生的 datagridview 单元格附近不显示上下文菜单

Context menu not displaying near datagridview cell where right click occurred

上下文菜单弹出窗口有点问题。 我有一个 datagridview,我希望用户能够右键单击一个单元格并显示上下文菜单。用户可以多 select 个连续或非连续的单元格。右键单击并获得上下文菜单。我已经通读了堆栈溢出问题并尝试了这些建议,none 对我有用。上下文菜单不会显示在 selected 单元格附近。

我正在对 datagridview cellmouse down 事件进行编码并检查鼠标右键。这是我的代码:

if (e.Button == MouseButtons.Right)
{
    ContextMenu m = new ContextMenu();
    MenuItem mi = new MenuItem("Set Online");
    mi.Click += setOnlineItemCell_Click;
    m.MenuItems.Add(mi);

    MenuItem mi2 = new MenuItem("Set Offline");
    mi2.Click += setOfflineItemCell_Click;
    m.MenuItems.Add(mi2);

    m.Show(machineGrid, new Point(e.X, e.Y));
}

我不能只将一个参数传递给 Show 方法,因为它抱怨找不到它(即使 MSDN 说你可以)。

如果您能帮助我们在单元格附近显示上下文菜单,我们将不胜感激。

C#,Visual Studio 2015 专业版,.NET 4.5.2

让上下文菜单显示在最后一个“选定”单元格的旁边是可行的;但是,它不会非常用户友好。在大多数情况下,当用户“右键单击”某个内容时,上下文菜单应该出现在用户“右键单击”时鼠标“指针”所在的“下方”。您所描述的是将上下文菜单“远离”鼠标“箭头”所在的位置。我相信大多数用户不会期待这一点。

我从您 post 编辑的内容中猜测...用户在网格中选择多个单元格,然后用户“右键单击”网格中的某处。这将显示一个上下文菜单(在鼠标下方,而不是将菜单移动到某个选定的单元格)。上下文菜单将显示“OffLine/OnLine”菜单项。然后在用户选择“Online/Offline”之后,一些方法会使用网格中“选择”的单元格作为数据来设置单元格在线或离线。这是我能从你的问题中解读出来的。

为了提供帮助,以下是一些建议。 post中的最后一行代码....

m.Show(machineGrid, new Point(e.X, e.Y));

以上行将上下文菜单移动到使用 UI 坐标的网格 X、Y 值。这似乎与“选择”了哪些单元格无关。然而,这会将上下文菜单移动到用户右键单击上方的某个位置……迫使用户“追逐”上下文菜单。

最后,我质疑使用“CellMouseDown”事件来执行此上下文菜单逻辑。 DataGridView 有自己的“ContextMenuStrip”,您可以对其进行设置。使用 DataGridView’s ContextMenuStrip 可能是一种更简单的方法。下面是使用 ContextMenuStrip 设置名为 dgv_PlayerPoolDataGridView 的示例。

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;
}

项目在上面添加一行,接受一个字符串显示在菜单中,一个图像,最后一个点击时调用的事件。

用户选择上下文菜单项时触发的事件。

private void setOffline_Click(object sender, EventArgs e) {
  MessageBox.Show("SetOffLine");
}
private void setOnline_Click(object sender, EventArgs e) {
  MessageBox.Show("SetOnLine");
}

希望这是有道理的。