无法将 ToolStripItem 转换为 MenuItem
Cannot cast a ToolStripItem to MenuItem
我正在尝试在上下文菜单中获取单击的项目。我从网上找到的代码得出以下代码,但我对 ToolStripMenu
、ContextMenu
和 MenuItem
有点困惑。据我所知,这似乎是获取所选菜单项的正确方法,但它似乎对我不起作用。
我在右键单击 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" 系列(ContextMenuStrip
、ToolStripItem
、ToolStripMenuItem
...)取代了旧的 ContextMenu
/MenuItem
... 东西(仍然存在为了向后兼容)
此处转换失败,因为它不是 MenuItem
,也不是 ToolStripMenuItem
,而是事件的来源:ContextMenuStrip
.
如果您想要的是实际点击项目的文本,您应该在此处使用事件参数 e
的 ClickedItem
属性;正如马克的回答中所述。
注意ClickedItem
returns一个ToolStripItem
(ToolStripMenuItem继承自)
我正在尝试在上下文菜单中获取单击的项目。我从网上找到的代码得出以下代码,但我对 ToolStripMenu
、ContextMenu
和 MenuItem
有点困惑。据我所知,这似乎是获取所选菜单项的正确方法,但它似乎对我不起作用。
我在右键单击 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" 系列(ContextMenuStrip
、ToolStripItem
、ToolStripMenuItem
...)取代了旧的 ContextMenu
/MenuItem
... 东西(仍然存在为了向后兼容)
此处转换失败,因为它不是 MenuItem
,也不是 ToolStripMenuItem
,而是事件的来源:ContextMenuStrip
.
如果您想要的是实际点击项目的文本,您应该在此处使用事件参数 e
的 ClickedItem
属性;正如马克的回答中所述。
注意ClickedItem
returns一个ToolStripItem
(ToolStripMenuItem继承自)