Laden...

Warum erzeugt der Designer Code kein Controls.Add() in InitializeComponent()? [==> tut er]

Erstellt von gelöschtem Konto vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.594 Views
Gelöschter Account
vor 9 Jahren
Warum erzeugt der Designer Code kein Controls.Add() in InitializeComponent()? [==> tut er]

Ich habe eine etwas komische Frage bzgl. des Visual Studio Designers/Code Generators.

Angenommen ich möchte zur Laufzeit einen ordinären Button einer WindowsForms Instanz hinzufügen. Dann mache ich das ganz schnell mittels myForm.Controls.Add(new Button()); Ich muss also nur meine Control Instanz dem Control Container hinzufügen, im Gedankenbeispiel ein Formular.

Bemerkenswerter Weise tut die InitializeCompoment Methode die durch den VS Designer generiert wird das aber genau nicht. Hier werden alle Controls erstellt, korrekt initialisiert usw. aber nirgendwo ein Hinweis darauf das die erstellten/generierten Childs dem Container mittels Add(...) hinzugefügt werden. Nach der Erstellung sind sie aber voll verfügbar. Wie geht das??? Warum muss ich Controls.Add(...) aufrufen und IntializeComponent() muss das nicht ?

Hier läuft irgendeine Magie ab die ich nicht verstehe.
Für sachdienliche Hinweise...bitte danke*

C
40 Beiträge seit 2011
vor 9 Jahren

Hallo,

das beschriebene Verhalten kann ich nicht nachvollziehen. Die <Name>.Designer.cs Datei enthält genau diese Definitionen.
IntializeComponent() enthält idR gegen Ende die Form Definitionen und auch die Controls.Add() Aufrufe.

Gruß Chris

Gelöschter Account
vor 9 Jahren

Das kann ich jetzt erstmal nur verwundert so stehen lassen und anmerken das es sich in meinem speziellen Fall nur um abgeleitete UserControls handelt. Ich glaube es bringt nix wenn ich hier jetzt irgendwelchen Designer Code poste.

BTW: Ich habe das Szenario nun mit den Standard Controls nachgestellt, aber mit dem ursprünglichen Ergebniss, die Add Methode der Controls Auflistung wird nicht in InitializeComponent() angesprochen (VS 2010 Premium, .NET 4)

Hallo Chris360

Poste doch mal bitte deinen Designer Code. Ich stelle deine Aussage insofern in Abrede weil mir all meine Ergebnisse und Arbeitskollegen das Gegenteil bescheinigen.

771 Beiträge seit 2009
vor 9 Jahren

Hi,

klar wird dort Controls.Add aufgerufen (aber nicht bei dem Code für die einzelnen Controls sondern bei den Form-Properties ganz unten):


			// 
			// Form1
			// 
			this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
			this.ClientSize = new System.Drawing.Size(292, 266);
			this.ContextMenuStrip = this.contextMenuStrip;
			this.Controls.Add(this.buttonSave);
			this.Controls.Add(this.textBox);
			this.Controls.Add(this.checkedListBox);
			this.Controls.Add(this.menuStrip);
			// ...

344 Beiträge seit 2006
vor 9 Jahren

Hallo,
hier mein Code aus dem Designer:


 // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(284, 261);
            this.Controls.Add(this.button2);
            this.Controls.Add(this.button1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);

Wenn mal eine Antwort weiss sind ander immer schneller. 😉

Gruss Lothi

49.485 Beiträge seit 2005
vor 9 Jahren

Hallo Sebastian.Lange,

auch ich gehe davon aus, dass der Designer immer einen Aufruf von Controls.Add bzw. eine Äquivalent dazu erzeugt.

Ein Aufruf von Controls.Add muss allerdings nicht direkt auf die Initialisierung des Controls folgen, sondern kann (viel) weiter hinten stehen.

Soweit ich mich erinnere hat der Designer zumindest früher statt vieler einzelner Adds einen Aufruf von Controls.AddRange am Ende von InitializeComponent erzeugt.

Denkbar wäre auch, dass statt parent.Controls.Add (child) die Anweisung child.Parent = parent verwendet wird, die genau dasselbe bewirkt. Soweit ich weiß, benutzt das der Designer aber nicht. Doch wenn wirklich kein Add oder AddRange zu finden ist, würde ich danach suchen.

herbivore

C
40 Beiträge seit 2011
vor 9 Jahren

Mein Designer Code entspricht den geposteten.
Auch wenn ich eine Klasse händisch von Form erben lasse und diese im Designer anzeige und ändere wird die IntializeComponent() direkt in jene Klasse, mit dem beschriebenen Aufbau, eingefügt (da ja keine *.Designer.cs hierbei angelegt wird).

Gruß Chris

S
145 Beiträge seit 2013
vor 9 Jahren

Wenn ich mich gerade nicht irre gibt es ja ein ControlAdd Ereignis (oder so ähnlich).
Ich würde das einfach mal abonnieren und dann mal im CallStack schauen wos herkommt.