Tengo una vista de cuadrícula de datos en una aplicación .NET winform. Me gustaría hacer clic derecho en una fila y que aparezca un menú. Entonces me gustaría seleccionar cosas como copiar, validar, etc.
¿Cómo hago A) un menú emergente B) encuentre en qué fila se hizo clic derecho. Sé que podría usar selectedIndex, pero debería poder hacer clic derecho sin cambiar lo que está seleccionado. en este momento podría usar el índice seleccionado, pero si hay una manera de obtener los datos sin cambiar lo que está seleccionado, sería útil.
m.Show(dataGridView1.PointToScreen(e.Location));
Si bien esta pregunta es antigua, las respuestas no son adecuadas. Los menús contextuales tienen sus propios eventos en DataGridView. Hay un evento para el menú contextual de la fila y el menú contextual de la celda.
La razón por la cual estas respuestas no son adecuadas es que no tienen en cuenta los diferentes esquemas de operación. Es posible que las opciones de accesibilidad, las conexiones remotas o la migración de Metro / Mono / Web / WPF no funcionen y los atajos de teclado fallarán hacia la derecha (Mayús + F10 o la tecla Menú contextual).
La selección de celda al hacer clic con el botón derecho del mouse debe manejarse manualmente. Mostrar el menú contextual no necesita ser manejado ya que esto lo maneja la IU.
Esto imita completamente el enfoque utilizado por Microsoft Excel. Si una celda es parte de un rango seleccionado, la selección de celda no cambia ni tampoco
CurrentCell
. Si no es así, el rango anterior se borra y la celda se selecciona y se convierte enCurrentCell
.Si no tiene claro esto,
CurrentCell
es donde el teclado se enfoca cuando presiona las teclas de flecha.Selected
es si es parte deSelectedCells
. El menú contextual se mostrará al hacer clic derecho según lo maneja la interfaz de usuario.Los atajos de teclado no muestran el menú contextual de forma predeterminada, por lo que debemos agregarlos.
He reelaborado este código para que funcione de forma estática, por lo que puede copiarlos y pegarlos en cualquier evento.
La clave es usar,
CellContextMenuStripNeeded
ya que esto le dará el menú contextual.Aquí hay un ejemplo
CellContextMenuStripNeeded
en el que puede especificar qué menú contextual mostrar si desea tener diferentes por fila.En este contexto
MultiSelect
esTrue
ySelectionMode
esFullRowSelect
. Esto es solo un ejemplo y no una limitación.fuente
The CellContextMenuStripNeeded event occurs only when the DataGridView control DataSource property is set or its VirtualMode property is true.
Utilice el
CellMouseDown
evento en elDataGridView
. A partir de los argumentos del controlador de eventos, puede determinar en qué celda se hizo clic. Usando elPointToClient()
método en DataGridView, puede determinar la posición relativa del puntero al DataGridView, por lo que puede abrir el menú en la ubicación correcta.(El
DataGridViewCellMouseEvent
parámetro solo le daX
yY
relativo a la celda en la que hizo clic, que no es tan fácil de usar para mostrar el menú contextual).Este es el código que usé para obtener la posición del mouse, luego ajustar la posición de DataGridView:
Todo el controlador de eventos se ve así:
fuente
(sender as DataGridView)[e.ColumnIndex, e.RowIndex];
para una llamada más sencilla al móvil.ContextMenuStrip
CellContextMenuStripNeeded
e.ColumnIndex
,e.RowIndex
.Creo que eso
e.RowIndex
es lo que estás pidiendo.Sugerencia: cuando el usuario hace que se active su evento
CellContextMenuStripNeeded
, utilíceloe.RowIndex
para obtener datos de su cuadrícula, como el ID. Almacene el ID como elemento de etiqueta del evento de menú.Ahora, cuando el usuario haga clic en el elemento del menú, utilice la propiedad Sender para recuperar la etiqueta. Utilice la etiqueta, que contiene su ID, para realizar la acción que necesita.
fuente
CellContextMenuStripNeeded
controlador de eventos, hagaif(e.RowIndex >= 0){e.ContextMenuStrip = yourContextMenuInstance;}
esto significa que el menú solo se muestra al hacer clic con el botón derecho en una fila válida (es decir, no en un encabezado o área de cuadrícula vacía)CellContextMenuStripNeeded
solo funciona si su DGV está vinculado a una fuente de datos o si su VirtualMode está configurado en verdadero. En otros casos, deberá establecer esa etiqueta en elCellMouseDown
evento. Para estar seguro allí, realice unDataGridView.HitTestInfo
en el controlador de eventos MouseDown para comprobar que está en una celda.Simplemente arrastre un componente ContextMenu o ContextMenuStrip a su formulario y diséñelo visualmente, luego asígnelo a la propiedad ContextMenu o ContextMenuStrip de su control deseado.
fuente
Sigue los pasos:
Crea un menú contextual como:
El usuario debe hacer clic derecho en la fila para obtener este menú. Necesitamos manejar el evento _MouseClick y el evento _CellMouseDown.
selectedBiodataid es la variable que contiene la información de la fila seleccionada.
Aquí está el código:
y la salida sería:
fuente
Para la posición del menú contextual, encontré el problema de que necesitaba que fuera relativo a DataGridView, y el evento que necesitaba usar da la posición relativa a la celda en la que se hizo clic. No he encontrado una mejor solución, así que implementé esta función en la clase commons, así que la llamo desde donde sea que necesite.
Está bastante probado y funciona bien. Espero que le sea útil.
fuente