如何在动态增长时设置ScrollBar的值?

时间:2009-04-06 18:43:02

标签: c# winforms

我将从我想要发生的事情开始:

我在一个范围内加载了数据,例如,一直向左滚动让我在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);
    }
}

单步执行调试器,当它离开此事件处理程序时,horizo​​ntalScroll.Value将降为0,而horizo​​ntalScroll.Maximum将保持正确的值。

我会稍后回复任何澄清,并回答问题。

2 个答案:

答案 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);
    }
}