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

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    Naja, hier würde mir nur die WPF einfallen da die WPF zum einen Hardwarebeschleunigung der GPU unterstützt und zum anderen nicht immer die ganze "Form" neu zeichnet.

    Aber einfacher wäre es für dich sicherlich dir ein eigenes Control zu bauen.
    Schon mal die überlegung gemacht die Controls nicht alle zu erstellen. Es sind ja auch nicht alle immer für den User sichtbar oder? Ich würde nur die Controls "zeichnen" welche auch im Moment benötigt werden.

    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. ##

    Schon mal die überlegung gemacht die Controls nicht alle zu erstellen. Es sind ja auch nicht alle immer für den User sichtbar oder? Ich würde nur die Controls "zeichnen" welche auch im Moment benötigt werden.


    Davon gehe ich aus. Es werden nur die Controls gezeichnet die auch benötigt werden.
    Bei 90% unserer Zielkunden wirds mit 300-400 Buttons ausreichen und da wäre es kein Problem.
    Aber dennoch sollte auch bei 1000 Buttons die ganze sache ziemlich zügig und smooth funktionieren.

    Ich werde mir mal ansehen wie schnell GDI+ ist, besonders, wenn der Bildschirmaufbau im Paint-Ereignis stattfindet.
    Mausover und Mausklick Ereignisse muss ich dann virtuell mit einem Koordinatensystem realisieren. Nicht mein Favorit, aber machbar.
    Wenn das mit GDI+ auch nicht brauchbar oder handelbar ist, dann werde ich wohl oder übel auf die Button-Controls zurückgreifen.

    WPF ist für mich leider noch ein unbeschriebenes Blatt. Habe einmal reingeschnuppert - ist aber nicht meins ;-).
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Zeichne es mit GDI+. Geht wirklich zügig, ist im Back-End auch hardwarebeschleunigt. Sieht auch besser aus als so'n paar Buttons. Falls du aber den original Look eines Buttons zeichnen willst, guck dir die ButtonRenderer Klasse an.
    Die Mouseevents kannst du vom Parentcontrol übernehmen. Die Rectangle.Contains() Methode sagt dir ob ein Punkt im Rechteck liegt.
    OwnerDrawing kann man auch ziemlich gut mit Datenhaltung verknüpfen - auch mit Databinding.
    gugge allgemeine Zugriffs-Lösung für: MySql, Access, SqlCe, SqlServer, DatasetOnly
    Und OwnerDrawing
    Aber man muss sich gut auskennen.
    Und ein komplettes Calendar-Control selber mit Ownerdrawing zu stemmen - sehr umfangreich - vor allem, weil du ja auch KontextMenü, Tooltips und anderen Kram haben willst.
    Jedenfalls - richtig angefasst - kann OwnerDrawing auch sehr vielen Elementen flüssig darstellen.
    Vielen Dank für Eure Hilfe. :thumbsup:
    Ich möchte Euch natürlich auch meine Erfahrungen und mein Ergebnis mitteilen.

    Ich habe vorerst einmal eine Preview-Oberfläche für meine Anwendung erstellt um alles rund um Controls oder GDI+ ausprobieren zu können.
    Da werden bereits alle Form-Rezise und Scroll-Events behandelt und man kann die Zeilen und Schriftarten auch Stufenlos in der Größe ändern.

    Ich habe mich nun dafür entschieden den linken Panel mit Buttons, Labels und Panels zu befüllen. Testweise habe ich es mit 100, 300 und 3000 Zimmer ausprobiert. Pro Zimmer verwende ich 1 Button und 2 Panels für die Darstellung. Bei 300 und 900 Controls merkt man keinen gravierenden Unterschied. Bei 9.000 Controls "steht die Mühel" jedoch. Bei 10.000 Controls die an ein MutterControl gebunden sind ist aber seitens VB.NET Ende.

    Auf der Rechten Seite (die Balken für die Zimmerreservierung) habe ich mich für GDI+ entschieden. Damit zeichne ich die Balken (wahlweise auch Gradient befüllt, mit oder ohne Rahmen und mit GDI+ Text drauf). Das geht superschnell, auch wenn ich tausende an Buchungen gleichzeitig darstelle. Das "MouseOver" wird mit einem virtuellen Koordinatensystem und Panels umgesetzt.

    Fazit: Nur Controls wäre schon alleine wegen der Limitierung und der Performance nicht gegangen. Aber die Mischung aus Controls und GDI+ ist otpimal für mein Vorhaben.

    LG ROLand
    Bilder
    • TestOberflaeche.jpg

      888,52 kB, 1.636×928, 111 mal angesehen
    • 21112019102241.jpg

      604,64 kB, 1.266×793, 85 mal angesehen
    • Unbenannt-1.jpg

      1,54 MB, 3.440×1.440, 115 mal angesehen
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    @dive26 Wie wäre es, wenn Du pro Zimmer nur ein Label anzeigst und den Button und die beiden Label in einen Dialog packst, den Du wie ein ToolTip anzeigst, z.B. bei Rechtsklick oder so.
    Dialog ohne Border ggf. mit eionem Close-Button. Das sollte noch etwas Performance bringen.
    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).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wie wäre es, wenn Du pro Zimmer nur ein Label anzeigst und den Button und die beiden Label in einen Dialog packst, den Du wie ein ToolTip anzeigst, z.B. bei Rechtsklick oder so.


    Es sollen so viele Infos wie möglich auf einen Blick ersichtlich sein ohne dass man wo hinklicken oder darüberfahren muss. Daher die beiden Labels auf dem Button drauf. Das Popup (das bei MouseEnter erscheint) hat dann weniger wichtige Informationen die man gezielt aufrufen kann.

    Zum Verständnis: Dort wo "Zimmer 11" steht ist ein Button. Die beiden weißen Rechtecke daneben sind Labels.
    Optisch hätte ich statt dem Button auch ein Label machen können, jedoch hat der Button einige Vorteile gegenüber dem Label (MouseOver) etc.

    Performancetechnisch passt es so. Mehr als 100 Zimmer werden nur einen Bruchteil unserer Zielkunden haben. Die meisten liegen zwischen 10 und 30 Zimmer.

    In der alten VB6 Hotelsoftware, wo ich noch mit Buttons als Buchungsbalken arbeitete (was auch superschnell ging im Vergleich zu VB.NET) hatte ich deshalb ein technisches Limit von 107 Zimmer. Mehr gingen sich nicht aus, da es sonst zu viele Buttons gewesen wären.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    dive26 schrieb:

    könnte ich mir ein DGV vorstellen

    DGV sieht leider für diesen Zweck zu altbacken aus.


    Hallo Roland,
    vielleicht solltest Du die Idee des DataGridViews nicht ganz beiseite schieben.
    Immerhin ist es eines der mächtigsten Controls überhaupt.
    Und an der Optik kann man ja feilen, darum habe ich dir mal ein kleines Beispiel drangehängt.
    Wenn ich wollte, könnte ich das Ausehen ganz nach Deinen hier gezeigten Screenshots modellieren - kein Problem!
    Und es ist wirklich das originale DataGridView, keine Fremdkomponente.

    Der Vorteil liegt auf der Hand.
    Ich befülle das DataGridView virtuell aus einer SQlite Datenbank und es ist völlig egal, wieviele Zimmer du darstellen möchtest.
    Nur das, was momentan angezeigt wird, ist auch geladen.
    Momentan sind es 1000 User in einer kompletten Jahrestabelle, also 1000x365=365.000 Zellen nur für die Tage (in Schaltjahren ein bissl mehr :) ).
    Und auch wenn ich 100.000 User nehme, wird sich nichts ändern, das ist der Witz daran.
    Scrollen in alle Richtungen geht flüssig und die Eintragungen kann ich bequem mit der Maus duch Klicken oder Ziehen erledigen.
    Und natürlich kann ich für jede Zelle auch Informationen einblenden, so wie du es zeigst.

    Sollte nur als Anregung dienen, damit Du das das DataGridView nicht ganz verteufelst ...

    @simpelSoft

    Vielen Dank für die Info. Hätte nicht gedacht, dass man mit DataGridViews so schöne Raster erstellen kann. Deine Oberfläche ist wirklich top! :thumbsup:
    Für einen Terminkalender optimal. Für meine Tischbuchungen leider nicht, da die "Buchungsbalken" immer in der Mitte des Tages beginnen und enden und nicht den kompletten Tag ausfüllen.
    Aber für spätere Anwendungen werde ich das DataGridView mal im Hinterkopf behalten.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    dive26 schrieb:

    @simpelSoft
    Für meine Tischbuchungen leider nicht, da die "Buchungsbalken" immer in der Mitte des Tages beginnen und enden und nicht den kompletten Tag ausfüllen.
    Aber für spätere Anwendungen werde ich das DataGridView mal im Hinterkopf behalten.


    Hallo Roland,
    schön, dass Du für später dass DataGridView nicht ausschließt :) .
    Sicher könnte man auch Deine Ansprüche umsetzen, mit dem entsprechenden (relativen) Mehraufwand natürlich.
    Man muss bei solchen Dingen ja immer bedenken - was ist es mir wert?
    Also, treibe ich den Aufwand mit einem DataGridView und erlange die komplette Unabhängigkeit zu irgendwelchen Limitierungen, oder reicht es mir, meinen eingeschlagenen Weg weiter zu gehen.
    In Deinem Fall, so wie ich es herausgelesen habe, ist der Schritt von VB6 zu .NET ja schon zielführend und das ist prima!

    Ich wünsche Dir viel Erfolg mit Deiner Hotelsoftware und deinen anderen Produkten.
    Habe mich ein bisschen auf Deiner Website umgesehen und muss sagen - du bist ein Macher, gefällt!