Wie können Sie ein DataGridView-Blättern ein Element gleichzeitig mit dem Mausrad?

Möchten wir überschreiben DataGridView Standard das Verhalten bei Verwendung einer Maus mit Rad mit dieser Steuerung. Standardmäßig wird das DataGridView-scrollt eine Reihe von Zeilen, die gleich der SystemInformation.MouseWheelScrollLines Einstellung. Was wir gerne machen würde ist, scrollen Sie einfach ein Element zu einem Zeitpunkt.

(Wir Bilder in die DataGridView, die sind etwas groß. Weil diese schriftrolle drei Zeilen (ein typisches system-Einstellung) viel zu viel ist, führt oft dazu, dass der Benutzer scrollen, um Elemente, die Sie nicht einmal mehr sehen kann.)

Habe ich versucht, ein paar Sachen schon und hatte noch nicht viel Erfolg, so weit. Hier sind einige Fragen, die ich habe laufen in:

  1. Abonnieren Sie MouseWheel-events, aber es gibt keinen Weg zu markieren, das Ereignis als behandelt und mein eigenes Ding.

  2. Können Sie überschreiben OnMouseWheel aber dies nie angezeigt wird, aufgerufen werden.

  3. Könnten Sie in der Lage sein, dies zu korrigieren, in der Basis-scrolling-code, aber es klingt wie eine schmutzige Arbeit sein, da andere Arten des Rollens (z.B. über die Tastatur) kommen, die durch die gleiche pipeline.

Jemand einen guten Vorschlag?

Hier der endgültige code, mit dem wunderbare Antwort gegeben:

    ///<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);
    }
InformationsquelleAutor Ken Wootton | 2008-09-25
Schreibe einen Kommentar