En mi aplicación tengo un DataGridView
que está diseñado para configurar algunas opciones. La idea es que pueda ingresar el texto que desee en la primera columna, pero si hace clic derecho, obtendrá valores respaldados explícitamente. Necesito que sea una caja de texto en lugar de una lista desplegable porque necesito apoyar la edición de configuraciones inválidas (o antiguas).¿Por qué mi menú contextual WinForms no aparece donde está el mouse?
Lo que quiero es que el usuario haga clic con el botón derecho en la columna del nombre del campo y tenga un menú contextual que sea válido según el tipo de configuración que sea. Por lo tanto, codifiqué el siguiente evento
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);
}
}
}
Esto funciona "correctamente", pero el menú contextual aparece en la parte superior del formulario, no donde el puntero del ratón. Si cambio la llamada Show()
para usar el DataGridView
en lugar del formulario, tengo el mismo problema, pero en cambio aparece en la esquina superior izquierda de la cuadrícula, no donde está el mouse.
Por extraño que parezca, si cambio este evento a un evento MouseClick
(en lugar de un evento CellMouseclick
) todo funciona y el menú de contexto aparece exactamente donde está el puntero del mouse. El problema con esta opción es que el usuario podría no estar haciendo clic con el botón derecho en la celda que está seleccionada actualmente, lo que significa que cuando hagan clic en un elemento del menú, la celda seleccionada cambiará y no la celda en la que hicieron clic.
¿Alguien tiene alguna pista de por qué los menús contextuales creados con CellMouseClick
no se muestran en el lugar correcto?
Heh, mi respuesta iba a ser un poco más complicada con un montón de agregar coordenadas X e Y. Desearía saber sobre Cursor.Position hace unas semanas! +1 por simplicidad! – Yetti
¡Impresionante, eso funcionó como un encanto! 'Cursor.Position' es lo que me estaba perdiendo! – KallDrexx