Laden...

Tief ineinander geschachtelte Controls werden nicht dargestellt

Erstellt von Floschi vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.888 Views
Floschi Themenstarter:in
193 Beiträge seit 2007
vor 12 Jahren
Tief ineinander geschachtelte Controls werden nicht dargestellt

Hallo,

ich hab ein Control erstellt, in das dynamisch andere Controls integriert werden,
können.
Das Problem ist, dass ab einer Schachtelungstiefe, die am tiefsten geschachtelten Controls nicht mehr gezeichnet werden obwohl sei definitiv da sind da die Höhe der darüberliegenden Controls sich an der Anzhal der darin befindlichen Controls berechnet.
Auch beim Debuggen sind die Controls vorhanden.
Sind auch Visible

Wenn ich dann dem Beteich der nicht mehr richtig dargestellt wird eine weitere Control hinzfüge kommt die Fehlermeldung

Fehlermeldung:
Fensterhandle konnte nicht erstellt werden

Aber bei einer schachtelung von 10 Controls sollte der Prozess ja noch ein wenig Ressourcen frei haben.

Hat jemand schonmal eine Erfahrung gemacht woran es liegen kann dass die Controls irgendwann nciht mehr gezeichnet werden?

**:::{style="color: darkblue;"}If debugging is the process of removing bugs, then programming must be the process of putting them in.){darkblue}** Dijkstra
49.485 Beiträge seit 2005
vor 12 Jahren

Hallo Floschi,

naja, eine Schachtelungstiefe von 10 ist schon ungewöhnlich. Wozu brauchst du das? Und wieviel Controls hast du insgesamt direkt und indirekt in dem Form?

herbivore

1.820 Beiträge seit 2005
vor 12 Jahren

Hallo!

Bei sehr vielen Controls sollte man auch beachten, dass für jedes einzelne Element in Windows ein komplettes Fenster-Element angelegt wird. Und die in Windows dafür vorgesehene interne Liste ist begrenzt. D.h. selbst mit 16GB Arbeitsspeicher kann es passieren, dass man nach z.B. 500 Elementen die von dir beschriebenen Phänomene beobachten kann.

Nobody is perfect. I'm sad, i'm not nobody 🙁

Floschi Themenstarter:in
193 Beiträge seit 2007
vor 12 Jahren

Allein dieser Test zeigt schon dass relativ schnell mit dem Schachteln Schluß ist:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
           
        }

        private void Form1_Shown(object sender, EventArgs e)
        {
            this.WindowState = FormWindowState.Maximized;
            int index = 0;
            Control init = this;

            while (true)
            {
                try
                {
                    Panel p = new Panel();
                    p.Dock = DockStyle.Fill;
                    p.BorderStyle = BorderStyle.FixedSingle;
                    p.Padding = new System.Windows.Forms.Padding(1);
                    init.Controls.Add(p);
                    init = p;
                    index++;
                }
                catch (Win32Exception)
                {
                    this.Text = index.ToString();
                    break;
                }
            }
        }
    }

Scheint ein Problem von Windows zu sein.

**:::{style="color: darkblue;"}If debugging is the process of removing bugs, then programming must be the process of putting them in.){darkblue}** Dijkstra
5.299 Beiträge seit 2008
vor 12 Jahren

jo, interessiert mich mal: bei wievielen Controls issnda Schluß?

ok, habs probiert: 47 😉

Der frühe Apfel fängt den Wurm.

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo Floschi,

47 sollte normalerweise mehr als ausreichend sein. Wenn man mal davon ausgeht, dass ein Control mit Unter-Controls üblicherweise mindestens zwei davon hat, hätte man schon bei einer Tiefe von 10 insgesamt 2^10 = 1024 Controls und wäre damit schon über der von tom-essen Grenze für die Gesamtanzahl von Controls. Insofern wird man an die Grenze für die Schachtelung in der Praxis so gut wie nie kommen.

Du hast leider trotz Nachfrage noch nicht geschrieben, wozu du das brauchst. Also ist es schwierig, über Alternativen zu spekulieren.

herbivore

D
201 Beiträge seit 2007
vor 12 Jahren

ok, habs probiert: 47 😉

Mich hat das Thema auch mal ineteressiert, darum habe ich den Test auf meinem Rechner auch mal laufen lassen.
Bei mir sinds auch 47 Ebenen. Ist das jetzt ein generell gültiger Wert für .NET/WinForms oder hängt das vom RAM oder sonst irgendwas ab?
Bei Floschi z.B. scheint das Maximum ja schon bei 10 zu liegen, was ich für knapp bemessen halte. Man stelle sich mal vor, man hat eine Rahmenanwendung (1) mit einer DockingSuite (2), die evtl auch noch Panels enthält (3), packt da ein TabControl rein (4) und auf eine TabPage (5) tut man seine eigenen UserControls (6), die irgendwelche schönen Dinge anzeigen. Dann hätte man da bei einem Maximum von 10 ja gerade mal 4 Ebenen zur freien Verfügung.
Wenn 47 die Grenze ist, gebe ich euch recht, da wird man wohl nie hinkommen, zumindest würde das GUI dann auch sehr merkwürdig aussehen 😉

A
764 Beiträge seit 2007
vor 12 Jahren

Probier doch mal jeweils 10 verschiedene Controls mit UnterControls zu füllen. Vllt ist die mögliche Tiefe dann geringer.

U
1.688 Beiträge seit 2007
vor 12 Jahren

Hallo,

nach z.B. 500 Elementen

ist Dir dazu genaueres bekannt? Evtl. auch über das Wechselverhältnis zwischen Gesamtzahl und Schachteltiefe?

Vorkommen kann so etwas z. B. bei "aufwändigen" UserControls, die erst ineinander verschachtelt und dann noch dynamisch in großer Anzahl erzeugt werden. Dann kann's bei einem Update auch leicht passieren, dass nicht richtig aufgeräumt wird (Dispose vergessen).

Floschi Themenstarter:in
193 Beiträge seit 2007
vor 12 Jahren

Hallo

@Herbivore: Sorry hatte ich vergessen zu erwähnen.
Ich erstelle gerade ein Framework in dem man sozusagen boolsche Ausdrücke über eine Oberfläche sich zusammen stellen kann und wenn man diese beliebig tief schachteln will dann geht das scheinbar nciht, da ja nach 10 Ebenen Schluß ist.

Diese können auch wieder entfernt werden. (Hab auch ans Dispose gedacht (sogar rekursiv))

Bei dem kleinen Beispiel bei mir ist bei 49 Schluß, da aber meine Controls für die Boolschen Ausdrücke schon selber einige Panels enthalten, ist da dann bei 10 Schluß.

**:::{style="color: darkblue;"}If debugging is the process of removing bugs, then programming must be the process of putting them in.){darkblue}** Dijkstra
1.378 Beiträge seit 2006
vor 12 Jahren

In dem Fall solltest du eher das Design überdenken: Deine Hierachie kann mit Sicherheit von nur einem Control gezeichnet werden welches als Datenhintergrund eine Hierachie von boolschen Objekt-Beziehungen hat.

Lg, XXX

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo DFDotNet,

Dann hätte man da bei einem Maximum von 10 ja gerade mal 4 Ebenen zur freien Verfügung.

für mich sieht es so aus: Selbst wenn man - mit mit etwas Mühe - sechs Ebenen "verbrannt" hat, hat man immer noch locker und komfortabel vier weitere Ebenen. Wie schon gesagt, in der Praxis sollte das ausreichen. Wenn du wirklich mal einen konkreten praktischen Fall hast, bei dem du wie du es auch drehst und wendest nicht unter 10 Ebene kommst, können wir weiter reden. Bis dahin halte ich eine weitere theoretische Beschäftigung wenig sinnvoll.

Hallo Floschi,

Ich erstelle gerade ein Framework in dem man sozusagen boolsche Ausdrücke über eine Oberfläche sich zusammen stellen kann und wenn man diese beliebig tief schachteln will dann geht das scheinbar nciht, da ja nach 10 Ebenen Schluß ist.

An so einen Fall habe ich auch schon gedacht, aber ist es wirklich nötig die Controls zu schachteln? Reicht es nicht, sie für den Benutzer hübsch anzuordnen? Sollte es eigentlich.

Wobei ein boolscher Ausdruck mit mehr als 10 Schachtelungsebenen zwar denkbar ist, aber die meisten Benutzer eh vollkommen überfordern dürfte. 😃 Insofern wäre es vermutlich keine große Einschränkung, wenn man die maximale Tiefe begrenzen würde.

herbivore

D
201 Beiträge seit 2007
vor 12 Jahren

Hallo herbivore

Selbst wenn man - mit mit etwas Mühe - sechs Ebenen "verbrannt" hat,...

Ich denke dass man sich dafür in einer komplexeren Anwendung nicht viel Mühe geben muss.

...hat man immer noch locker und komfortabel vier weitere Ebenen. Wie schon gesagt, in der Praxis sollte das ausreichen. Wenn du wirklich mal einen konkreten praktischen Fall hast, bei dem du wie du es auch drehst und wendest nicht unter 10 Ebene kommst, können wir weiter reden.

Da gebe ich dir völlig recht. Ich habe bisher auch keinen Einsatzfall, wo ich auf 10 Ebenen komme.
Allerdings bin ich auch nicht so weit davon entfernt, dass ich es für alle Zeiten ausschließen kann.

Darum hatte ich gefragt, wovon die Grenze abhängt, da der Test bei mir ja auch 47 ergibt. Und das reicht 100%ig für alle vorstellbaren sinnvollen Anwendungsfälle aus.

1.820 Beiträge seit 2005
vor 12 Jahren

Hallo!

nach z.B. 500 Elementen

Das war natürlich nur ein fiktiver Wert.
Wieviel Platz genau in der internen Tabelle ist, kann ich nicht sagen, auch nicht, wie sich die Verschachtelung darauf auswirkt.

Mir ist das auch nur irgendwann mal aufgefallen, als in einer Anwendung massenweise Controls erzeugt und angezeigt werden sollten.

Evtl. kann man die o.g. Anwendung umschreiben, so dass mit verschiedenen Verschachtelungstiefen die maximal mögliche Anzahl an Controls ermittelt wird (gegebenenfalls auch mit Variationen, z.B. nur 2 Ebenen, aber mit jeweils x Controls, oder x Ebenen mit jeweils immer nur 2 Controls, ...)

Nobody is perfect. I'm sad, i'm not nobody 🙁