如何从DataGridView接收"滚动框"类型的滚动事件?

Sim*_*mon 7 .net c# scroll datagridview winforms

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

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

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

Sim*_*mon 10

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..
}
Run Code Online (Sandbox Code Playgroud)

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


Sca*_*ell 5

您可以通过访问 DataGridView 控件上的水平或垂直滚动​​条来实现此目的,而无需使用反射,如下所示。替换HScrollBarVScrollBar以获得垂直滚动条。

public MyFormConstructor()
{
    InitializeComponent();
    AddScrollListener(MyGrid, MyScrollEventHandler);
}

private void AddScrollListener(DataGridView dgv, ScrollEventHandler scrollEventHandler)
{
   HScrollBar scrollBar = dgv.Controls.OfType<HScrollBar>().First();
   scrollBar.Scroll += scrollEventHandler;
}

private void MyScrollEventHandler(object sender, ScrollEventArgs e)
{
   // Handler with e.Type set properly
}
Run Code Online (Sandbox Code Playgroud)