如何从DataGridView接收“滚动框”类型滚动事件?

我有一个DataGridView,我正在听它的Scroll事件。 这给了我一个ScrollEventArgs对象,其Type成员应该告诉我已经发生的滚动事件的类型。 在MSDN文档页面上,它说我应该能够通过侦听ThumbPosition,ThumbTrack,First,Last和EndScroll类型的事件来检测滚动框的移动。

但是,当我拖动滚动框时,我只获得LargeDecrement和LargeIncrement类型的事件。

如何访问ThumbPosition,ThumbTrack,First,Last和EndScroll事件?

using System.Reflection; using System.Windows.Forms; bool addScrollListener(DataGridView dgv) { bool ret = false; Type t = dgv.GetType(); PropertyInfo pi = t.GetProperty("VerticalScrollBar", BindingFlags.Instance | BindingFlags.NonPublic); ScrollBar s = null; if (pi != null) s = pi.GetValue(dgv, null) as ScrollBar; if (s != null) { s.Scroll += new ScrollEventHandler(s_Scroll); ret = true; } return ret; } void s_Scroll(object sender, ScrollEventArgs e) { // Hander goes here.. } 

正如您所期望的,如果您想要收听水平滚动事件,可以将“VerticalScrollBar”更改为“Horizo​​ntalScrollBar”

您可以通过访问DataGridView控件上的水平或垂直滚动​​条来完成此操作而不使用reflection。 用VScrollBar替换HScrollBar以获取垂直滚动条。

 public MyFormConstructor() { InitializeComponent(); AddScrollListener(MyGrid, MyScrollEventHandler); } private void AddScrollListener(DataGridView dgv, ScrollEventHandler scrollEventHandler) { HScrollBar scrollBar = dgv.Controls.OfType().First(); scrollBar.Scroll += scrollEventHandler; } private void MyScrollEventHandler(object sender, ScrollEventArgs e) { // Handler with e.Type set properly }