How can I receive the “scroll box” type scroll eve

2019-01-15 19:42发布

问题:

I have a DataGridView, and I'm listening to its Scroll event. This gives me a ScrollEventArgs object whose Type member is supposed to tell me the type of scroll event that has occurred. On the MSDN documentation page it says I should be able to detect movement of the scroll box by listening for events with types ThumbPosition, ThumbTrack, First, Last and EndScroll.

However, when I drag the scroll box, I only get events of type LargeDecrement and LargeIncrement.

How do I get access to the ThumbPosition, ThumbTrack, First, Last and EndScroll events?

回答1:

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..
}

As you'd expect, if you want to listen to horizontal scroll events, you change "VerticalScrollBar" to "HorizontalScrollBar"



回答2:

You can accomplish this without using reflection by accessing the horizontal or vertical scrollbars on your DataGridView control like this. Replace HScrollBar with VScrollBar to get the vertical scroll bar.

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
}