Nos gustaría sobrescribir el comportamiento predeterminado de DataGridView al usar una rueda del mouse con este control. De forma predeterminada, DataGridView desplaza una cantidad de filas igual a la configuración de SystemInformation.MouseWheelScrollLines. Lo que nos gustaría hacer es desplazar solo un elemento a la vez.¿Cómo se puede hacer que un DataGridView desplace un elemento a la vez con la rueda del mouse?
(Mostramos imágenes en el DataGridView, que son algo grandes. Debido a este desplazamiento tres filas (una configuración de sistema típica) es demasiado, lo que hace que el usuario se desplace a elementos que ni siquiera puede ver)
Ya he intentado un par de cosas y hasta ahora no he tenido tanto éxito. Estos son algunos asuntos me he encontrado:
puede suscribirse a eventos MouseWheel pero no hay manera de marcar el evento como se maneja y hacer mi propia cosa.
Puede anular OnMouseWheel pero esto nunca parece ser llamado.
Es posible que pueda corregir esto en el código de desplazamiento de la base pero suena como un trabajo desordenado ya que otros tipos de desplazamiento (por ejemplo, usar el teclado) vienen a través de la misma tubería.
¿Alguien tiene una buena sugerencia?
Aquí está el código final, utilizando la maravillosa respuesta dada:
/// <summary>
/// Handle the mouse wheel manually due to the fact that we display
/// images, which don't work well when you scroll by more than one
/// item at a time.
/// </summary>
///
/// <param name="sender">
/// sender
/// </param>
/// <param name="e">
/// the mouse event
/// </param>
private void mImageDataGrid_MouseWheel(object sender, MouseEventArgs e)
{
// Hack alert! Through reflection, we know that the passed
// in event argument is actually a handled mouse event argument,
// allowing us to handle this event ourselves.
// See http://tinyurl.com/54o7lc for more info.
HandledMouseEventArgs handledE = (HandledMouseEventArgs) e;
handledE.Handled = true;
// Do the scrolling manually. Move just one row at a time.
int rowIndex = mImageDataGrid.FirstDisplayedScrollingRowIndex;
mImageDataGrid.FirstDisplayedScrollingRowIndex =
e.Delta < 0 ?
Math.Min(rowIndex + 1, mImageDataGrid.RowCount - 1):
Math.Max(rowIndex - 1, 0);
}
Gracias. Creo que esto funcionaría, aunque la respuesta que elijo era más simple. –