Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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:
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.
Zeigen Sie im Menü Datei auf Neu, und klicken Sie dann auf Projekt. Das Dialogfeld Neues Projekt wird angezeigt.
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#.
Klicken Sie unter "Vorlagen" auf "Windows-Anwendung".
Geben Sie im Feld "Name" "SampleWinApp" ein, und klicken Sie dann auf "OK". Standardmäßig wird ein Formular mit dem Namen "Form1" erstellt.
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.
Klicken Sie mit der rechten Maustaste auf das Panel-Steuerelement , und klicken Sie dann auf Eigenschaften.
Legen Sie die Auto-Scroll-Eigenschaft auf True fest.
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)); }
Klicken Sie im Menü Debuggen auf Starten.
Klicken Sie im Formular "Formular1" wiederholt auf "Button1 ", damit die Bildlaufleiste im Panel-Steuerelement angezeigt wird.
Notiz
Die Bildlaufposition wird im Panel-Steuerelement beibehalten.