【问题标题】:How to scroll a panel to the bottom in c#?如何在c#中将面板滚动到底部?
【发布时间】:2016-09-04 03:56:28
【问题描述】:

我有一个面板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?

它们都不适合我。面板看起来一样,滚动条在顶部。

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

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 事件。

标签: c# scroll panel


【解决方案1】:

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

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

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

【讨论】:

  • 如上面 Sinatr 所述,您可能在 Form.Shown 事件发生之前运行它。在应用 AutoScrollPosition 之前,您需要等待该事件。
【解决方案2】:

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

【讨论】:

  • 谢谢。第一个解决方案导致了一个奇怪的结果:滚动条到达面板的大约一半,并且在所有groupboxes 上方添加了一个奇怪的空间。这是一个演示:i.imgur.com/hJyJ2yy.gifv。第二个解决方案什么都不做......滚动条保持在顶部,但没有添加空间:i.imgur.com/7y4IZsh.png?1。再次感谢,
  • 很抱歉,但答案对我没有帮助...请参阅我之前对答案中问题的评论。非常感谢!
  • 我已经为你编辑了我的答案,测试它应该工作的 flowLayoutPanel。祝你好运
  • 感谢您的回答,但我发现@Gess 的回答更适合我的使用。再次感谢,
猜你喜欢
  • 2021-08-28
  • 1970-01-01
  • 2013-01-19
  • 2021-01-11
  • 2013-07-22
  • 2010-10-28
  • 1970-01-01
相关资源
最近更新 更多