我目前正在开发报告,这些报告绝对是海量的,需要一定的格式。为此,我创建了一个表单,并将其多次插入到面板中。
我在面板上达到了高度限制,所以我将信息分成较小的类别,将它们放在单独的面板上,然后将面板放入原始面板中
Original Panel{
Panel1{
info
info
info
}
Panel2{
info
info
info
}
Panel3{
info
info
info
}
}这是完美的工作,除了滚动。单个面板滚动到底部,然后停止。我希望当subPanel到达顶部或底部时,主面板可以滚动。
为了解释另一种方式,html中的DIVs中的功能。内部DIV滚动,当它达到最大或最小高度时,父DIV继续滚动。
有没有办法做到这一点?
发布于 2018-08-10 20:18:10
因此,经过一些实验,我找到了一个答案,并将其发布给任何需要它的人。
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为负数,则用户正在向下滚动。Up是正数。
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)
);https://stackoverflow.com/questions/51748522
复制相似问题