本文提供了一种解决方法,用于清除并重新绘制包含子控件的自动滚动面板控件时出现的问题。
原始产品版本: Visual Basic .NET
原始 KB 数: 829417
症状
在 Microsoft Windows Forms 应用程序中,如果清除并重新绘制一个包含子控件的自动滚动 Panel 控件,则无法保持滚动条的位置。
原因
有时,必须清除面板控件的内容,然后重新绘制面板控件的内容。 例如,如果自动滚动面板控件包含具有特定顺序的控件集合,则必须执行此作。 通常,这些控件是用户控件。
但是,应用程序不存储 Panel 控件的 AutoScrollPosition 属性值。 因此,重新绘制面板控件的内容时,不会保留滚动位置。
解决方法
若要解决此问题,请使用结构 System.Drawing.Point 来存储 Panel 控件的属性的值 AutoScrollPosition 。
重新绘制面板控件后,可以通过使用结构的新实例System.Drawing.Point来检索AutoScrollPosition属性的值。
属性的 Panel.AutoScrollPosition.X get 方法和属性的 Panel.AutoScrollPosition.Y get 方法返回负值。 但是,需要正值。 可以使用 Math.Abs 函数从 Panel.AutoScrollPosition.X 属性和 Panel.AutoScrollPosition.Y 属性获取正值,如以下代码行所示:
Visual Basic .NET 或 Visual Basic 2005 代码
Panel1.AutoScrollPosition = New Point(Math.Abs(Panel1.AutoScrollPosition.X), Math.Abs(CurrentPoint.Y))
Visual C# .NET Visual C# 2005 代码
panel1.AutoScrollPosition = new Point(Math.Abs(panel1.AutoScrollPosition.X), Math.Abs(CurrentPoint.Y));
示例应用程序
若要在示例应用程序中使用此解决方法,请执行以下步骤:
依次单击“ 开始”、“ 程序”、“ Microsoft Visual Studio .NET”,然后单击 Microsoft Visual Studio .NET 或 Microsoft Visual Studio 2005。
在 “文件” 菜单上,指向 “新建” ,然后单击 “项目” 。 将显示“新建项目”对话框。
在 “项目类型”下,单击 “Visual Basic 项目 ”或“ Visual C# 项目”。
注释
在 Visual Studio 2005 中,单击 “Visual C#”。
在 “模板”下,单击 “Windows 应用程序”。
在 “名称 ”框中,键入 SampleWinApp,然后单击“ 确定”。 默认情况下,将创建名为 Form1 的表单。
向 Form1 窗体添加按钮控件和面板控件。
注释
不要在面板控件中插入 Button 控件。
右键单击 面板 控件,然后单击“ 属性”。
将“自动滚动”属性设置为 True。
在 Form1.vb 文件中,在 Class 语句之前
End添加以下代码:Visual Basic .NET 或 Visual Basic 2005 代码
Private count As Integer Private arrayctl As New ArrayList Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim newtxt As New TextBox newtxt.Text = count count += 1 arrayctl.Add(newtxt) DrawControls() End Sub Private Sub DrawControls() Dim txt As TextBox Dim CurrentPoint As System.Drawing.Point CurrentPoint = Panel1.AutoScrollPosition() Dim i As Integer = 0 Panel1.Controls.Clear() Panel1.SuspendLayout() For Each txt In arrayctl Panel1.Controls.Add(txt) txt.Width = Panel1.ClientRectangle.Width txt.Top = i i += txt.Height Next Panel1.ResumeLayout() Panel1.AutoScrollPosition = New Point(Math.Abs(Panel1.AutoScrollPosition.X), Math.Abs(CurrentPoint.Y)) End SubVisual C# .NET 或 Visual C# 2005 代码
private int count; private ArrayList arrayctl = new ArrayList(); private void button1_Click(object sender, System.EventArgs e) { TextBox newtxt = new TextBox(); newtxt.Text = count.ToString(); count++; arrayctl.Add(newtxt); DrawControls(); } private void DrawControls() { System.Drawing.Point CurrentPoint; CurrentPoint = panel1.AutoScrollPosition; int i = 0; panel1.Controls.Clear(); panel1.SuspendLayout(); foreach (TextBox txt in arrayctl) { panel1.Controls.Add(txt); txt.Width = panel1.ClientRectangle.Width; txt.Top = i; i += txt.Height; } panel1.ResumeLayout(); panel1.AutoScrollPosition = new Point(Math.Abs(panel1.AutoScrollPosition.X), Math.Abs(CurrentPoint.Y)); }在 “调试 ”菜单上,单击“ 开始”。
在 Form1 窗体中,重复单击 Button1 以使滚动条显示在面板控件中。
注释
滚动位置保留在面板控件中。