Я пишу приложение C# (.NET 3.5) с пользовательским элементом управления, который наследуется от DataGridView. Когда пользователь щелкает правой кнопкой мыши заголовок столбца, я хочу отобразить контекстное меню.
На самом деле у меня есть эта рабочая находка в двух формах в моем приложении. Я в тупике, потому что ContextMenu не будет отображаться в том же элементе управления в третьей форме. Я вижу, что событие Popup запускается, но я не вижу, чтобы меню отображалось на экране, и ни один из обработчиков событий пункта меню не вызывается.
Я совершенно не понимаю, почему мое контекстное меню не отображается, и это сводит меня с ума.
К сожалению, мой код слишком сложен, чтобы публиковать его здесь целиком... Я включаю короткий раздел, где я создаю и отображаю меню. Я не уверен, что проблема в этом коде, но я не знаю, где еще она может быть.
if (hti.RowIndex == -1)
{
ClickedColumnHeader = this.Columns[hti.ColumnIndex];
//Build a context menu and show it.
ContextMenu mnu = new ContextMenu();
mnu.MenuItems.Clear();
MenuItem mnuHide = new MenuItem("Hide");
mnuHide.Click += new EventHandler(mnuHide_Click);
MenuItem mnuRename = new MenuItem("Rename...");
mnuRename.Click += new EventHandler(mnuRename_Click);
MenuItem mnuCurrencyFormat = new MenuItem("Format as Currency");
mnuCurrencyFormat.Checked = false;
if (this.Columns[hti.ColumnIndex].DefaultCellStyle.Format == "c")
{
mnuCurrencyFormat.Checked = true;
}
mnuCurrencyFormat.Click += new EventHandler(mnuCurrencyFormat_Click);
MenuItem mnuSeparator = new MenuItem("-");
MenuItem mnuShow = new MenuItem("Show");
foreach (DataGridViewColumn col in this.Columns)
{
if (col.Visible == false)
{
MenuItem x = new MenuItem(col.HeaderText);
x.Click += new EventHandler(x_Click);
mnuShow.MenuItems.Add(x);
}
}
mnu.MenuItems.Add(mnuHide);
mnu.MenuItems.Add(mnuRename);
mnu.MenuItems.Add(mnuCurrencyFormat);
mnu.MenuItems.Add(mnuSeparator);
mnu.MenuItems.Add(mnuShow);
//for debugging...
mnu.Popup += new EventHandler(mnu_Popup);
mnu.Collapse += new EventHandler(mnu_Collapse);
mnu.Show(this, new System.Drawing.Point(f.X, f.Y));
}
Буду очень признателен за любую помощь, которую может предложить сообщество. Я действительно надеюсь, что я просто делаю что-то глупое здесь.