ContextMenu не отображается, и я не знаю, почему

Я пишу приложение 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));
}

Буду очень признателен за любую помощь, которую может предложить сообщество. Я действительно надеюсь, что я просто делаю что-то глупое здесь.


person The Demigeek    schedule 16.08.2009    source источник
comment
Вам не нужно показывать весь свой код, но создание короткой, но полной программы, демонстрирующей проблему, вполне возможно поможет вам решить ее самостоятельно и определенно облегчит помощь другим.   -  person Jon Skeet    schedule 17.08.2009
comment
Я знаю. Но с более чем 30 файлами в проекте и пользовательским элементом управления, у которого проблема состоит из 275+ строк кода, и всевозможными зависимостями данных, попытка сократить это до минимума, необходимого для воспроизведения, представляет собой довольно много работы. Я никогда не слышал, чтобы ContextMenu.Show() ничего не показывал. Я надеюсь, что у кого-то еще есть. Если нет, я сделаю всю работу, необходимую, чтобы придумать голую копию.   -  person The Demigeek    schedule 17.08.2009
comment
Попробуйте выполнить сравнение ваших форм (где элемент управления отображает меню по сравнению с другой формой, где он не работает).   -  person shahkalpeshp    schedule 17.08.2009


Ответы (1)


да, недостаточно информации, чтобы воссоздать проблему, но могу ли я предложить это, если она работает с двумя другими формами, проблема не в вашем унаследованном коде. Проблема с 3 формой.

Если вам действительно хочется потратить время, попробуйте сделать 4-й с нуля и посмотрите, не возникнет ли та же ошибка. Проверьте все обработчики событий. Похоже, у вас есть один провод на формах 1 и 2, но не на 3.

person hal9000    schedule 17.08.2009