无法将 ToolStripItem 转换为 MenuItem

Cannot cast a ToolStripItem to MenuItem

我正在尝试在上下文菜单中获取单击的项目。我从网上找到的代码得出以下代码,但我对 ToolStripMenuContextMenuMenuItem 有点困惑。据我所知,这似乎是获取所选菜单项的正确方法,但它似乎对我不起作用。

我在右键单击 DataGrid 行时创建了一个上下文菜单。

在单击事件中,我将发件人转换为 MenuItem。在调试器中,发件人对这两个项目看起来很好,但 var mi = sender as MenuItem 只是 returns 为空。请问我做错了什么?

ContextMenuStrip my_menu = new ContextMenuStrip();

int position_xy_mouse_row = dataGridView1.HitTest(e.X, e.Y).RowIndex;
if (position_xy_mouse_row >= 0
{
   DataGridViewRow selectedRow = dataGridView1.Rows[position_xy_mouse_row];
   dataGridView1.CurrentCell = dataGridView1.Rows[position_xy_mouse_row].Cells[0];

   my_menu.Items.Add(new ToolStripMenuItem
   {
      Name = "Delete",
      Text = "Delete",
      Tag = "Delete"
    });
    my_menu.Items.Add(new ToolStripMenuItem
    {
      Name = "Update",
      Text = "Update",
      Tag = "Update"
    });

    my_menu.Show(dataGridView1, new Point(e.X, e.Y));
    my_menu.ItemClicked += new ToolStripItemClickedEventHandler(my_menu_ItemClicked);
}


private void my_menu_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
    var mi = sender as MenuItem;
    string menuText = mi.Text;
}

本例中的 sender 是无法转换为 MenuItem 的 ContextMenuStrip

您想要的是 ToolStripItemClickedEventArgs

中您实际点击的项目

因此:

string menuText = e.ClickedItem.Text;

您将收到来自点击的文本 ToolStripItem

你在混合东西。 "Strip" 系列(ContextMenuStripToolStripItemToolStripMenuItem...)取代了旧的 ContextMenu/MenuItem... 东西(仍然存在为了向后兼容)

此处转换失败,因为它不是 MenuItem,也不是 ToolStripMenuItem,而是事件的来源:ContextMenuStrip.

如果您想要的是实际点击项目的文本,您应该在此处使用事件参数 eClickedItem 属性;正如马克的回答中所述。
注意ClickedItem returns一个ToolStripItem(ToolStripMenuItem继承自)