我正在寻找用户当前是否按住垂直滚动条。
这个问题源于当 DataGridView 的 DataSource 更新时滚动被取消的事实。
我希望的是做一个扩展方法,比如IsUserScrolling()
放在DataGridView
. 这个想法是在用户停止滚动之前我不会更新 DataGridView。
我正在寻找用户当前是否按住垂直滚动条。
这个问题源于当 DataGridView 的 DataSource 更新时滚动被取消的事实。
我希望的是做一个扩展方法,比如IsUserScrolling()
放在DataGridView
. 这个想法是在用户停止滚动之前我不会更新 DataGridView。
您可以知道用户是否滚动了DataGridView
viaScroll
事件,您可以知道用户是否按住鼠标Thumb
并通过它滚动,ScrollEventArgs
如下所示:
private void dataGridView1_Scroll(object sender, ScrollEventArgs e){
if(e.ScrollOrientation == ScrollOrientation.VerticalScroll &&
(e.Type == ScrollEventType.LargeIncrement || e.Type == ScrollEventType.LargeDecrement)){
//your code here
}
}
上面的代码几乎可以正常工作,但是您可以通过某种方式以编程方式更改VerticalScroll.Value
(这不存在),Large Change
即使用户没有在垂直拇指上按住鼠标,该事件也会被触发。所以我们可以添加条件MouseButtons == MouseButtons.Left
让它更好地工作:
private void dataGridView1_Scroll(object sender, ScrollEventArgs e){
if(e.ScrollOrientation == ScrollOrientation.VerticalScroll && MouseButtons == MouseButtons.Left &&
(e.Type == ScrollEventType.LargeIncrement || e.Type == ScrollEventType.LargeDecrement)){
//your code here
}
}
Thumb
另一种检测用户是否在垂直滚动条(和Arrow Repeat button
)上的任何地方按住鼠标的简短方法使用HitTest
方法,您可以添加更多代码以使其更可靠地工作,这样我们就不会错过某种具有真实用户滚动动作的编程滚动:
private void dataGridView1_Scroll(object sender, ScrollEventArgs e){
Point p = dataGridView1.PointToClient(MousePosition);
if (dataGridView1.HitTest(p.X, p.Y).Type == DataGridViewHitTestType.VerticalScrollBar){
//Your code here
}
}
我已经搜索并找到了答案。它可能不是完美的答案,但它有效:
我已经创建了一个dataGridView
,并创建了一个hScrollBar
,将 放在滚动条的hScrollBar
顶部dataGridView
(如果你的意思是垂直的,你可以使用vScrollBar
),将滚动条的宽度设置为与 相同dataGridView
,并且在 Scroll 事件上,我做了:
private void hScrollBar1_Scroll(object sender, ScrollEventArgs e)
{
dataGridView1.HorizontalScrollingOffset = hScrollBar1.Value;
}
这样你就MouseDown
可以MouseUp
使用hScrollBar
. 你来就好