3

我正在寻找用户当前是否按住垂直滚动条。

这个问题源于当 DataGridView 的 DataSource 更新时滚动被取消的事实。

我希望的是做一个扩展方法,比如IsUserScrolling()放在DataGridView. 这个想法是在用户停止滚动之前我不会更新 DataGridView。

4

2 回答 2

2

您可以知道用户是否滚动了DataGridViewviaScroll事件,您可以知道用户是否按住鼠标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
  }
}
于 2013-08-12T07:19:19.230 回答
0

我已经搜索并找到了答案。它可能不是完美的答案,但它有效:

我已经创建了一个dataGridView,并创建了一个hScrollBar,将 放在滚动条的hScrollBar顶部dataGridView(如果你的意思是垂直的,你可以使用vScrollBar),将滚动条的宽度设置为与 相同dataGridView,并且在 Scroll 事件上,我做了:

  private void hScrollBar1_Scroll(object sender, ScrollEventArgs e)
  {
     dataGridView1.HorizontalScrollingOffset = hScrollBar1.Value;
  }

这样你就MouseDown可以MouseUp使用hScrollBar. 你来就好

于 2013-08-12T06:19:10.047 回答