当使用鼠标滚轮和这个控件时,我们想覆盖 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);
}