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

时间:2009-01-23 09:45:51

标签: c# .net winforms datagridview scroll

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

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

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

2 个答案:

答案 0 :(得分: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..
}

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

答案 1 :(得分:4)

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

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
}