我将从我想要发生的事情开始:
我在一个范围内加载了数据,例如,一直向左滚动让我在4月1日,向右滚动到6月1日。
用户在4月1日定位滚动条,然后单击滚动条上的向左箭头。现在滚动条定位于3月31日,现在数据范围从3月1日到6月1日。
这是我的问题:
我一直在处理Scroll事件处理程序中的左箭头单击(大致如下):
private void horizontalScroll_Scroll(object sender, ScrollEventArgs e)
{
if (LeftArrowClicked())
{
horizontalScroll.Maximum = calculateNewMaximum(earliestDate, latestDate);
horizontalScroll.Value = calculateNewPosition(currentDate.AddDays(-1), earliestDate);
}
}
单步执行调试器,当它离开此事件处理程序时,horizontalScroll.Value将降为0,而horizontalScroll.Maximum将保持正确的值。
我会稍后回复任何澄清,并回答问题。
答案 0 :(得分:2)
尝试设置e.NewValue
而不是horizontalScroll.Value
。然后,控件在执行自己的逻辑时会遵循此值。
答案 1 :(得分:1)
这显然是由ScrollableControl
设置Scroll
事件触发后的值引起的。您可以尝试扩展正在使用的控件并覆盖OnScroll
虚拟方法。
protected override void OnScroll(ScrollEventArgs se)
{
base.OnScroll(se);
// Do stuff now
}
<小时/>
您可能应该注意,单击滚动条的按钮不会引发Scroll
事件,它只会引发ValueChanged
事件。 (尽管使用鼠标生成两者。)
<小时/>
horizontalScroll.Value
,您想在NewValue
参数上设置ScrollEventArgs
。这应该有效:
private void horizontalScroll_Scroll(object sender, ScrollEventArgs e)
{
if (LeftArrowClicked())
{
horizontalScroll.Maximum = calculateNewMaximum(earliestDate, latestDate);
e.NewValue = calculateNewPosition(currentDate.AddDays(-1), earliestDate);
}
}