Laufzeitprobleme beim dynamischen laden von Contro

Hallo,
ich lade zur Laufzeit Controls.
Das geht auch alles sehr gut.
Nun habe ich jedoch sehr viele Controls, welche ich dynamisch nachladen muss
Wenn ich 1000 Controls lade geht das 12 Sekunden.
Die nächsten 1000 gehen eine Minute
die nächsten 1000 gehen ca. 4 Minuten.
Kann man das irgendwie beschleunigen?

Ich habe folgende Schleife:

 for (int i = 0; i 

Gruß
Thomas

Hallo,

ich lade zur Laufzeit Controls.
Das geht auch alles sehr gut.
Nun habe ich jedoch sehr viele Controls, welche ich dynamisch
nachladen muss
Wenn ich 1000 Controls lade geht das 12 Sekunden.
Die nächsten 1000 gehen eine Minute
die nächsten 1000 gehen ca. 4 Minuten.
Kann man das irgendwie beschleunigen?

Speicher einbauen. Du hast den Arbeitsspeicher voll, Dein armer Rechner muss Daten auf die Festplatte auslagern.

Alternativ solltest Du mal nachdenken, ob es nicht eine bessere Lösung gibt. Wenn Du Lust hast, kannst Du ja mal erklären, warum Du so viele Controls brauchst. Eventuell habe ich ja einen Gegenvorschlag mit deutlich weniger Controls.

Gruß Rainer

Hallo

Speicher einbauen. Du hast den Arbeitsspeicher voll, Dein
armer Rechner muss Daten auf die Festplatte auslagern.

Am Speicher liegt es nicht. Ich habe 2GB Speicher, davon sind 1,4 belegt.
Ich habe ein Dual Core Prozessor.

Alternativ solltest Du mal nachdenken, ob es nicht eine
bessere Lösung gibt. Wenn Du Lust hast, kannst Du ja mal
erklären, warum Du so viele Controls brauchst. Eventuell habe
ich ja einen Gegenvorschlag mit deutlich weniger Controls.

Ich muss eine Erfassungsmaske bauen, die sich dynamisch lädt, alle Controls untereinander, damit man während der Erfassung eines nach dem anderen erfassen kann. Dafür kann man dann auch mit der Scrollbar nach unten scrollen.
Was soll angezeigt werden?
Es geht um die Beantwortung von Fragen einer Checkliste. Eine Checkliste kann beliebig viele Fragen haben.

z.B. Urlaubscheckliste:
Socken gepackt Ja/Nein
Schuhe gepackt Ja/Nein
Ausweis gepackt? Ja/Nein

Dafür brauche ich dann schon 9 Controls (3 Checkboxen und 3 Labels mit dem Text der Frage und 3 Zusatzliche Textfelder in der ich einen Kommentar dazu erfassen kann)
So kann das beliebig tief weitergehen.

Ich hoffe, das war so verständlich.
Thomas

Hallo Thomas,

Dafür brauche ich dann schon 9 Controls (3 Checkboxen und 3
Labels mit dem Text der Frage und 3 Zusatzliche Textfelder in
der ich einen Kommentar dazu erfassen kann)
So kann das beliebig tief weitergehen.

Ich hoffe, das war so verständlich.

ja, das ist verständlich genug.

Wenn ich an der Stelle Performaceprobleme bekommen würde, würde meine Lösung so aussehen:

Die Daten werden in Arrays gehalten. Ein Array mit dem Inhalt der Textboxen, eins mit dem Inhalt der Labels und eins für die Checkboxen.

Auf die Form kommen so viele Controls, wie ich gleichzeitig sehen möchte, nehmen wir mal an es wären 10, das macht dann 30 Controls plus ein Scrollbalken.

Beim Scrollen werden nur die Inhalte der Controls neu geladen, die Controls selbst nicht verschoben. Es muss nur aus der Stellung des Scrollbalkens der Index errechnet werden, und in einer Schleife die Controls neu geschrieben.

Wenn die Inhalte unbedingt weich scrollen sollen, geht auch das, das ist dann nur etwas mehr Arbeit. Dann mussen die Controls um geneu eine Spalte weich verschoben werden, dann springen sie um eine Spalte und die Inhalte werden neu geladen.

Der Unterschied ist für dsen Anwender nicht sichtbar, aber das Ergebnis sehr schnell.

Denk darüber nach … :smile: Bei Bedarf bau ich auch einen Beispielcode, aber das dauert ein wenig, mit .NET bin ich noch nicht so fit, in VB6 wäre das in 10 Minuten erledigt. Dann ist es auch egal, wie lang die Liste ist.

Stell Dir vor, Du hättest eine Datenbank mit 10 Millionen Einträgen. Die kannst Du anders gar nicht mehr anzeigen.

Gruß Rainer

Hallo Rainer,
das muss ich mir mal durch den Kopf gehen lassen.
Gerne kannst du dazu auch dazu ein kleines Beispiel bauen. So ganz verstanden habe ich es noch nicht.
Macht nichts, wenns etwas geht. Ich sammle dazu momentan grundsätzliche Infos. Da geht es mindestens eine Woche bis ich an die Realisierung gehe.
Thomas

Hallo Thomas,

ich habe jetzt endlich mal VB 2008 installiert. :smile:

Als Beispiel habe ich das Projekt
http://www.activevb.de/tipps/vbnettipps/tipp0048.html
geladen und nur verändert. Wie das die Steuerelemente erzeugt sehe ich mir später genau an, im Moment hat es mir gereicht, daß es funktioniert.

Dann habe ich in das Pannel noch zusätzlich einen Scrollbalken VScroll1 gelegt und den Code etwas verändert. Rictig neu ist nur die Prozedur ‚VScroll1_Scroll()‘ ganz am Ende, da steckt auch alles, was ich Dir zeigen wollte.

OK? Die Liste Scrollt in 11 Steuerelementen von 0 bis 1000.

Gruß Rainer

Public Class Form1
 Inherits System.Windows.Forms.Form

#Region " Vom Windows Form Designer generierter Code "

 Public Sub New()
 MyBase.New()

 ' Dieser Aufruf ist für den Windows Form-Designer erforderlich.
 InitializeComponent()

 ' Initialisierungen nach dem Aufruf InitializeComponent() hinzufügen

 End Sub

 ' Die Form überschreibt den Löschvorgang der Basisklasse, um Komponenten zu bereinigen.
 Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
 If disposing Then
 If Not (components Is Nothing) Then
 components.Dispose()
 End If
 End If
 MyBase.Dispose(disposing)
 End Sub

 ' Für Windows Form-Designer erforderlich
 Private components As System.ComponentModel.IContainer

 'HINWEIS: Die folgende Prozedur ist für den Windows Form-Designer erforderlich
 'Sie kann mit dem Windows Form-Designer modifiziert werden.
 'Verwenden Sie nicht den Code-Editor zur Bearbeitung.
 Friend WithEvents MainMenu1 As System.Windows.Forms.MainMenu
 Friend WithEvents MenuItem1 As System.Windows.Forms.MenuItem
 Friend WithEvents MenuItem4 As System.Windows.Forms.MenuItem
 Friend WithEvents MenuItem6 As System.Windows.Forms.MenuItem
 Friend WithEvents VScroll1 As System.Windows.Forms.VScrollBar
 Friend WithEvents pnlHNrn As System.Windows.Forms.Panel
 Private Sub InitializeComponent()
 Me.components = New System.ComponentModel.Container
 Me.MainMenu1 = New System.Windows.Forms.MainMenu(Me.components)
 Me.MenuItem1 = New System.Windows.Forms.MenuItem
 Me.MenuItem6 = New System.Windows.Forms.MenuItem
 Me.MenuItem4 = New System.Windows.Forms.MenuItem
 Me.pnlHNrn = New System.Windows.Forms.Panel
 Me.VScroll1 = New System.Windows.Forms.VScrollBar
 Me.pnlHNrn.SuspendLayout()
 Me.SuspendLayout()
 '
 'MainMenu1
 '
 Me.MainMenu1.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {Me.MenuItem1})
 '
 'MenuItem1
 '
 Me.MenuItem1.Index = 0
 Me.MenuItem1.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {Me.MenuItem6, Me.MenuItem4})
 Me.MenuItem1.Text = "&Datei"
 '
 'MenuItem6
 '
 Me.MenuItem6.Index = 0
 Me.MenuItem6.Text = "-"
 '
 'MenuItem4
 '
 Me.MenuItem4.Index = 1
 Me.MenuItem4.Text = "&Beenden"
 '
 'pnlHNrn
 '
 Me.pnlHNrn.BackColor = System.Drawing.SystemColors.ActiveBorder
 Me.pnlHNrn.Controls.Add(Me.VScroll1)
 Me.pnlHNrn.Location = New System.Drawing.Point(8, 0)
 Me.pnlHNrn.Name = "pnlHNrn"
 Me.pnlHNrn.Size = New System.Drawing.Size(257, 440)
 Me.pnlHNrn.TabIndex = 2
 '
 'VScroll1
 '
 Me.VScroll1.Location = New System.Drawing.Point(199, 0)
 Me.VScroll1.Name = "VScroll1"
 Me.VScroll1.Size = New System.Drawing.Size(19, 439)
 Me.VScroll1.TabIndex = 0
 '
 'Form1
 '
 Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
 Me.BackColor = System.Drawing.Color.Silver
 Me.ClientSize = New System.Drawing.Size(712, 449)
 Me.Controls.Add(Me.pnlHNrn)
 Me.Menu = Me.MainMenu1
 Me.Name = "Form1"
 Me.pnlHNrn.ResumeLayout(False)
 Me.ResumeLayout(False)

 End Sub

#End Region

 ' Bereitstellung von Objekt-Array Label (123 Elemente) 200 Then
 ' x = 10
 ' y = y + 20
 'End If
 Next
 End Sub

 Private Sub Lab\_Array\_Click(ByVal sender As Object, \_
 ByVal e As System.EventArgs)

 Me.pnlHNrn.Visible = False
 End Sub

 Private Sub Lab\_Array\_MouseMove(ByVal sender As Object, \_
 ByVal e As System.Windows.Forms.MouseEventArgs)

 ' Setzt die Schriftfarbe auf das ursprüngliche Grün
 Dim i As Integer
 For i = 0 To 122
 Me.Lab\_Array(i).ForeColor = System.Drawing.Color.FromArgb(0, 192, 0)
 Next

 ' Ruft den Index-Label auf
 Lab\_ArrayNr\_MouseMove(sender, e)
 End Sub

 Private Sub Lab\_ArrayNr\_MouseMove(ByVal sender As Object, \_
 ByVal e As System.Windows.Forms.MouseEventArgs)

 'Index-Steuerelement erstellen
 Dim Mouse\_Move\_Label As Label = DirectCast(sender, Label)

 'In diesem Fall wird die Schriftfarbe auf Rot gesetzt
 Mouse\_Move\_Label.ForeColor = System.Drawing.Color.FromArgb(192, 0, 0)
 End Sub

 Private Sub pnlHNrn\_MouseMove( \_
 ByVal sender As Object, \_
 ByVal e As System.Windows.Forms.MouseEventArgs) \_
 Handles pnlHNrn.MouseMove

 'Dim i As Integer '

Hallo Rainer,
prinzip verstanden.
Danke!
Das ganze geht wohl jedoch nur, wenn man genau weiß, wie gross die einzelnen Felder sind, damit man beim scrollen weiß, an welcher Stelle man ist.
Bei mir ist es jedoch noch etwas komplizierter. Ich habe je nach Art des Eintrages nicht immer die 3 beschriebenen Objekte, sonder auch mal 4 oder 5…
Das werde ich mir dann je Zeile merken müssen und entsprechend berechnen.

Ich habe aber auch noch was gefunden.
Wenn ich vor der Schleife
flowLayoutPanel1.SuspendLayout();
und nach der Schleife
flowLayoutPanel1.ResumeLayout();
setzte.
Damit geht es für die ersten 1000 nur noch 2 Sekunden
für die nächsten 1000 3 Sekunden

Thomas

Hallo Thomas,

Das ganze geht wohl jedoch nur, wenn man genau weiß, wie gross
die einzelnen Felder sind, damit man beim scrollen weiß, an
welcher Stelle man ist.

oder rechnen. .-)

Bei mir ist es jedoch noch etwas komplizierter. Ich habe je
nach Art des Eintrages nicht immer die 3 beschriebenen
Objekte, sonder auch mal 4 oder 5…
Das werde ich mir dann je Zeile merken müssen und entsprechend
berechnen.

Merken musst Du Dir nichts, nur rechnen. Die Inhalte des Arrays werden ja in der Schleife an die Steuerelemente übergeben, dann sind alle Informationen da. Natürlich kann das einiges an Rechnerei bringen, ist aber von der Menge der Daten unabhängig und sehr viel schneller.
Bein Programmieren ist das unbequemer, das stimmt, aber für den Anwender zählt das nicht, da muss das Programm nur schnell sein.

Ich habe aber auch noch was gefunden.
Wenn ich vor der Schleife
flowLayoutPanel1.SuspendLayout();
und nach der Schleife
flowLayoutPanel1.ResumeLayout();
setzte.
Damit geht es für die ersten 1000 nur noch 2 Sekunden
für die nächsten 1000 3 Sekunden

OK, das ist schon ein mächtiger Fortschritt. Ich würde trotzdem keine 3000 Steuerelemente auf die Form legen. Es gibt immer einen anderen Weg, denn man verwendet nie alle gleichzeitig.

Gruß Rainer