我正在使用DataGridView
,滚动行为非常糟糕。滚动时通过移动侧面的滚动条可以很好地工作,但是当用鼠标快速滚动时,它非常慢并且会冻结UI几秒钟。
我发现的现有问题建议设置DoubleBuffered
属性但在我的情况下它不会影响性能,因为当我手动移动滚动条时绘图已经很快。只有滚动鼠标滚轮才会出现问题。
答案 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);
}
}