我目前正在开发绝对庞大的报告,这些报告必须采用某种格式。为此,我创建了一个表单,然后将其多次插入到面板中。
我已经达到面板的高度限制,所以我将信息分成较小的类别,将其放在单独的面板上,然后将面板放入原始面板中
Original Panel{
Panel1{
info
info
info
}
Panel2{
info
info
info
}
Panel3{
info
info
info
}
}
除了滚动外,这非常有效。各个面板滚动直到到达底部,然后停止。我希望主面板在子面板到达顶部或底部时滚动。
为解释另一种方式,该功能可在html的DIV中找到。内部DIV滚动,当其达到MAX或MIN高度时,父DIV继续滚动。
有没有办法做到这一点?
答案 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)
);