7

DataGridViewがあり、そのScrollイベントをリッスンしています。これにより、発生したスクロールイベントのタイプをTypeメンバーが通知することになっているScrollEventArgsオブジェクトが得られます。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 に答える