Свойство ContextMenuStrip.Owner пустое, когда извлекается из вложенного ToolStripMenuItem
У меня есть ContextMenuStrip
настроить с двумя ToolStripItem
s. Второй ToolStripItem
имеет два дополнительных вложенных ToolStripItem
s. Я определяю это как:
ContextMenuStrip cms = new ContextMenuStrip();
ToolStripMenuItem contextJumpTo = new ToolStripMenuItem();
ToolStripMenuItem contextJumpToHeatmap = new ToolStripMenuItem();
ToolStripMenuItem contextJumpToHeatmapStart = new ToolStripMenuItem();
ToolStripMenuItem contextJumpToHeatmapLast = new ToolStripMenuItem();
cms.Items.AddRange(new ToolStripItem[] { contextJumpTo,
contextJumpToHeatmap});
cms.Size = new System.Drawing.Size(176, 148);
contextJumpTo.Size = new System.Drawing.Size(175, 22);
contextJumpTo.Text = "Jump To (No Heatmapping)";
contextJumpToHeatmap.Size = new System.Drawing.Size(175, 22);
contextJumpToHeatmap.Text = "Jump To (With Heatmapping)";
contextJumpToHeatmap.DropDownItems.AddRange(new ToolStripItem[] { contextJumpToHeatmapStart,
contextJumpToHeatmapLast });
contextJumpToHeatmapStart.Size = new System.Drawing.Size(165, 22);
contextJumpToHeatmapStart.Text = "From Start of File";
contextJumpToHeatmapLast.Size = new System.Drawing.Size(165, 22);
contextJumpToHeatmapLast.Text = "From Last Data Point";
Затем я настраиваю прослушиватель событий для событий щелчка трех ToolStripMenuItem
s, на которые я хочу ответить. Вот методы (я только перечислил два из трех методов):
void contextJumpTo_Click(object sender, EventArgs e)
{
// Try to cast the sender to a ToolStripItem
ToolStripMenuItem menuItem = sender as ToolStripMenuItem;
if (menuItem != null)
{
// Retrieve the ContextMenuStrip that owns this ToolStripItem
ContextMenuStrip owner = menuItem.Owner as ContextMenuStrip;
if (owner != null)
{
// Get the control that is displaying this context menu
DataGridView dgv = owner.SourceControl as DataGridView;
if (dgv != null)
// DO WORK
}
}
}
void contextJumpToHeatmapStart_Click(object sender, EventArgs e)
{
// Try to cast the sender to a ToolStripItem
ToolStripMenuItem menuItem = sender as ToolStripMenuItem;
if (menuItem != null)
{
// Retrieve the ToolStripItem that owns this ToolStripItem
ToolStripMenuItem ownerItem = menuItem.OwnerItem as ToolStripMenuItem;
if (ownerItem != null)
{
// Retrieve the ContextMenuStrip that owns this ToolStripItem
ContextMenuStrip owner = ownerItem.Owner as ContextMenuStrip;
if (owner != null)
{
// Get the control that is displaying this context menu
DataGridView dgv = owner.SourceControl as DataGridView;
if (dgv != null)
// DO WORK
}
}
}
}
Вот проблема, которую я имею:
мой contextJumpTo_Click
Метод работает отлично. Мы дошли до того места, где я определяю, какой DataGridView
щелчок пришел, и я могу продолжить. contextJumpTo
ToolStripMenuItem
это НЕ вложенный пункт меню на ContextMenuStrip
,
Но мой метод для contextJumpToHeatmapStart_Click
не работает правильно. Когда я спускаюсь к линии, где я определяю owner.SourceControl
, SourceControl
является нулевым, и я не могу продолжить. Теперь я знаю, что это ToolStripMenuItem
вложен в другой в моем ContextMenuStrip
, но почему SourceControl
свойство вдруг ноль на моем ContextMenuStrip
?
Как мне получить SourceControl
для вложенного ToolStripMenuItem
для ContextMenuStrip
?
1 ответ
Я считаю, что это ошибка.
Я попытался просканировать список родителей инструментальных полос, чтобы добраться до владельца ContextStripMenu, который работал, но свойство SourceControl всегда было нулевым.
Похоже, что обычное решение заключается в установке элемента управления при открытии контекстного меню:
private Control menuSource;
cms.Opening += cms_Opening;
void cms_Opening(object sender, CancelEventArgs e) {
menuSource = ((ContextMenuStrip)sender).SourceControl;
}
Тогда ваш код в основном превращается в это:
DataGridView dgv = menuSource as DataGridView;
if (dgv != null) {
// do work
}