Gibt es eine maximal mögliche Anzahl an Elementen auf einer einzigen Form?

  • VB.NET
  • .NET 4.5

Es gibt 29 Antworten in diesem Thema. Der letzte Beitrag () ist von simpelSoft.

    Gibt es eine maximal mögliche Anzahl an Elementen auf einer einzigen Form?

    Hallo Leute,

    ich bin am Ausloten für meine Möglichkeiten für ein kommendes Projekt.

    Ich hatte 2008 schon einmal eine Hotelsoftware mit VB6 geschrieben. Die einzelnen Zimmerreservierung auf der Buchungsübersicht (siehe Screenshot im Anhang) sind Button-Controls auf einem verschiebbaren Panel-Control. Diese werden zur Laufzeit erstellt. Leider hatte VB6 eine Limitierung für die Maximalanzahl an Controls - ich glaube bei 256.
    Mittels Slider-Control konnte das Panel mit den Zimmerreservierungen auf und ab gezogen werden, um so alle Zimmer anzeigen zu lassen.
    Die Zeitleiste (links und rechts) musste ich jedoch immer per neuem Bildschirmaufbau realisieren, weil es dazu mehr mögliche Controls erfordert hätte.

    Daher meine Frage: gibt es eine maximale Anzahl an Controls auf einer Form in VB.NET ab 4.5 ?

    Dass viele Controls auch höhere Rechnerkapazitäten bedürfen, das ist mir klar.
    Aber zum Glück müssen solche neuen Programme nicht mehr auf uralt-Hardware laufen, sondern gönnen sich mindestens Core i5, 8GB RAM und SSD.

    LG Roland
    Bilder
    • 08112019093805.jpg

      929,89 kB, 1.518×824, 145 mal angesehen
    Liebe Grüße
    Roland Berghöfer

    Bei der Entwicklung meiner Anwendung(en) steht nicht "Code nach .NET Lehrbuch" im Vordergrund, sondern eine stabile und brauchbare Anwendung die der Anwender ordentlich verwenden kann. Usability für den Kunden und Supportbarkeit beim Kunden stehen an oberster Stelle. Das spiegelt sich auch in meinen Fragen und Antworten wider. Bitte verzeiht, dass meine VB.NET Quellcodes etwas VB6-lastig sind aber das ist für das funktionierende Endergebnis nicht wirklich relevant.
    Also jetz mal ohne konkrete nach zu forschen, aber ich denke mal, das

    Quellcode

    1. Int32.MaxValue
    die maximale Anzahl an möglichen Elementen in einer Form.

    Da allerdings in der Form Du die Child Controls in der Property Controls, welche eine ControlCollection ist, was am Ende auch nur eine IList<> Implementierung ist, ablegst und jedes Control, dass Du da hineinpackst, wieder eine ControlCollection hat, würde icih mal sagen, ist es (beinahe) unmöglich, da "zu viele Controls" zu verwenen. Also rein für das Framework. Für den User würd ich schon weit früher als 32k Elemente Schluss machen :D

    Edit: Ich hab jetzt mal spaßeshalber ein Programm geschrieben, was in einer Schleife Controls hinzufügt. Ist nach knapp 25 Minuten bei ~118k angelangt mit Speicherauslastung von ~58MB.
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Radinator“ ()

    Ich gehe mal vom Worst-Case aus:
    100 Zimmer, jede Nacht einmal von jemand anderem belegt, ergibt für ein ganzes Jahr auf einmal am Bildschirm: 36500 Button-Controls

    Realistischere Annahme:
    100 Zimmer, jede Woche 2x mit anderen Kunden belegt und ein halbes Jahr am Bildschirm scrollbar: 5200 Button Controls
    30 Zimmer, jede Woche 3x mit anderen Kunden belegt und ein ganzes Jahr am Bildschirm scrollbar: 4680 Button Controls

    Man könnte dann ja je nach Rechnerleistung und Zimmeranzahl die maximal anzeigbare Zeitleiste erhöhen oder herabsetzen, damit man eventuell mit 3000 Controls auskommt. Im Schnitt haben unsere Kunden zwischen 5 und 40 Zimmer.

    Dass in VB.NET mehr als 256 Controls möglich sein müssen weis, aber nicht wie viel genau.
    Meine aktuelle ERP Software besteht aus Performancegründen nur aus 2 Forms. Auf beiden Forms werden alle Funktionen mit Panels ein- und ausgeblendet und auf jedem Panel befinden sich unzählige weitere Controls (siehe Screenshot). Dies ist wesentlich schneller und smoother als mit Forms zu arbeiten. In der Entwicklungsumgebung ist es zwar auch auf einem 34" Bildschirm etwas unübersichtlich, aber man gewöhnt sich dran.

    Wenn es wirklich 32.000 sind, dann wäre das optimal.
    Bilder
    • Unbenannt-1.jpg

      1,1 MB, 3.440×1.408, 137 mal angesehen
    Liebe Grüße
    Roland Berghöfer

    Bei der Entwicklung meiner Anwendung(en) steht nicht "Code nach .NET Lehrbuch" im Vordergrund, sondern eine stabile und brauchbare Anwendung die der Anwender ordentlich verwenden kann. Usability für den Kunden und Supportbarkeit beim Kunden stehen an oberster Stelle. Das spiegelt sich auch in meinen Fragen und Antworten wider. Bitte verzeiht, dass meine VB.NET Quellcodes etwas VB6-lastig sind aber das ist für das funktionierende Endergebnis nicht wirklich relevant.
    Wäre es nicht auch denkbar die Belegung nicht per Button dazustellen sondern diese selbst zu zeichnen?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Wäre es nicht auch denkbar die Belegung nicht per Button dazustellen sondern diese selbst zu zeichnen?

    Hatte ich ursprünglich auch angedacht. Jedoch ist dann die Interaktion mit den einzelnen Buchungen zu aufwändig. So kann ich einfach Kontextmenüs, Mausklicks, Mausmoves etc. über dem entsprechenden Button realisieren. Da habe ich viel mehr Möglichkeiten die einfacher umzusetzen sind.
    Liebe Grüße
    Roland Berghöfer

    Bei der Entwicklung meiner Anwendung(en) steht nicht "Code nach .NET Lehrbuch" im Vordergrund, sondern eine stabile und brauchbare Anwendung die der Anwender ordentlich verwenden kann. Usability für den Kunden und Supportbarkeit beim Kunden stehen an oberster Stelle. Das spiegelt sich auch in meinen Fragen und Antworten wider. Bitte verzeiht, dass meine VB.NET Quellcodes etwas VB6-lastig sind aber das ist für das funktionierende Endergebnis nicht wirklich relevant.

    dive26 schrieb:

    Maximalanzahl an Controls - ich glaube bei 256.
    Dieses VB6-Problem hatte ich bei einem Projekt ebenfalls.
    Damals half es, Gruppen von Controls zu UserControls zusammenzufassen, die nun ihrerseits die 255-Grenze hatten, aber das Parent-Control hatte statt der n zusammengefassten Controls dann nur noch ein Control, das UserControl.
    Konkret war das ein TabControl, da haben wir für jeden Tab ein separates UserControl erstellt.
    (Hau mich jetzt bitte nicht, wenn der Begriff UserControl möglicherweise von .NET gepachtet ist).
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    @seh Ja bist du. Denn die 36.500 Buttons waren rein rechnerisch sein Maximum. Er rechnet ja eher mit 3.000, 4.680 bzw. 5.600. Zudem musst du auch lesen wozu er sie verwendet. Selber Zeichnen hatte er schon überlegt und aus nachvollziehbaren Gründen zunächst ausgeschlossen. Eine alternative wurde hier bis dato nicht genannt. Was schlägst du vor als alternative?

    Oder wolltest nur nen bissl stänkern? ;)
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @dive26
    Wenn ich mir das 1. Bild oben im Eingangspost ansehe - könnte ich mir ein DGV vorstellen, wo die Tage zeilenweise und die Zimmer spaltenweise dargestellt werden...
    Die Zellen kann man schön formatieren und mit Events kann man arbeiten - nur Zellen zusammenfassen, wird's da nicht geben...
    Ev. gibt's dazu eine Abhilfe: codeproject.com/Articles/34037…xCell-with-Span-Behaviour

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VB1963“ ()

    könnte ich mir ein DGV vorstellen

    Technisch: ja
    Optisch: auf keinen Fall

    So eine Software soll ja nicht nur deren Zweck erfüllen, sondern auch optisch etwas her machen. Denn über die optische Oberfläche verkauft man das Produkt genau so wie mit den Funktionen ;-). DGV sieht leider für diesen Zweck zu altbacken aus.

    In VB.NET habe ich zudem noch viel mehr optische Möglichkeiten einen Button zu gestalten - nicht nur die altbackene Optik von VB6 wie am Screenshot.

    Wengen der Anzahl der Button-Controls und Performance mache ich mir wirklich keine Sorgen.
    Mit der Control-Limitierung von VB6 konnte ich 2 Monate und 100 Zimmer auf einmal anzeigen und die Software lief auf Dualcore 1,8 GHz Prozessoren wie den Celeron D525.
    Ich schätze, dass im Realbetrieb nicht mehr als 1000 Button Controls auf einmal angezeigt werden müssen und das jede aktuelle Hardware ohne zucken schafft.

    Nun zu meiner ursprünglichen Frage: Wieviele Controls sind jetzt wirklich auf einer Form möglich? Wirklich 32k ?
    Liebe Grüße
    Roland Berghöfer

    Bei der Entwicklung meiner Anwendung(en) steht nicht "Code nach .NET Lehrbuch" im Vordergrund, sondern eine stabile und brauchbare Anwendung die der Anwender ordentlich verwenden kann. Usability für den Kunden und Supportbarkeit beim Kunden stehen an oberster Stelle. Das spiegelt sich auch in meinen Fragen und Antworten wider. Bitte verzeiht, dass meine VB.NET Quellcodes etwas VB6-lastig sind aber das ist für das funktionierende Endergebnis nicht wirklich relevant.

    dive26 schrieb:

    Nun zu meiner ursprünglichen Frage: Wieviele Controls sind jetzt wirklich auf einer Form möglich? Wirklich 32k ?
    Probier es dich einfach mal aus. Per Schleife In einer Form Buttons hinzufügen und schauen wie lange alles gut geht :-p
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    dive26 schrieb:

    Nun zu meiner ursprünglichen Frage: Wieviele Controls sind jetzt wirklich auf einer Form möglich? Wirklich 32k ?

    Radinator war so freundlich dir die Arbeit abzunehmen und hat dies bereits probiert wie er dir bereits geschrieben hatte:

    Radinator schrieb:

    Ich hab jetzt mal spaßeshalber ein Programm geschrieben, was in einer Schleife Controls hinzufügt. Ist nach knapp 25 Minuten bei ~118k angelangt mit Speicherauslastung von ~58MB


    Ich denke das sollte für dich ausreichend sein, ansonsten ist diese Frage nur für dich selbst beantwortbar weil es darauf ankommt (wie hier ja bereits geschrieben wurde) ob sich Controls z.b. wieder in UserControls zusammenfassen oder nicht.
    Schreibe das Form und dein Programm mal und probiere es aus. Ich denke nicht das du hier an die Grenze kommst und auch nicht kommen willst oder?

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    seh schrieb:

    Gibt es eine maximal mögliche Anzahl an Elementen auf einer einzigen Form?[/url]']Bin ich der einzige, der, wenn ich 36500 Button Controls lese, geradewegs gegen die nächste Tür rennen will?

    So gehts mir auch - das ist von der Performance aus betrachtet auch bei "nur" 1000 Controls in meinen Augen der SuperGAU.

    dive26 schrieb:

    Gibt es eine maximal mögliche Anzahl an Elementen auf einer einzigen Form?[/url]']So eine Software soll ja nicht nur deren Zweck erfüllen, sondern auch optisch etwas her machen. Denn über die optische Oberfläche verkauft man das Produkt genau so wie mit den Funktionen ;-). DGV sieht leider für diesen Zweck zu altbacken aus.

    Auch das ist soweit richtig - es gibt aber zum Glück durchaus Alternativen dazu.
    Diese sind dann zwar meistens leider kostenpflichtig, aber oftmals lohnt sich so was dann.

    Google doch einfach mal nach "ScheduleCalendarControl"...
    Mit einem davon habe ich selbst bereits sehr gute Erfahrungen gemacht.

    Viele Grüße
    Thomas
    Ich find's gerade interessant, was mein PC für lustige Geräusche beim (mehrfachen) Ausführen dieses Codes macht:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. For i = 1 To 1000
    3. Me.Controls.Add(New Label)
    4. Next
    5. End Sub

    Klingt, als ob entfernt ein Geschoss vom Himmel fällt. Zuerst ein hohes aber leises Fiepen, welches zunehmend tiefer wird.
    Bei knapp unter 10000 Labels bekomm ich wiederholbar »zuverlässig«: "System.ComponentModel.Win32Exception" Fehler beim Erstellen des Fensterhandles.
    Und wenn ich das Debuggen beende, scheint das Geschoss wieder in die Höhe zu steigen.
    An der Speicherauslastung liegt es nicht, da bin ich noch kilometerweit vom Ende entfernt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    VaporiZed schrieb:

    Bei knapp unter 10000 Labels bekomm ich

    Genau das hätte ich auch erwarte und deswegen glaube ich auch, dass Radinator in seinem Test etwas falsch gemacht hat. Vielleicht wurden die Controls nicht der Form oder so hinzugefügt und waren damit nur erstmal virtuell, denn erst beim Anzeigen oder Benutzen bekommen diese ihr Handle. So gut wie jedes Forms-Control, darunter auch Bitmap, Brush, Font, Pen.... ist ein GDI-Object und wird als solches gezählt und dafür gibt es pro Anwendung ein Limit. Dieses Limit liegt im Standard bei 10000.
    What's the upper limit on GDI objects for one process in Windows 7?
    How to increase the maximum amount of GDI Object for Windows 10?
    Man kann diese aber über die Registry erhöhen. Im Taskmanager kann man sich unter dem Reiter "Details" die Spalte "GDI-Objecte" anzeigen lassen um zu sehen, wie viele jeder Prozess hat.

    Dieses Limit liegt im Standard bei 10000.


    Das ist schon einmal ein Ansatz. Besser als 256 in VB6. Damit lässt sich was anfangen. Vielen Dank!
    Liebe Grüße
    Roland Berghöfer

    Bei der Entwicklung meiner Anwendung(en) steht nicht "Code nach .NET Lehrbuch" im Vordergrund, sondern eine stabile und brauchbare Anwendung die der Anwender ordentlich verwenden kann. Usability für den Kunden und Supportbarkeit beim Kunden stehen an oberster Stelle. Das spiegelt sich auch in meinen Fragen und Antworten wider. Bitte verzeiht, dass meine VB.NET Quellcodes etwas VB6-lastig sind aber das ist für das funktionierende Endergebnis nicht wirklich relevant.
    Habe mich jetzt auch ein wenig damit herumgespielt. Ich denke ich muss mir eine Alternative suchen. Es geht mir noch etwas zu langsam.

    Testweise habe ich 2000 Buttons und 2000 Labels in eine Form gezeichnet.
    Danach werden alle Buttons und Labels hintereinander einen Pixel nach rechts unten verschoben und die Beschriftung geändert (nur so als Test zur Aktualisierung des Inhalts).
    Das geht mir zu "träge".

    Hier meine Testapp: bonit.at/download/ControlsDemo.zip

    Ok, vielleicht hat jemand von Euch eine Idee, wie ich schnelles Zeichnen von Rechtecken mit Text drauf realisieren kann und gleichzeitig eine Mouseover und ein Mausklick darauf realisieren kann. Mit GDI (oder so) alles manuell Zeichnen und dann mit Koordinaten arbeiten? Finde ich irgendwie sehr mühsam ;-).

    Vielleicht hat jemand noch eine Idee (ausgenommen Datagrid) ;-).
    Liebe Grüße
    Roland Berghöfer

    Bei der Entwicklung meiner Anwendung(en) steht nicht "Code nach .NET Lehrbuch" im Vordergrund, sondern eine stabile und brauchbare Anwendung die der Anwender ordentlich verwenden kann. Usability für den Kunden und Supportbarkeit beim Kunden stehen an oberster Stelle. Das spiegelt sich auch in meinen Fragen und Antworten wider. Bitte verzeiht, dass meine VB.NET Quellcodes etwas VB6-lastig sind aber das ist für das funktionierende Endergebnis nicht wirklich relevant.
    @dive26 Dann musst Du es machen, wie es Dir im Designer vorgemacht wird:
    Update die GUI nicht, während Du die Controls erzeugst oder bewegst:

    VB.NET-Quellcode

    1. Me.SuspendLayout()
    2. ' was tun
    3. Me.ResumeLayout(False)
    4. Me.PerformLayout()
    Je nach dem kannst Du das noch für Unter-Controls (TableLayoutPanel & Co) separat machen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Update die GUI nicht, während Du die Controls erzeugst oder bewegst:


    Vielen Dank. Habe ich auch schon berücksichtigt. Bringt nur geringfügige Geschwindigkeitssteigerung. Aber leider immer noch nicht optimal.
    Liebe Grüße
    Roland Berghöfer

    Bei der Entwicklung meiner Anwendung(en) steht nicht "Code nach .NET Lehrbuch" im Vordergrund, sondern eine stabile und brauchbare Anwendung die der Anwender ordentlich verwenden kann. Usability für den Kunden und Supportbarkeit beim Kunden stehen an oberster Stelle. Das spiegelt sich auch in meinen Fragen und Antworten wider. Bitte verzeiht, dass meine VB.NET Quellcodes etwas VB6-lastig sind aber das ist für das funktionierende Endergebnis nicht wirklich relevant.