Compartir a través de


La posición de desplazamiento no se mantiene en un control panel desplazable automáticamente en una aplicación de Windows Forms.

En este artículo se proporciona una solución alternativa para el problema que se produce cuando se borra y, a continuación, se vuelve a dibujar un control panel que contiene controles secundarios.

Versión original del producto: Visual Basic .NET
Número de KB original: 829417

Síntomas

En una aplicación de Microsoft Windows Forms, si borra y vuelve a dibujar un control panel desplazable automáticamente que contiene controles secundarios, no se mantiene la posición de desplazamiento.

Causa

A veces, debe borrar el contenido del control Panel y, a continuación, volver a dibujar el contenido del control Panel. Por ejemplo, debe hacerlo si el control Panel desplazable automáticamente contiene una colección de controles que tienen un orden específico. Normalmente, estos controles son controles de usuario.

Sin embargo, la aplicación no almacena el valor de la AutoScrollPosition propiedad del control Panel. Por lo tanto, la posición de desplazamiento no se mantiene cuando se vuelve a dibujar el contenido del control Panel.

Solución alternativa

Para solucionar este comportamiento, use una System.Drawing.Point estructura para almacenar el valor de la AutoScrollPosition propiedad del control Panel.

Después de volver a dibujar el control Panel, puede recuperar el valor de la AutoScrollPosition propiedad mediante una nueva instancia de la System.Drawing.Point estructura.

El método get de la Panel.AutoScrollPosition.X propiedad y el método get de la Panel.AutoScrollPosition.Y propiedad devuelven valores negativos. Sin embargo, se requieren valores positivos. Puede usar la Math.Abs función para obtener un valor positivo de la Panel.AutoScrollPosition.X propiedad y la Panel.AutoScrollPosition.Y propiedad , como en la siguiente línea de código:

Código de Visual Basic para .NET o Visual Basic 2005

Panel1.AutoScrollPosition = New Point(Math.Abs(Panel1.AutoScrollPosition.X), Math.Abs(CurrentPoint.Y))

Código de Visual C# para Visual C# 2005 de Visual C#

panel1.AutoScrollPosition = new Point(Math.Abs(panel1.AutoScrollPosition.X), Math.Abs(CurrentPoint.Y));

Aplicación de ejemplo

Para usar esta solución alternativa en una aplicación de ejemplo, siga estos pasos:

  1. Haga clic en Inicio, seleccione Programas, Microsoft Visual Studio .NET y, a continuación, haga clic en Microsoft Visual Studio .NET o Microsoft Visual Studio 2005.

  2. En el menú Archivo , elija Nuevoy haga clic en Proyecto. Aparecerá el cuadro de diálogo Nuevo proyecto .

  3. En Tipos de proyecto, haga clic en Proyectos de Visual Basic o en Proyectos de Visual C#.

    Nota:

    En Visual Studio 2005, haga clic en Visual C#.

  4. En Plantillas, haga clic en Aplicación windows.

  5. En el cuadro Nombre , escriba SampleWinApp y, a continuación, haga clic en Aceptar. De forma predeterminada, se crea un formulario denominado Form1.

  6. Agregue un control Button y un control Panel al formulario Form1.

    Nota:

    No inserte el control Botón dentro del control Panel.

  7. Haga clic con el botón derecho en el control Panel y, a continuación, haga clic en Propiedades.

  8. Establezca la propiedad Auto-Scroll en True.

  9. En el archivo Form1.vb , agregue el código siguiente antes de la End instrucción Class:

    Código de Visual Basic para .NET o 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
    

    Código de Visual C# .NET o 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. En el menú Depurar, haga clic en Iniciar.

  11. En el formulario Form1, haga clic en Button1 repetidamente para que la barra de desplazamiento aparezca en el control Panel.

    Nota:

    La posición de desplazamiento se mantiene en el control Panel.

Referencias

Definición de la propiedad ScrollableControl.AutoScrollPosition