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

  • VB.NET
  • .NET 4.5

Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von dive26.

    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

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

    Neu

    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, 22 mal angesehen
    • 21112019102241.jpg

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

      1,54 MB, 3.440×1.440, 19 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.

    Neu

    @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).
    VB-Fragen über PN / Konversation werden ignoriert!

    Neu

    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

    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.