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

2019-01-15 19:03发布

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?

2条回答
可以哭但决不认输i
2楼-- · 2019-01-15 19:31

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
}
查看更多
Animai°情兽
3楼-- · 2019-01-15 19:41
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"

查看更多
登录 后发表回答