在Winforms DataGridView上慢速滚动

时间:2017-09-12 10:47:41

标签: c# winforms datagridview

我正在使用DataGridView,滚动行为非常糟糕。滚动时通过移动侧面的滚动条可以很好地工作,但是当用鼠标快速滚动时,它非常慢并且会冻结UI几秒钟。

我发现的现有问题建议设置DoubleBuffered属性但在我的情况下它不会影响性能,因为当我手动移动滚动条时绘图已经很快。只有滚动鼠标滚轮才会出现问题。

1 个答案:

答案 0 :(得分:0)

解决方案是在控件有机会处理它之前处理鼠标滚轮事件WndProc并简单地更改FirstDisplayedScrollingRowIndex属性。

public class FastScrollingDataGridView : DataGridView
{
    private int numberOfRowsPerScroll = 20;

    short GET_WHEEL_DELTA_WPARAM(IntPtr wParam)
    {
        var int32 = (int)wParam.ToInt64();
        var shifted = int32 >> 16;
        return (short)shifted;
    }

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 0x20a) //WM_MOUSEWHEEL = 0x20a
        {
            var zDelta = GET_WHEEL_DELTA_WPARAM(m.WParam) > 0 ? numberOfRowsPerScroll : -numberOfRowsPerScroll;
            var newValue = FirstDisplayedScrollingRowIndex - zDelta;
            if (newValue < 0) newValue = 0;
            this.FirstDisplayedScrollingRowIndex = newValue;
            return; 
        }
        base.WndProc(ref m);
    }
}