更改滚动值时,滚动条不会更新

时间:2011-04-06 11:34:47

标签: .net winforms scrollbar

在设置为VerticalScroll.Value的{​​{1}}的{​​{1}}中设置Panel时,滚动位置会相应更改,但拇指的位置不会改变。我是否需要以某种方式更新滚动条(面板上的AutoScroll不起作用)?有什么想法吗?

5 个答案:

答案 0 :(得分:25)

尝试拨打.PerformLayout();

答案 1 :(得分:6)

感谢.PerformLayout()小费!

在我的情况下这还不够,我在Form.Shown形式的事件处理程序中设置VerticalScroll.Value,由于某种原因,我必须事先添加DoEvents指令才能滚动到工作

这是我的Shown事件处理程序:

Private Sub MyForm_Shown(sender As System.Object, e As System.EventArgs) Handles Me.Shown
    System.Windows.Forms.Application.DoEvents()

    ScrollPanel.VerticalScroll.Value = ScrollPanel.VerticalScroll.Maximum
    ScrollPanel.PerformLayout()
End Sub

ScrollPanel控件的类型为System.Windows.Forms.Panel

如果没有Application.DoEvents()行,则完全忽略垂直滚动值设置。

我认为这对其他人来说可能会派上用场。

答案 2 :(得分:0)

尝试自动滚动包含图片框的面板时,我遇到了完全相同的问题。

我找到了另一种让它起作用的方法。将滚动值增加两次:

ScrollPanel.VerticalScroll.Value += AmountToScroll

ScrollPanel.VerticalScroll.Value += AmountToScroll

第一次增加值会导致图片框在面板内滚动,但.Value不会改变,拇指也不会移动。

第二次递增值会导致VerticalScroll.Value递增,移动拇指,但图片框不会再次滚动。

对我来说似乎是一个错误。当然,在第一行代码之后,图片框的滚动和.Value的增加以及拇指的移动都应该发生。

答案 3 :(得分:0)

我遇到了几乎相同的东西,我在带有滚动条的面板中有一个PictureBox(显示图形),我想放大或缩小,使鼠标指针位置“显然”静止。将PictureBox重新定位在面板内以执行此操作会抛出与滚动条的同步,此后,使用滚动条滚动将不会显示PictureBox的完整区域。解决方案是通过为panel.Horizo​​ntalScroll.Value和/或panel.VerticalScroll.Value属性分配计算值来完成移动。但仅凭这一点还不够:需要这两种解决方案中的一种才能使应用程序按设计运行:

  1. KMan上面的解决方案:

    panel.HorizontalScroll.Value = computed_value
    panel.PerformLayout()
    
  2. 或者JJMcLellan上面的解决方案:在我的情况下,将计算值分配两次,例如:

    panel.HorizontalScroll.Value = computed_value
    panel.HorizontalScroll.Value = computed_value
    
  3. 其中任何一个似乎都有相同的最终结果。由于上面的#2使它看起来像一个bug,#1似乎(希望)由微软(?)设计,我最终在我的应用程序中使用了#1。我只是想在VB.NET环境中确认这些工作。

答案 4 :(得分:0)

我试图使它在表单上工作。我尝试了PerformLayout(),我尝试了Application.DoEvents(),我尝试了两次分配VerticalScroll.Value,但没有一个起作用。我要做的唯一一件事就是将VerticalScroll的属性更改为其他值,然后将其更改回:

protected override void OnVisibleChanged(EventArg e)
{
    base.OnVisibleChanged(e);
    if (this.Visible)
    {
        this.VerticalScroll.Maximum++;
        this.VerticalScroll.Maximum--;
    }
}

请注意,更改VerticalScroll.Value同样有效,但是您必须实际修改其值,并确保更改在Minimum到Maximum范围内,这比临时增加Maximum复杂得多。 / p>