Мы хотели бы переопределить поведение по умолчанию DataGridView при использовании колесика мыши с этим элементом управления. По умолчанию DataGridView прокручивает количество строк, равное параметру SystemInformation.MouseWheelScrollLines. То, что мы хотели бы сделать, это прокрутить только один элемент за раз.
(Мы отображаем изображения в DataGridView, которые несколько большие. Из-за этой прокрутки три строки (типичная настройка системы) слишком много, часто заставляя пользователя прокручивать элементы, которые они даже не видят.) *
Я уже попробовал пару вещей и пока не достиг большого успеха. Вот некоторые проблемы, с которыми я столкнулся:
Вы можете подписаться на события MouseWheel, но нет способа пометить событие как обработанное и сделать свое дело.
Вы можете переопределить OnMouseWheel, но это никогда не вызывается.
Возможно, вы сможете исправить это в базовом коде прокрутки, но это выглядит как грязная работа, поскольку другие типы прокрутки (например, с использованием клавиатуры) проходят по тому же конвейеру.
У кого-нибудь есть хорошее предложение?
Вот окончательный код, используя чудесный ответ:
/// <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);
}