Freigeben über


Die Bildlaufposition wird in einem Steuerelement für den automatischen Bildlaufbereich in einer Windows Forms-Anwendung nicht beibehalten.

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

Originalproduktversion: Visual Basic .NET
Ursprüngliche KB-Nummer: 829417

Problembeschreibung

Wenn Sie in einer Microsoft Windows Forms-Anwendung ein Steuerelement für den automatischen Bildlaufbereich 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. Dies müssen Sie beispielsweise tun, wenn das Steuerelement für den automatischen Bildlaufbereich eine Sammlung von Steuerelementen enthält, die eine bestimmte Reihenfolge aufweisen. 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. Positive Werte sind jedoch 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 Projekttypen auf Visual Basic-Projekte, oder klicken Sie auf Visual C#-Projekte.

    Notiz

    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 Formular1 ein Schaltflächen-Steuerelement und ein Panel-Steuerelement hinzu.

    Notiz

    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 Auto-Scroll-Eigenschaft 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 Starten.

  11. Klicken Sie im Formular "Formular1" wiederholt auf "Button1 ", damit die Bildlaufleiste im Panel-Steuerelement angezeigt wird.

    Notiz

    Die Bildlaufposition wird im Panel-Steuerelement beibehalten.

References

ScrollableControl.AutoScrollPosition-Eigenschaftsdefinition