C# 当显示垂直滚动条时,控制位置发生变化

C# 当显示垂直滚动条时,控制位置发生变化,c#,winforms,C#,Winforms,一旦显示面板的垂直滚动条,控件的位置就会改变。面板中的属性AutoScroll已启用 代码: 控件MsgItem的位置太远,此时滚动条显示了它的外观示例 将FlowLayoutPanel与而不是面板一起使用 而且您不必设置位置使用FlowLayoutPanel with而不是Panel 您不必设置位置您可以这样做 var count = panel2.Controls.Count; MsgItem item = new MsgItem("testing"); item.Top = count =

一旦显示面板的垂直滚动条,控件的位置就会改变。
面板中的属性
AutoScroll
已启用
代码:

控件
MsgItem
的位置太远,此时滚动条显示了它的外观示例

将FlowLayoutPanel与而不是面板一起使用
而且您不必设置位置

使用FlowLayoutPanel with而不是Panel 您不必设置位置

您可以这样做

var count = panel2.Controls.Count;
MsgItem item = new MsgItem("testing");
item.Top = count == 0 ? 10 : (panel2.Controls[count - 1].Bottom + 10);
panel2.Controls.Add(item);
对于您的原始代码

int an = 10;
private void Incoming_Click(object sender, EventArgs e)
{
    MsgItem item = new MsgItem("testing");
    item.Top = an;
    an = item.Top + item.Height + 10;
    panel2.Controls.Add(item);
}
解决方法是跟踪面板的滚动

private void panel2_Scroll(object sender, ScrollEventArgs e)
{
    switch (e.ScrollOrientation)
    {
        case ScrollOrientation.VerticalScroll:
            var change = e.NewValue - e.OldValue;
            an -= change;
            break;
    }
}
因此,对于使用
TableLayoutPanel
FlowLayoutPanel
的布局方案,建议您这样做

var count = panel2.Controls.Count;
MsgItem item = new MsgItem("testing");
item.Top = count == 0 ? 10 : (panel2.Controls[count - 1].Bottom + 10);
panel2.Controls.Add(item);
对于您的原始代码

int an = 10;
private void Incoming_Click(object sender, EventArgs e)
{
    MsgItem item = new MsgItem("testing");
    item.Top = an;
    an = item.Top + item.Height + 10;
    panel2.Controls.Add(item);
}
解决方法是跟踪面板的滚动

private void panel2_Scroll(object sender, ScrollEventArgs e)
{
    switch (e.ScrollOrientation)
    {
        case ScrollOrientation.VerticalScroll:
            var change = e.NewValue - e.OldValue;
            an -= change;
            break;
    }
}

因此,对于使用
TableLayoutPanel
FlowLayoutPanel
的布局方案,建议您尝试使用“item.Location.Y”而不是“item.Top”,在计算时,您需要使用autoscrollposition,而不仅仅是item.Top:
an=item.Top+item.Height+10+panel2.autoscrollposition.Y-另请参阅。我想这是复制品!如果你做得好,你说的话就行不通了,但可能有不止一种方法..你可能想尝试使用“item.Location.Y”而不是“item.Top”你需要使用autoscrollposition,而不仅仅是item.Top在计算时:
an=item.Top+item.Height+10+panel2.autoscrollposition.Y-另请参阅。我想这是复制品!如果你做对了,你说的话就行不通了,但可能不止一种方法…不应该左进右出不应该左进右出这很好,您能解释一下问题是什么吗?当您滚动面板时,子控件的布局正在改变,并且值
an
变得错误。查看我的回答中的更新。这很好,你能解释一下问题是什么吗?当你滚动面板时,子控件的布局正在改变,值
an
正在出错。请参阅我的答案中的更新