В моем приложении есть 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
, не отображаются в правильном месте?