如何在 C# 中将面板滚动到底部?

How to scroll a panel to the bottom in c#?

我有一个面板 MessagesPanel,其中包含从数据库中检索的消息。我使用 foreach 循环查看消息。在循环中,我调用了一个函数 AddMessageToPanel,它动态地将一个 GroupBox 添加到面板,其中包含消息信息和内容。消息从最旧到最新、从上到下检索(就像在 WhatsApp 中一样)。面板设置为 AutoScroll=true,我希望它滚动到最底部以显示最新消息。 我尝试了这些解决方案:

  1. autoscroll panel to bottom
  2. How to Programmatically Scroll a Panel
  3. How to scroll a panel manually?

None 其中对我有用。面板看起来一样,滚动条在顶部。

特别是,我尝试了以下代码:

private void MessagePanel_ControlAdded(object sender, ControlEventArgs e)
{
    MessagesPanel.ScrollControlIntoView(e.Control);
}

并且我通过事件 ControlAdded 订阅了它。

还有:

MessagesPanel.VerticalScroll.Value = MessagesPanel.VerticalScroll.Maximum

有无MessagesPanel.SuspendLayout();

这是我的函数:

private void AddMessageToPanel(string sender, string datetime, string content)
{
    GroupBox groupBox = new GroupBox();
    groupBox.Location = new Point(0, 120 * MessagesPanel.Controls.Count);
    groupBox.RightToLeft = RightToLeft.Yes;
    groupBox.Size = new Size(500, 100);
    groupBox.Text = string.Format("{0} ({1})", sender, datetime);

    TextBox textBox = new TextBox();
    textBox.Enabled = false;
    textBox.BackColor = Color.White;
    textBox.BorderStyle = BorderStyle.None;
    textBox.Multiline = true;
    textBox.Size = new Size(495, 95);
    textBox.Location = new Point(0, 20);
    textBox.Text = content;

    groupBox.Controls.Add(textBox);
    MessagesPanel.Controls.Add(groupBox);
}

我希望 MessagesPanel 一直向下滚动。这该怎么做?谢谢!

使用 ScrollControlIntoView() 方法。像这样:

  groupBox.Controls.Add(textBox);
  MessagesPanel.Controls.Add(groupBox);
  MessagesPanel.ScrollControlIntoView(groupBox);

也可以使用新添加的GroupBox的位置:

MessagesPanel.AutoScrollPosition = new Point(
             groupBox.Right - MessagesPanel.AutoScrollPosition.X,
             groupBox.Bottom - MessagesPanel.AutoScrollPosition.Y);

最好使用 flowLayoutPanel 而不是 Panel :

尝试添加flowLayoutPanel

  1. 设置myFlowLayoutPanel.FlowDirection = FlowDirection.TopDown
  2. 如果您不想要多行或多列,请将 WrapContents 属性 设置为 false
  3. 将自动滚动 属性 设置为真

作为 Beldi 解决方案的替代方案,您可以调用

MessagesPanel.AutoScrollPosition = new Point(0, MessagesPanel.DisplayRectangle.Height);

所有控件都添加到面板后。