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

5

我有一个面板MessagesPanel,其中包含从数据库检索到的消息。我使用foreach循环遍历这些消息。在循环中,我调用一个名为AddMessageToPanel的函数,该函数动态添加一个GroupBox到面板中,并显示消息信息和内容。消息是按照最旧到最新、自上而下的顺序检索的(就像WhatsApp一样)。面板设置为AutoScroll=true,我希望它可以滚动到最底部,以查看最新的消息。

我尝试了以下解决方案:

  1. 将面板自动滚动到底部
  2. 如何通过编程让面板滚动
  3. 如何手动滚动面板?

但以上解决方案都没有奏效。面板仍然显示相同,滚动条停留在顶部。

具体来说,我尝试了以下代码:

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并传入你最后添加的项目实例。最好是在Form.Shown事件之后再调用该方法。 - Sinatr
2个回答

3
作为 Beldi 解决方案的替代方案,您可以调用
MessagesPanel.AutoScrollPosition = new Point(0, MessagesPanel.DisplayRectangle.Height);

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

正如Sinatr所述,您可能在Form.Shown事件发生之前运行了此操作。您需要等待该事件发生后再应用AutoScrollPosition。 - Gess

1
使用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. AutoScroll 属性设置为 true

谢谢。第一个解决方案会产生奇怪的结果:滚动条滑到了面板的一半,所有的“groupbox”上方都添加了一个奇怪的空间。下面是演示:http://i.imgur.com/hJyJ2yy.gifv。 第二个解决方案什么也没做...滚动条停留在顶部,但没有添加空间:http://i.imgur.com/7y4IZsh.png?1。再次感谢, - Michael Haddad
很抱歉,但这个答案对我没有帮助...请查看我的先前评论,其中列出了答案存在的问题。非常感谢! - Michael Haddad
我已经为您编辑了我的答案,请测试 flowLayoutPanel,它应该可以工作。祝您好运。 - Beldi Anouar
谢谢您的回答,但我发现@Gess的回答更适合我的需求。再次感谢。 - Michael Haddad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接