.net (C#) Développement WinForm, car il s'agit d'une conception visuelle, vous pouvez donc ajouter directement un composant requis à l'interface de conception manuellement, et .net initialisera automatiquement ce composant, y compris les paramètres d'attribut, etc., et ajoutera à l'interface de conception. InitilizeComponent(), et ce composant sera ajouté au composant parent correspondant. Tout cela est 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; }
Développement WinForm .net (C#), car il s'agit d'une conception visuelle, vous pouvez donc ajouter directement un composant requis à l'interface de conception manuellement, et .net initialisera automatiquement ces composants, y compris les paramètres de propriété, etc., sont ajoutés à InitilizeComponent(), et ce composant sera ajouté au composant parent correspondant. Tout cela est fait automatiquement par .net.
Ce qui précède est le contenu de l'exemple de code du composant Microsoft bug .net référencé par le conteneur. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !