Autor Beitrag
kevinkeegan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27

Win 7 Prof., Win XP Prof
C# (VS 2010 Premium), SQL, PLS/SQL
BeitragVerfasst: Mo 05.12.11 15:13 
Hallo,

ich habe ein Projekt mit einer Windows Form und rund 100 Controls auf einem TabControl erstellt. Mein Ziel ist es, dass diese Form durch eine Anwendungskonfiguration mehrere TabPages anzeigen kann und zwar mit exakt der gleichen Oberfläche wie TabPage1. Es kann also sein, dass nur ein TabPage angezeigt wird, es kann aber auch sein, dass 6 TabPages (mit insgesamt ca. 600 Controls) angezeigt werden müssen. Jetzt möchte ich aber nur diese 100 Controls designen und alle weiteren (auf den anderen TabPages) sollen sich zur Laufzeit generieren und bis auf einen (TabPage-) Index als Suffix im Namen nicht unterscheiden.

Wie entwickelt man dieses Vorhaben?
Wo und wie verwaltet man die zu generierenden Controls?
Wie referenziere ich Controls in Methoden, die zur Designzeit nicht vorhanden sind?
...

Danke im voraus!
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 05.12.11 15:29 
Zitat:
Wie entwickelt man dieses Vorhaben?
Wo und wie verwaltet man die zu generierenden Controls?


Designe das ganze 1mal als UserControl und zeige eine Instanz dieses UserControls auf einer Tabpage an.

Zitat:
Wie referenziere ich Controls in Methoden, die zur Designzeit nicht vorhanden sind?


Gar nicht. Übergebe nur den Inhalt deiner Controls (Text, Checkbox-Zustand etc. je nach Control) an deine Methoden. Auf die Controls solltest du wenn möglich nur in den Events die an den Controls hängen zugreifen, dort den benötigten Inhalt aus den Controls auslesen und an die Methoden weiterreichen die irgendwas mit diesen Daten anstellen.

Für diesen Beitrag haben gedankt: kevinkeegan
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 05.12.11 18:26 
Hallo,

100 Controls sind eigentlich schon das Maximum bei einer Windows-Form Anwendung. Wenn du dann auch noch 6 mal soviele erzeugen willst, dann leidet zum einen die Performance sehr stark (beim Wechsel zwischen den Tabs) als auch, daß Windows irgendwann die Handles ausgehen ("Konnte kein Window-Handle erzeugen!").

Wenn es sich um Listen handelt, dann solltest du entsprechende Listen-Controls (z.B. DataGridView oder ListView mit View = Details) verwenden. Eine andere Möglichkeit besteht darin, die Elemente selber zu zeichnen (im Paint-Ereignis), z.B. wenn es nur zur Anzeige dient (z.B. als Label- oder PictureBox-Ersatz).
kevinkeegan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27

Win 7 Prof., Win XP Prof
C# (VS 2010 Premium), SQL, PLS/SQL
BeitragVerfasst: Di 06.12.11 14:32 
Danke für die Antworten! Wo ist der Danke-Knopf?

Ich habe schon ein paar UserControls selbst erstellt, warum ich bei dieser Aufgabe nicht selbst darauf gekommen bin, weiss ich auch nicht. Auf jeden Fall hat dieser Tip schon mal sehr gut funktioniert. Ich lese meine Konfiguration aus und erstelle in Abhängigkeit dieser n Instanzen meines UserControls in einer Liste (this._guis = new List<MbGui>(this._tabs.Count)) und füge diese dann den n TabPanels hinzu. Ist das von der Methodik ok?

Die Aussage mit den 100 Controls als Maximum macht mir etwas Sorge. In diesem (Projekt-) Fall sind es TextBoxen, CheckBoxen, Buttons und Labels. In einem nächsten Projekt können es locker mehr werden, was macht man dann? Hat diese Aussage auch Bestand, wenn ich sie zusammen als ein UserControl s.o. anzeige? Bezieht sich diese Aussage auf ein ganzes Projekt oder nur auf eine Windows Form? Ich muss sagen meine Anwendung läuft mit 6 TabPanels noch sehr flüssig und belegt lt. TaskManager knapp 29MB, allerdings noch ohne Datenanbindung.

MfG
kevinkeegan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27

Win 7 Prof., Win XP Prof
C# (VS 2010 Premium), SQL, PLS/SQL
BeitragVerfasst: Di 06.12.11 14:39 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:

Eine andere Möglichkeit besteht darin, die Elemente selber zu zeichnen (im Paint-Ereignis), z.B. wenn es nur zur Anzeige dient (z.B. als Label- oder PictureBox-Ersatz).


Kannst du das bitte kurz erläutern, was genau meinst du mit "selber zeichnen"? Im Moment habe ich zu jeder TextBox ein Label als Überschrift, in dem ich dann später auch in eine andere Sprache übersetzen will/muss. Wie würdest du das machen?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 06.12.11 18:52 
Hallo,

im myCSharp-Forum gibt es dazu einen guten Artikel: [Tutorial] Zeichnen in Windows-Forms-Programmen (Paint/OnPaint, PictureBox)

Könntest du denn mal einen Screenshot posten, damit ich mir das mit den 100 Controls vorstellen kann? Wäre denn nicht ein DataGridView angebrachter?
Windows hat nur eine begrenzte Anzahl von Handles zur Verfügung (für alle Programme zusammen!), und irgendwann kommt dann die leidige Fehlermeldung.
Ich mußte eines meiner letzten größeren Projekte auch umbauen, als ich mehrere Tabs (und dadrin dann auch nochmals welche) mit Dutzenden von Controls hatte. Ich habe dann bei jedem Tabwechsel die Controls neu erzeugen lassen (und die der alten Tabpage gelöscht d.h. 'disposed') und mir jeweils die Daten nur intern gemerkt.

P.S: Der "Danke"-Knopf wird aktiviert, wenn du "Ajax" in den Forums-Einstellungen aktivierst.

Für diesen Beitrag haben gedankt: kevinkeegan
kevinkeegan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27

Win 7 Prof., Win XP Prof
C# (VS 2010 Premium), SQL, PLS/SQL
BeitragVerfasst: Mi 07.12.11 15:33 
Hallo,

den genannten Artikel habe ich mir angeschaut und auch die Beispielprogramme zum Laufen gebracht. Aber geht es dabei nicht grundsätzlich nur um das Zeichnen von Grafik-Objekten wie Linien, Rechtecke etc.? Wo ist der Zusammenhang zu meinem UserControl, bestehend aus ca. 100 Controls?

Bei der Anwendung handelt es sich um eine Eingabemaske (Betriebsdatenerfassung), die Informationen (numerische Werte, Schlüssel, Zeitangaben etc.) in TextBoxen aufnimmt und in einer Datenbank speichert und aus mehreren ReadOnly-TextBoxen, die nur Informationen anzeigen. Dazu ein paar Button für Funktions- und Form-Aufrufe und Labels, die die Inhalte der TextBoxen beschreibt. Es ist zwar kein Staatsgeheimnis, aber ich habe kein "gutes Gefühl" dabei hier einen Screenshot reinzustellen (evtl. Betriebgeheimnisse!?).

Alle Daten in einem DataGridView eingeben zu lassen, kann ich mir nicht wirklich vorstellen und wäre meiner Meinung nach auch sehr benutzerunfreundlich.

Was genau ein "Handle" ist und wieviel Windows verkraftet bzw. diese überhaupt limitiert sind, weiss ich gar nichts drüber. Was ich mich nur direkt frage ist (wenn zuvor genanntes zutrifft):
1. Wie soll eine MDI-Anwendung funktionieren, die viele Forms (Childs aus dll-Dateien) aufrufen und verwalten kann, wo in Summe viele Hundert Controls zusammen kommen?
2. Wie funktioniert das, wenn die MDI-Anwendung auf einem Terminalserver mit sagen wir 10 User gleichzeitig läuft?

MfG
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 07.12.11 16:04 
Zitat:
Was genau ein "Handle" ist und wieviel Windows verkraftet bzw. diese überhaupt limitiert sind, weiss ich gar nichts drüber. Was ich mich nur direkt frage ist (wenn zuvor genanntes zutrifft)


OS abhängig. Üblicherweise kannst du von max. 10000 GDI Handles ausgehen die eine Session verträgt. Danach sind alle Anwendungen betroffen und können sich nicht mehr richtig neu zeichnen.
Hat glaube ich jeder schonmal gesehen wenn die Taskbar sich nicht mehr zeichnet oder irgendeine Anwendung nur noch weiße Boxen zeigt wenn man ein Menü versucht zu öffnen. Denn Verbrauch von GDI Handles kannst du im Taskmanager verfolgen.

Zitat:
1. Wie soll eine MDI-Anwendung funktionieren, die viele Forms (Childs aus dll-Dateien) aufrufen und verwalten kann, wo in Summe viele Hundert Controls zusammen kommen?


Ich kenne keine Anwendung (außer schlecht geschriebene Line of Business Anwendungen) die sowas versuchen. Nicht nur Windows ist irgendwann mit so vielen Controls überfordert der User schon viel früher.

Zitat:
2. Wie funktioniert das, wenn die MDI-Anwendung auf einem Terminalserver mit sagen wir 10 User gleichzeitig läuft?


Das sind dann 10 unabhängige Sessions mit ihren eigenen Limits.