Мы хотели бы переопределить поведение DataGridView по умолчанию при использовании колеса мыши с этим элементом управления. По умолчанию DataGridView прокручивает ряд строк, равный настройке SystemInformation.MouseWheelScrollLines. То, что мы хотели бы сделать, это прокрутить только один элемент за раз.Как вы можете сделать DataGridView прокруткой одного элемента за раз с помощью колеса мыши?
(Мы показываем изображения в 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);
}
Спасибо. Я думаю, что это сработает, хотя ответ, который я выбираю, был проще. – 2008-09-25 20:44:25