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

如何在c#中将面板滚动到底部?,c#,scroll,panel,C#,Scroll,Panel,我有一个面板MessagesPanel,其中包含从数据库检索的消息。我使用foreach循环浏览消息。在循环中,我调用一个函数AddMessageToPanel,该函数动态地向面板添加一个GroupBox,其中包含消息信息和内容。从最早到最新,从上到下检索消息(如WhatsApp)。面板设置为AutoScroll=true,我希望它滚动到最底部以显示最新消息。 我尝试了这些解决方案: 他们都不为我工作。面板看起来完全一样,滚动条在顶部 我特别尝试了以下代码: private void Me

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

  • 他们都不为我工作。面板看起来完全一样,滚动条在顶部

    我特别尝试了以下代码:

    private void MessagePanel_ControlAdded(object sender, ControlEventArgs e)
    {
        MessagesPanel.ScrollControlIntoView(e.Control);
    }
    
    我用事件
    ControlAdded
    订阅它

    而且:

    MessagesPanel.VerticalScroll.Value = MessagesPanel.VerticalScroll.Maximum
    
    带和不带
    消息spanel.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);
    }
    

    我想让
    消息spanel
    一直向下滚动。如何做到这一点?谢谢

    使用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

  • 设置myFlowLayoutPanel.FlowDirection=FlowDirection.TopDown
  • 如果不需要多行或多列,请将
    WrapContents
    属性设置为
    false
  • 将AutoScroll属性设置为true

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

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

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

    尝试调用
    ScrollControlInView
    将您上次添加的项的实例传递给它。最好不要早于
    表单。显示
    事件。谢谢。第一种解决方案导致了一个奇怪的结果:滚动条占据了面板的一半左右,并且在所有
    groupbox
    es上方添加了一个奇怪的空间。下面是一个演示:。第二个解决方案什么都不做。。。滚动条保持在顶部,但未添加任何空间:。再次感谢,我很抱歉,但答案对我没有帮助。。。请参阅我之前的评论,以及答案中的问题。谢谢!我已经为你编辑了我的答案,测试flowLayoutPanel它应该可以工作。很幸运谢谢你的答案,但是我发现@Gess的答案更适合我的使用。再次感谢,正如上面Sinatr所说的,您可能在发生表单显示事件之前运行此操作。在应用AutoScrollPosition之前,需要等待该事件。