通过


滚动位置不会保留在 Windows 窗体应用程序中的可自动滚动面板控件中

本文提供了一种解决方法,用于清除并重新绘制包含子控件的自动滚动面板控件时出现的问题。

原始产品版本: 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));

示例应用程序

若要在示例应用程序中使用此解决方法,请执行以下步骤:

  1. 依次单击“ 开始”、“ 程序”、“ Microsoft Visual Studio .NET”,然后单击 Microsoft Visual Studio .NETMicrosoft Visual Studio 2005

  2. “文件” 菜单上,指向 “新建” ,然后单击 “项目” 。 将显示“新建项目”对话框。

  3. “项目类型”下,单击 “Visual Basic 项目 ”或“ Visual C# 项目”。

    注释

    在 Visual Studio 2005 中,单击 “Visual C#”。

  4. “模板”下,单击 “Windows 应用程序”。

  5. “名称 ”框中,键入 SampleWinApp,然后单击“ 确定”。 默认情况下,将创建名为 Form1 的表单。

  6. 向 Form1 窗体添加按钮控件和面板控件。

    注释

    不要在面板控件中插入 Button 控件。

  7. 右键单击 面板 控件,然后单击“ 属性”。

  8. 将“自动滚动”属性设置为 True。

  9. 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 Sub
    

    Visual 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));
    }
    
  10. “调试 ”菜单上,单击“ 开始”。

  11. 在 Form1 窗体中,重复单击 Button1 以使滚动条显示在面板控件中。

    注释

    滚动位置保留在面板控件中。

References

ScrollableControl.AutoScrollPosition 属性定义