Heim > Artikel > Backend-Entwicklung > Codebeispiel für die Microsoft-Bug-.net-Komponente, auf die vom Container-Trap verwiesen wird
.net (C#) WinForm-Entwicklung, da es sich um ein visuelles Design handelt, sodass Sie eine erforderliche Komponente direkt manuell zur Designoberfläche hinzufügen können und .net diese Komponente automatisch initialisiert, einschließlich Attributeinstellungen usw., und hinzufügt Fügen Sie es der Designschnittstelle InitilizeComponent() hinzu, 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; }
.net (C#) WinForm-Entwicklung, da es sich um ein visuelles Design handelt, sodass Sie eine erforderliche Komponente direkt manuell zur Designoberfläche hinzufügen können und .net diese Komponenten automatisch initialisiert. einschließlich Eigenschafteneinstellungen usw. werden zu InitilizeComponent() hinzugefügt, und diese Komponente wird der entsprechenden übergeordneten Komponente hinzugefügt. All dies wird von .net automatisch erledigt.
Das Obige ist der Inhalt des Codebeispiels der Microsoft-Bug-.net-Komponente, auf die der Container verweist. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!