如何在 C# 中将面板滚动到底部?
How to scroll a panel to the bottom in c#?
我有一个面板 MessagesPanel
,其中包含从数据库中检索的消息。我使用 foreach
循环查看消息。在循环中,我调用了一个函数 AddMessageToPanel
,它动态地将一个 GroupBox
添加到面板,其中包含消息信息和内容。消息从最旧到最新、从上到下检索(就像在 WhatsApp 中一样)。面板设置为 AutoScroll=true
,我希望它滚动到最底部以显示最新消息。
我尝试了这些解决方案:
- autoscroll panel to bottom
- How to Programmatically Scroll a Panel
- 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
- 设置
myFlowLayoutPanel.FlowDirection = FlowDirection.TopDown
- 如果您不想要多行或多列,请将
WrapContents
属性 设置为 false
- 将自动滚动 属性 设置为真
作为 Beldi 解决方案的替代方案,您可以调用
MessagesPanel.AutoScrollPosition = new Point(0, MessagesPanel.DisplayRectangle.Height);
所有控件都添加到面板后。
我有一个面板 MessagesPanel
,其中包含从数据库中检索的消息。我使用 foreach
循环查看消息。在循环中,我调用了一个函数 AddMessageToPanel
,它动态地将一个 GroupBox
添加到面板,其中包含消息信息和内容。消息从最旧到最新、从上到下检索(就像在 WhatsApp 中一样)。面板设置为 AutoScroll=true
,我希望它滚动到最底部以显示最新消息。
我尝试了这些解决方案:
- autoscroll panel to bottom
- How to Programmatically Scroll a Panel
- 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
- 设置
myFlowLayoutPanel.FlowDirection = FlowDirection.TopDown
- 如果您不想要多行或多列,请将
WrapContents
属性 设置为false
- 将自动滚动 属性 设置为真
作为 Beldi 解决方案的替代方案,您可以调用
MessagesPanel.AutoScrollPosition = new Point(0, MessagesPanel.DisplayRectangle.Height);
所有控件都添加到面板后。