无法将ToolStripItem强制转换为MenuItem

本文关键字:转换 MenuItem ToolStripItem | 更新日期: 2023-09-27 18:01:09

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

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

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

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

无法将ToolStripItem强制转换为MenuItem

在这种情况下,sender是不能转换为MenuItem的ContextMenuStrip

您想要的是ToolStripItemClickedEventArgs 中实际点击的项目

因此:

string menuText = e.ClickedItem.Text;

您将从单击的ToolStripItem 收到文本

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

这里强制转换失败,因为它不是MenuItem,也不是ToolStripMenuItem,而是事件的源:ContextMenuStrip

如果您想要的是实际单击项目的文本,则应在此处使用事件参数eClickedItem属性;正如马克的回答中所说
注意ClickedItem返回一个ToolStripItem(ToolStripMenuItem从中继承(