Meinungsfrage: TabControl mit TabPages oder lieber mehrere Forms, oder als MDI?

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

Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von VB1963.

    Meinungsfrage: TabControl mit TabPages oder lieber mehrere Forms, oder als MDI?

    Gute Nacht Leute ;)..

    Ich wollte euch mal wieder nach eurer Meinung fragen.

    Welches Control/welche Vorgehensweise bei der Strukturierung der Benutzeroberfläche, würdet ihr in einer Anwendung mit verschiedenen Funktionsbereichen/Kategorien (Lager-Mangement, Lieferanten-Mngmt., etc.) bevorzugen ?:

    - TabControl mit TabPages..
    - Formen allerdings als MDI Childs, daher mit einem Hauptfenster als Parent
    - verschiedene Formen die einzelnd aufgerufen werden

    Die ganzen Geschichten haben für mich auf den ersten Blick verschiedene Aspekte:

    TabControl mit Tabpages:
    • Der Code füllt sich schnell und wird ziemlich viel auf einer Form
    • Die Variablen sind alle ich sag mal "lokal" zu erreichen (könnte positiv und negativ sein, sortierung wird an der Masse auch mit passender Benennung schwieriger), oder man könnte sagen, ja gut ich hab se alle beisammen :)!
    • Nicht so viel gefummel finde ich, bei Mehrsprachigkeit keine separaten Formen die man einstellen muss
    • .. ?
    MDI Form + Childs:
    • Getrennter übersichtlicher Code
    • Jenachdem wie man Punkt 2 von oben auslegen möchte..
    • Viel gefummel wie ich finde (Localizable für jede Form) etc..
    • .. ?
    Einzelne Forms:
    • Fällt meiner Meinung nach ganz weg^^...

    Habt ihr andere Ideen/Vorschläge? Was bevorzugt ihr? Warum?
    Lasst es mich wissen^^..

    Danke sehr :)! :thumbsup:
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..

    Rootbob91 schrieb:

    bevorzugt
    Das lässt sich nicht so einfach sagen.
    Ich hab ein Projekt Bildverarbeitung, da sind die einzelnen Bilder als Quasi-MDI in einzelnen Dialogen, damit ich sie außerhalb vom Hauptfenster positionieren kann.
    In einem Bearbeitungsdialog sind auf einzelnen Tabs zusammengehörige Operatoren / Operatorengruppen zusammengefasst.
    -----
    Der Hauptaspekt ist, dass 2 nichtmodale Dialoge / MDI-Fenster gleichzeitig sichtbar sind, 2 Tabs eines TabControls jedoch nie. Unter diesem Gesichtspunkt musst Du Deine Funktionalität gruppieren.
    Du musst Dir eine das 1. Release definierende Liste aller Funktionen machen und die dann nach Deinen Vorstellungen zusammenfassen. Da wird es Funktionen geben, die einander benötigen (==> MDI) und die einander ausschließen (==> Tab).
    Du wirst wohl beides brauchen.
    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!
    Ich hab noch nie eine vernünftige MDI gesehen, wo verschiedene Childforms verschiedene Funktionsbereiche abdeckten.
    In meiner Vorstellung ist MDI "Multi-Document-Interface", also wie Word früher war, also dass viele Dokumente geöffnet sein konnten, aber in Fenstern einheitlichen Typs.
    Aber ich will mich da nicht drauf versteifen, vlt. kann ein MDI für Funktionsbereiche ja auch ganz hübsch sein.

    Zur Ausdifferenzierung einer TabControl-Lösung kann man pro Funktionsbereich/Tab ein UserControl entwerfen. Programm-Architektonisch entspricht das sehr genau verschiedenen MDIChild-Forms, nur eben ein ucl ist kein eigenes Form, sondern wird als Control ins Mainform eingebettet.

    Und auch die Option modaler Dialoge im Blick behalten: Damit werden Funktionsbereiche designed, die zeitlich ausschließlich zu bearbeiten sind, während man bei Tab/MDI ja eine Arbeit liegenlassen kann und zur anneren hopfen und so.
    Also bei mir wäre es wahrscheinlich so, dass die einzelnen Managements nicht gleichzeitig bearbeitet/benutzt werden können. Ich bin da der Meinung: "User schließ das mal bitte erst ab, bevor du was neues anfängst" - plump gesagt. Also kein Cross-Working.

    Ich hatte wohl bisher gemerkt (also bei vergangenen Tests etc.), dass ein TabControl wenn es z.B. gedockt ist wesentlich flacker-anfälliger als ein MDI + Childs ist.
    Wären halt schon größere Eingabe-Masken, daher :/..

    Das ist dann ein bisschen doof, wenn ich jetzt die ganze Arbeit machen würde und später wieder umbauen müsste weils flackert.
    (DoubleBuffered etc. alles drin gewesen, hat nicht wirklich viel meiner Meinung nach so gut wie gar nichts gebracht)..
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..

    Rootbob91 schrieb:

    dass ein TabControl wenn es z.B. gedockt ist wesentlich flacker-anfälliger als ein MDI + Childs ist.
    echt - ist das so?
    Ist mir nie aufgefallen (naja - mach ja auch wenig damit) Hast du ein Beispiel dafür?
    Weil eiglich müsste es aufs selbe rauskommen, ob nun ein MDIChild gedockt ist oder ein TabControl.

    Aber wenn du sagst: "User, mach das und das erstmal fertig" - dann wäre es ja eh eine Angelegenheit modaler Dialoge, also weder TabControl noch Mdi.
    Ja da habe ich leider soweit die Erfahrung gemacht, ich versuch mal auf die Schnelle ein Beispiel zu zaubern.

    Bei dem TabControl würde ich dann hingehen, die einzelnen Tabs mit den benötigten Controls je Richtung (also ob für Lageverwaltung etc..) bestücken, dann die globalization einrichten und gut ist.
    Dann finde ichs halt cool, dass ich per Button das momentan benötigte Tab anzeigen lassen kann, ohne mit anderen Fenstern (in Anführungszeichen..) arbeiten zu müssen, keine Ahnung^^.. Also wenn ich die Sache mit dem Flackern vermeiden kann, dann werde ich definitiv das TabControl nehmen. Natürlich werden hier und da mal modale Dialoge zu dem jeweiligen Tab und dessen Bearbeitung geöffnet, aber das ist ja nicht weiter schlimm, also passt ja.

    Da fällt mir gerade ein.. Kann ich die TabHeader eigentlich im Paint so überschreiben, dass diese statt Text z.B. ein Bild haben?
    Dann müsste ich keine TabHeader ausblenden und dann mit Buttons navigieren, sondern die TabHeader selber könnten Buttons sein.

    Wie ich z.B. ein "schließen-Knopf" in die TabHeader einfüge weiß ich, gibt es allerdings auch die Möglichkeit das komplett zu verändern?
    Statt Text und dem X (als Beispiel) einen kompletten Header bestehend nur aus einem Image/dem Button + Image?
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    Okay, da habe ich schonmal die Möglichkeit die TabPages einzelnd zu bearbeiten, ist schonmal sehr schön :)!

    Wie sieht es sonst mit der Button/Image-Header Geschichte aus?
    Ich kann mich erinnern, dass ich mal auf einen Thread gestoßen war, der erklärte wie man das TabControl, bzw die Anwahl der Pages durch Buttons im Header ersetzt.
    (Ich hoffe ihr versteht wie ich das meine)^^..
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    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!
    Hey Rod

    Das wäre die Variante die ich vorher immer benutzt hatte, gäbe es da nicht eine Möglichkeit die Buttons mit dem TabControl verschmelzen zu lassen im Sinne von:

    Man nehme da TabControl, überschreibe das Paint Event der TabPages (oder da wo auch immer die TabHeader mit gezeichnet werden) und nehme statt der Schrift (z.B. "TabPage1") ein Image, damit das ganze wie ein Button als TabHeader aussehen würde.

    Ist sowas möglich?
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..

    Rootbob91 schrieb:

    Ist sowas möglich?
    Gugst Du hier.
    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!
    Schaue ich mir sofort an, hier noch das Flacker Sample:

    Danke schonmal!

    Ps: DoubleBuffered habe ich jetzt vergessen einzustellen aber wird jetzt auch nicht den Braten fett machen..

    Und von der TabControl-Klasse hatte ich auch schonmal eine Ableitung geschrieben + DoubleBuffer.
    Achja und wenn ihr das Projekt teste, bitte jeweils auf die 2 Seite der TabControls gehen, bei den mehreren DataGrids isses am ekelhaftesten. :/
    Gerade die sind wichtig und da bekomm ichs nicht besser hin..
    Dateien
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    Ich kann es gerade nicht testen, aber ich habe bei mir TabControl mt 3 Pages, auf jedem ein gebundendes DataGridView plus viele andere Controls, teilweise zur Laufzeit erstellt (weil die Daten sich teilweise in der Laufzeit ändern), bei mir flackert GAR nichts.

    Das Einzige, was geflackert hatte, war DataRepeater, den habe ich dann rausgeschmissen, weil er mit der Datenmenge, die ich habe, nicht umgehen konnte. Habe dann alles manuell gemacht (gebunden und ungebunden, je nachdem).
    Warst du unter diesem Punkt (siehe Bild)?
    Das ist die rote Zone, welche ekelhaft flackert, alles andere soweit auch nicht bei mir, aber eben die Page wo die ganzen Datagrids sind, ist wichtig:

    Ps: Guten Tag liebe Sonne ;)..
    Ich hatte das vorher im anderen Projekt auch via Code hinzugefügt, ändert nur gar nichts, ist ja eh gehoppst und gesprungen wie mans macht.

    Wenn ihrs testen wollt, bitte einmal die Form aus dem Bild so aufmachen und dann die Form vergrößern/verkleinern.

    PS: YESSS, danke Rod, habs Mithilfe des Codes des MSDN hinbekommen.
    Halt das DrawString durch DrawImage ersetzt und die Reiterkopf-Größe an das Bild angepasst.

    Ich denke ich poste später mal ein Beispiel und dann müsste ich noch gucken wie das ganze nicht mehr so Windows 98 like aussieht^^..
    Bilder
    • flacker.jpg

      50,99 kB, 1.016×762, 145 mal angesehen
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    Ich bin ein Freund von MDI.
    Ich finde das der Code so übersichtlicher zu gestalten ist.
    Außerdem läuft bei mir gefühlt das Tool mit MDI flüssiger, das ist aber gefühlt nicht gemessen :)

    Meinen Anwendern wäre es egal, Hauptsache die richtigen Daten stehen an der richtigen Stelle :)
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    Ich habe bei einem anderen Projekt die Datagridviews auch per Code hinzugefügt gehabt..
    Naja ist auch Wurst.

    Das Graue sind die einzelnen Datagrids, die sich nach Formgröße anpassen sollen (mit Hilfe eines TableLayoutPanels).
    Da fängts dann auch an zu flackern wie bescheuert.

    @Schamash:
    Ja das Gefühl habe ich soweit auch, allerdings ist das nur besser aber nicht optimal :)..
    Ist dann doof wenn der User sich denkt "Mein Jott ne, watt hängt der Scheiß denn so.."^^..
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..

    Rootbob91 schrieb:

    Warst du unter diesem Punkt (siehe Bild)?
    Das ist die rote Zone, welche ekelhaft flackert, alles andere soweit auch nicht bei mir, aber eben die Page wo die ganzen Datagrids sind, ist wichtig:


    Ja natürlich war ich auch dort. So umfangreich, dass man sich verlaufen könnte ist das Projekt ja nicht.
    Beim resize ist schon ein nicht schöner Effekt vorhanden, aber eben nur während der Größenveränderung und das wenige empfinde ich auch als normal.
    Allerdings habe ich noch nirgends 35 DGVs auf einer Seite gesehen. Das ist schon extrem. Aber von dem Moment der Größenänderung selbst mal abgeshen:
    Da flackert nichts!

    Nachtrag:
    Meine GForce GTX 460 ist auch schon recht betagt und gehört sicher nicht zu den schnellen Grafikkarten (schon laaaaaange nicht mehr), aber wie gesagt, nicht mal mit der habe ich Probleme bei den DGVs auf dem TabControl.
    Der Effekt ist übrigens auf einer Form ohne TabControl bei mir identisch. Kein Flackern.

    Rootbob91 schrieb:

    Ich habe bei einem anderen Projekt die Datagridviews auch per Code hinzugefügt gehabt..


    Das ist doch egal. Ich meinte, dass bei mir DataRepeater flackerte. Und den habe ich dann per Hand nachprogrammiert, mit UserControls.

    Rootbob91 schrieb:

    Das Graue sind die einzelnen Datagrids, die sich nach Formgröße anpassen sollen (mit Hilfe eines TableLayoutPanels).
    Da fängts dann auch an zu flackern wie bescheuert.

    Dann ist es eher ein Problem vom TableLayoutPanel? Genau das Gleiche funktioniert aber im MDI?