7

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

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

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

4

2 回答 2

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”

于 2009-04-20T09:45:35.443 回答
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
}
于 2015-02-19T21:32:18.013 回答