我們想在此控件中使用鼠標滾輪時重寫DataGridView的默認行爲。默認情況下,DataGridView滾動一些等於SystemInformation.MouseWheelScrollLines設置的行。我們想要做的是一次只滾動一個項目。我們在DataGridView中顯示的圖像有些大,因爲這種滾動三行(一個典型的系統設置)太多了,通常會導致用戶滾動到他們甚至看不到的項目。)如何讓DataGridView使用鼠標滾輪一次滾動一個項目?
我已經嘗試了幾件事情,迄今爲止還沒有取得太大的成功。這裏有一些問題,我碰到的:
您可以訂閱鼠標滾輪事件,但沒有辦法,以紀念事件的處理,做我自己的事情。
您可以重寫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