Wir möchten das Standardverhalten von DataGridView überschreiben, wenn Sie ein Mausrad mit diesem Steuerelement verwenden. Standardmäßig scrollt die DataGridView eine Reihe von Zeilen, die der SystemInformation.MouseWheelScrollLines-Einstellung entsprechen. Was wir gerne tun würden, ist jeweils nur ein Element zu scrollen.Wie können Sie ein DataGridView mit dem Mausrad um ein Element blättern lassen?
(Wir zeigen Bilder in der DataGridView, die etwas groß sind. Aufgrund dieses Scrollens drei Zeilen (eine typische Systemeinstellung) ist zu viel, oft den Benutzer zu Elementen, die sie nicht sehen können scrollen.)
Ich habe schon ein paar Dinge ausprobiert und bisher nicht viel Erfolg gehabt. Hier sind einige Fragen, die ich in laufen haben:
Sie Mousewheel Ereignisse abonnieren können, aber es gibt keine Möglichkeit, das Ereignis zu markieren, wie behandelt und mein eigenes Ding machen.
Sie können OnMouseWheel überschreiben, aber dies scheint nie aufgerufen zu werden.
Sie können dies möglicherweise im Basis-Scroll-Code korrigieren, aber es klingt wie ein schmutziger Job, da andere Arten des Scrollens (z. B. über die Tastatur) durch die gleiche Pipeline gehen.
Wer hat einen guten Vorschlag?
Hier ist der endgültige Code, da die wunderbare Antwort mit:
/// <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);
}
Dank. Ich denke, das würde funktionieren, auch wenn die Antwort, die ich wählte, einfacher war. –