Die Bildlaufposition wird in einem automatisch scrollbaren Panel-Steuerelement in einer Windows Forms Anwendung nicht beibehalten.

Dieser Artikel bietet eine Problemumgehung für das Problem, das auftritt, wenn Sie ein automatisch registriertes Panel-Steuerelement löschen und dann neu zeichnen, das untergeordnete Steuerelemente enthält.

Originalversion des Produkts:   Visual Basic .NET
Ursprüngliche KB-Nummer:   829417

Problembeschreibung

Wenn Sie in einer Microsoft Windows Forms-Anwendung ein automatisch scrollbares Panel-Steuerelement löschen und dann neu zeichnen, das untergeordnete Steuerelemente enthält, wird die Bildlaufposition nicht beibehalten.

Ursache

Manchmal müssen Sie den Inhalt des Panel-Steuerelements löschen und dann den Inhalt des Panel-Steuerelements neu zeichnen. Sie müssen dies beispielsweise tun, wenn das automatisch scrollbare Panel-Steuerelement eine Sammlung von Steuerelementen mit einer bestimmten Reihenfolge enthält. In der Regel handelt es sich bei diesen Steuerelementen um Benutzersteuerelemente.

Die Anwendung speichert jedoch nicht den Wert der AutoScrollPosition Eigenschaft des Panel-Steuerelements. Daher wird die Bildlaufposition nicht beibehalten, wenn der Inhalt des Panel-Steuerelements neu gezeichnet wird.

Problemumgehung

Um dieses Verhalten zu umgehen, verwenden Sie eine System.Drawing.Point Struktur, um den Wert der AutoScrollPosition Eigenschaft des Panel-Steuerelements zu speichern.

Nachdem das Panel-Steuerelement neu gezeichnet wurde, können Sie den Wert der AutoScrollPosition Eigenschaft mithilfe einer neuen Instanz der System.Drawing.Point Struktur abrufen.

Die Get-Methode der Panel.AutoScrollPosition.X Eigenschaft und die Get-Methode der Panel.AutoScrollPosition.Y Eigenschaft geben negative Werte zurück. Es sind jedoch positive Werte erforderlich. Sie können die Math.Abs Funktion verwenden, um einen positiven Wert aus der Panel.AutoScrollPosition.X Eigenschaft und der Panel.AutoScrollPosition.Y Eigenschaft abzurufen, wie in der folgenden Codezeile:

Visual Basic .NET- oder Visual Basic 2005-Code

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

Visual C# .NET Visual C# 2005-Code

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

Beispielanwendung

Führen Sie die folgenden Schritte aus, um diese Problemumgehung in einer Beispielanwendung zu verwenden:

  1. Klicken Sie auf "Start", zeigen Sie auf "Programme", zeigen Sie auf Microsoft Visual Studio .NET, und klicken Sie dann auf Microsoft Visual Studio .NET oder Microsoft Visual Studio 2005.

  2. Zeigen Sie im Menü Datei auf Neu, und klicken Sie dann auf Projekt. Das Dialogfeld Neues Projekt wird angezeigt.

  3. Klicken Sie unter Project Typen auf Visual Basic Projekte, oder klicken Sie auf Visual C#-Projekte.

    Hinweis

    Klicken Sie in Visual Studio 2005 auf Visual C#.

  4. Klicken Sie unter "Vorlagen" auf Windows Anwendung.

  5. Geben Sie im Feld "Name " "SampleWinApp" ein, und klicken Sie dann auf "OK". Standardmäßig wird ein Formular mit dem Namen "Form1" erstellt.

  6. Fügen Sie dem Formular "Form1" ein Schaltflächen- und ein Panel-Steuerelement hinzu.

    Hinweis

    Fügen Sie das Schaltflächen-Steuerelement nicht in das Panel-Steuerelement ein.

  7. Klicken Sie mit der rechten Maustaste auf das Panel-Steuerelement , und klicken Sie dann auf "Eigenschaften".

  8. Legen Sie die Eigenschaft "Automatischer Bildlauf" auf "True" fest.

  9. Fügen Sie in der Datei "Form1.vb " den folgenden Code vor der End Class-Anweisung hinzu:

    Visual Basic .NET- oder Visual Basic 2005-Code

    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- oder Visual C# 2005-Code

    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. Klicken Sie im Menü "Debuggen " auf "Start".

  11. Klicken Sie im Formular1 wiederholt auf "Schaltfläche1 ", damit die Bildlaufleiste im Panel-Steuerelement angezeigt wird.

    Hinweis

    Die Bildlaufposition wird im Panel-Steuerelement beibehalten.

References

Definition der ScrollableControl.AutoScrollPosition-Eigenschaft