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

时间:2016-05-09 13:28:32

标签: c# scroll panel

我有一个面板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?
  4. 他们都不适合我。面板看起来一样,滚动条位于顶部。

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

    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一直向下滚动。这该怎么做?谢谢!

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分: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. SetAutoScroll属性为true