我有一个DataGridView,我正在听它的Scroll事件。这给了我一个ScrollEventArgs对象,其Type成员应该告诉我已经发生的滚动事件的类型。在the MSDN documentation page它说我应该能够通过侦听ThumbPosition,ThumbTrack,First,Last和EndScroll类型的事件来检测滚动框的移动。
但是,当我拖动滚动框时,我只会获得LargeDecrement和LargeIncrement类型的事件。
如何访问ThumbPosition,ThumbTrack,First,Last和EndScroll事件?
答案 0 :(得分: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”更改为“HorizontalScrollBar”
答案 1 :(得分:4)
您可以通过访问DataGridView控件上的水平或垂直滚动条来完成此操作而不使用反射。将HScrollBar
替换为VScrollBar
以获取垂直滚动条。
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
}