ScrollBar值设置不正确

Sma*_*ery 3 .net c# scrollbar

我试图实现类似于Excel的"无限"可滚动性的东西; 用户可以滚动到文档的"底部"; 但随后继续滚动(使用滚动条或滚动条上的向下箭头),还有更多,为它们生成空行.我有这个大多数工作(当使用鼠标滚轮它完美地工作); 但我在使用SmallIncrement功能时遇到了麻烦 - 就是这样; 当用户单击滚动条上的向下箭头时,它应该通过scrollbar.SmallChange向下,尽管它位于滚动条的可滚动范围的底部.

这是我的代码(在scrollBar_Scroll的处理程序中):

int difference = e.NewValue - e.OldValue;
if (e.Type == ScrollEventType.SmallIncrement)
{
    if (difference != scrollBar.SmallChange)
    {
        int increase = (scrollBar.SmallChange - difference);
        scrollBar.Maximum += increase;
        scrollBar.Value += increase;
    }
}
Run Code Online (Sandbox Code Playgroud)

在调试器中查看它,这将完全按照我的预期设置值.但是,在函数结束后会发生某些事情(不确定是什么),导致scrollBar.Value被设置回原始值加一.如果我按下向下箭头,它的工作方式大多正确.一旦释放按钮,它仍然会跳回一点.

知道是什么导致这种情况,以及任何修复方法吗?

干杯!

编辑:这是我的滚轮代码.它非常相似,令人困惑,为什么它不起作用.这是在包含面板的MouseWheel事件处理程序中.

int desiredValue = scrollBar.Value - e.Delta;
scrollBar.MaximumValue = (Math.Max(normalBottom, desiredValue + scrollBar.LargeChange));
scrollBar.Value = Math.Max(0, desiredValue);
Run Code Online (Sandbox Code Playgroud)

normalBottom是一个记住滚动条"有限"结尾的变量 - 在excel中,这可能是用户输入的最低数据,也可能是屏幕的高度; 所以它正常滚动到这个值之上(不会变为负数).

The*_*aot 5

滚动条发生的情况如下:当用户与滚动条交互导致事件并且调用事件处理程序时,属性值尚未更新,在事件处理程序返回后,属性由内部滚动条覆盖设置您设置的值并导致您提及的"跳回"效果.它如何记住它必须设置的值?容易:它在e.NewValue中.这正是您的解决方案,能够在滚动事件期间正确地改变此属性的最终值,只需写入e.NewValue,如下所示:

int difference = e.NewValue - e.OldValue;
        if (e.Type == ScrollEventType.SmallIncrement)
        {
            if (difference != scrollBar.SmallChange)
            {
                int increase = (scrollBar.SmallChange - difference);
                scrollBar.Maximum += increase;
                e.NewValue = scrollBar.Value + increase;
            }
        }
Run Code Online (Sandbox Code Playgroud)

我想链接可能与您相关的theese页面:http: //msdn.microsoft.com/en-us/library/system.windows.forms.scrollbar.maximum.aspx

备注中的注释(这就是为什么即使移动Maximun你仍然只提前1):

只能以编程方式达到最大值.滚动条的值无法在运行时通过用户交互达到其最大值.通过用户交互可以达到的最大值等于1加上最大属性值减去LargeChange属性值.如有必要,可以将"最大"属性设置为对象的大小-1,以使术语为1.

http://msdn.microsoft.com/en-us/library/system.windows.forms.scrollbar.scroll.aspx http://msdn.microsoft.com/en-us/library/system.windows.forms.scrolleventargs .newvalue.aspx (获取或设置滚动条的新值.[强调成套])