.net (C#) WinForm-Entwicklung, da es sich um ein visuelles Design handelt, können Sie eine erforderliche Komponente direkt manuell zur Designoberfläche hinzufügen, und .net initialisiert diese Komponente automatisch, einschließlich Attribute-Einstellungen usw. werden zu InitilizeComponent() hinzugefügt, und diese Komponente wird der entsprechenden übergeordneten Komponente hinzugefügt. All dies wird von .net automatisch erledigt.
In einigen Szenarien müssen wir jedoch manuell Code schreiben, um den übergeordneten Container zu ändern, zu dem die Komponente gehört. Beispielsweise gehörten einige Komponenten ursprünglich zum übergeordneten Container A, wir möchten diese Komponenten jedoch an den übergeordneten Container B anpassen. Zu diesem Zeitpunkt tritt ein interessantes Problem auf.
Die folgenden 3 Komponenten befanden sich ursprünglich darin:
this.Controls.Add(this.operRateUC); this.Controls.Add(this.personProductUg); this.Controls.Add(this.procedingPanel);
Ich möchte diese 3 Komponenten an die Komponente adjustPanel anpassen. Wie im folgenden Code gezeigt:
private void moveToAdjustPanel() { //AdjustablePanel是一个Control类 AdjustablePanel adjustPanel = new AdjustablePanel(); foreach (Control ultraControl in this.Controls) { if (ultraControl.GetType() == typeof(UltraGrid) || ultraControl.GetType() == typeof(UltraChart) || ultraControl.GetType() == typeof(Panel)) { adjustPanel.Controls.Add(ultraControl); } } }
Diese Methode zum Stapelverschieben von Komponenten in eine andere übergeordnete Komponente schlägt fehl.
Jedes Mal, wenn adjustPanel eine neue Komponente hinzufügt, ändert sich die Komponente von this.Controls, und es wird keine Ausnahme ausgelöst, dass der foreach-Iterator geändert wird . Ich weiß nicht, ob es sich hierbei um einen Microsoft-Fehler handelt.
Auf bbs.csdn.net um Hilfe gebeten und geantwortet. Die meisten Leute dachten, dass „foreach traversal“ einen Fehler melden würde, aber tatsächlich hat der Compiler keine Ausnahme ausgelöst. Ich habe einen einfachen Test mit dem Compiler erneut durchgeführt. Dabei stellte ich fest, dass der foreach-Durchlauf keinen Fehler meldete, ich konnte jedoch nicht das gewünschte Ergebnis erzielen.
Seltsamer Punkt:
Der foreach-Iterator wurde geändert. Warum meldet er keinen Fehler? ? ?
Warum wird nur Button2 nach GroupBox1 verschoben? ? ?
public Form1() { InitializeComponent(); moveButtonsToGroupBox(); //controlNames的结果为{groupBox1,button1} var controlNames = showAllChildControls(this); //controlNamesInGroup的结果为{button2} var controlNamesInGroup = showAllChildControls(this.groupBox1); } /// <summary> /// 移动位于Form上的按钮到GroupBox中 /// </summary> private void moveButtonsToGroupBox() { foreach(Control c in this.Controls) { if (c.GetType() == typeof(Button)) this.groupBox1.Controls.Add(c); } } /// <summary> /// 展示c控件的所有子组件的Name /// </summary> /// <param name="c"></param> /// <returns></returns> private List<string> showAllChildControls(Control c) { if (c == null) return null; List<string> controlNames = new List<string>(); foreach(Control chl in c.Controls) { controlNames.Add(chl.Name); } return controlNames; }
Das obige ist der detaillierte Inhalt von.NET Framework – Detaillierte Erläuterung der Falle von Komponenten, auf die von Containern in der Winform-Technologie verwiesen wird. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!