无法将ToolStripItem强制转换为MenuItem

时间:2016-08-05 09:41:36

标签: c# contextmenu

我想在上下文菜单中获取点击的项目。我从网上找到的代码中得到以下代码,但我对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;
}

2 个答案:

答案 0 :(得分:0)

在这种情况下,senderContextMenuStrip,无法将其投放到MenuItem。

您想要的是ToolStripItemClickedEventArgs

中的实际点击项目

所以:

string menuText = e.ClickedItem.Text;

您将收到点击的ToolStripItem

中的文字

答案 1 :(得分:0)

你在搅拌东西。 " Strip"家人(ContextMenuStripToolStripItemToolStripMenuItem ...)替换旧的ContextMenu / MenuItem ...内容(为了向后兼容仍然存在)

此处的广告投放失败,因为它不是MenuItem,也不是ToolStripMenuItem,而是事件的来源:ContextMenuStrip

如果你想要的是实际点击项目的文本,你应该在这里使用事件参数ClickedItem的{​​{1}}属性;正如马克的答案所述 注意e返回ClickedItem(ToolStripMenuItem继承自)