在面板中连续滚动面板

时间:2018-08-08 13:54:43

标签: c# winforms user-interface .net-4.0

我目前正在开发绝对庞大的报告,这些报告必须采用某种格式。为此,我创建了一个表单,然后将其多次插入到面板中。

我已经达到面板的高度限制,所以我将信息分成较小的类别,将其放在单独的面板上,然后将面板放入原始面板中

Original Panel{
     Panel1{
          info
          info
          info
     }
     Panel2{
          info
          info
          info
     }
     Panel3{
          info
          info
          info
     }
}

除了滚动外,这非常有效。各个面板滚动直到到达底部,然后停止。我希望主面板在子面板到达顶部或底部时滚动。

为解释另一种方式,该功能可在html的DIV中找到。内部DIV滚动,当其达到MAX或MIN高度时,父DIV继续滚动。

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:2)

因此,经过一些试验,我找到了答案,并将其发布给需要的人。

private void flowLayout_MouseWheel(object sender, MouseEventArgs e)
    {
        var currentPosition = this.flowLayoutPanel1.AutoScrollPosition.Y;

        if((currentPosition == this.flowLayoutPanel1.VerticalScroll.Minimum && e.Delta>0) || (currentPosition == -1*(this.flowLayoutPanel1.VerticalScroll.Maximum + 1 - this.flowLayoutPanel1.VerticalScroll.LargeChange) && e.Delta<0))
        {
            Control control = this.Parent;
            FlowLayoutPanel flp = control as FlowLayoutPanel;
            if(flp == null) { return; }

            flp.VerticalScroll.Value = Math.Min(Math.Max(flp.VerticalScroll.Value - e.Delta, 0), (flp.VerticalScroll.Maximum + 1 - flp.VerticalScroll.LargeChange));
        }

    }

此代码首先获取FlowLayoutPanel的当前位置。

var currentPosition = this.flowLayoutPanel1.AutoScrollPosition.Y;

如果e.Delta为负,则用户正在向下滚动。向上是积极的。

if(
         (currentPosition == this.flowLayoutPanel1.VerticalScroll.Minimum 
         && e.Delta>0) 
         || (currentPosition == -1*(this.flowLayoutPanel1.VerticalScroll.Maximum + 1 - this.flowLayoutPanel1.VerticalScroll.LargeChange) 
         && e.Delta<0)
  )

如果面板滚动到顶部,并且用户向上滚动,它将获得表单的父级,即主面板。如果无法获得面板,则退出。

Control control = this.Parent;
FlowLayoutPanel flp = control as FlowLayoutPanel;
if(flp == null) { return; }

然后按相同的增量调整主面板,将其限制为最大和最小值,以避免在尝试将值设置为小于最小值或大于最大值时引起的OutOfBoundsException。

flp.VerticalScroll.Value = Math.Min(
                               Math.Max(flp.VerticalScroll.Value - e.Delta, 0), 
                               (flp.VerticalScroll.Maximum + 1 - flp.VerticalScroll.LargeChange)
                           );