Почему мое контекстное меню WinForms не отображается там, где находится мышь?

В моем приложении у меня есть DataGridView , который предназначен для настройки некоторых параметры. Идея состоит в том, что вы можете ввести любой текст, который хотите, в первый столбец, но если вы щелкните правой кнопкой мыши, он предоставит вам явно поддерживаемые значения. Мне нужно, чтобы это было текстовое поле, а не раскрывающийся список, потому что мне нужно поддерживать редактирование недопустимых (или старых) конфигураций.

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

    private void grvFieldData_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
    {
        // If this is a right click on the Field name column, create a context menu 
        //   with recognized options for that field
        if (e.Button == MouseButtons.Right && grvFieldData.Columns[e.ColumnIndex].Name == "clmFieldName")
        {
            ContextMenu menu = new ContextMenu();

            if (_supportedDataGrids.ContainsKey((cmbDataGrid.SelectedItem as DataGridFieldList).GridName))
            {
                // Loop through all the fields and add them to the context menu
                List<string> fields = _supportedDataGrids[((cmbDataGrid.SelectedItem as DataGridFieldList).GridName)];
                fields.Sort();

                foreach (string field in fields)
                    menu.MenuItems.Add(new MenuItem(field));

                // Make sure there is at least one field before displaying the context menu
                if (menu.MenuItems.Count > 0)
                    menu.Show(this, e.Location, LeftRightAlignment.Right);
            }
        }
    }

. Оно работает «правильно», но контекстное меню появляется вверху формы, а не там, где находится указатель мыши. Если я изменю вызов Show () на использование DataGridView вместо формы, у меня возникнет та же проблема, но вместо этого она появится в верхнем левом углу сетки, а не где находится мышь.

Как ни странно, если я изменю это событие на событие MouseClick (вместо события CellMouseclick ), все будет работать, и контекстное меню появится именно там, где указана мышь. указатель есть. Проблема с этой опцией заключается в том, что пользователь может не щелкнуть правой кнопкой мыши по ячейке, которая в данный момент выбрана, а это означает, что при нажатии на элемент меню будет изменена выбранная ячейка, а не ячейка, по которой он щелкнул правой кнопкой мыши.

Есть ли у кого-нибудь подсказки, почему контекстные меню, созданные с помощью CellMouseClick , не отображаются в нужном месте?

7
задан KallDrexx 23 February 2011 в 16:39
поделиться