Maison > Article > développement back-end > .NET Framework - Explication détaillée du piège des composants référencés par les conteneurs dans la technologie Winform
.net (C#) Développement WinForm, car il s'agit d'une conception visuelle, vous pouvez directement ajouter manuellement un composant requis à l'interface de conception, et .net initialisera automatiquement ce composant, y compris Les attributs paramètres, etc., sont ajoutés à InitilizeComponent(), et ce composant sera ajouté au composant parent correspondant. Tout cela se fait automatiquement par .net.
Cependant, dans certains scénarios, nous devons écrire du code manuellement pour modifier le conteneur parent auquel appartient le composant. Par exemple, certains composants appartenaient à l'origine au conteneur parent A, mais nous souhaitons ajuster ces composants au conteneur parent B. À ce stade, un problème intéressant se pose.
Les 3 composants suivants se trouvaient à l'origine dans ceci :
this.Controls.Add(this.operRateUC); this.Controls.Add(this.personProductUg); this.Controls.Add(this.procedingPanel);
Je souhaite ajuster ces 3 composants au composant adjustPanel. Comme indiqué dans le code suivant :
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); } } }
Cette méthode de déplacement par lots de composants vers un autre composant parent échoue.
Chaque fois qu'adjustPanel ajoute un nouveau composant, le composant de this.Controls changera, et aucune exception selon laquelle l'itérateur foreach est modifié ne sera levée. Je ne sais pas s’il s’agit d’un bug de Microsoft.
Publié sur bbs.csdn.net pour obtenir de l'aide et répondu. La plupart des gens pensaient que foreach traversal signalerait une erreur, mais en effet le compilateur n'a généré aucune exception. J'ai réexécuté le compilateur et effectué un test simple. En conséquence, j'ai constaté que le parcours foreach ne signalait pas d'erreur, mais je n'ai pas pu obtenir le résultat souhaité.
Point étrange :
L'itérateur foreach est modifié, pourquoi ne signale-t-il pas d'erreur ? ? ?
Pourquoi seul le bouton 2 est-il déplacé vers groupBox1 ? ? ?
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; }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!