.NET Framework - Explication détaillée du piège des composants référencés par les conteneurs dans la technologie Winform

黄舟
Libérer: 2017-03-20 11:48:08
original
1477 Les gens l'ont consulté

 .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);
Copier après la connexion

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);                    
                }  
            }
     }
Copier après la connexion

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é.


.NET Framework - Explication détaillée du piège des composants référencés par les conteneurs dans la technologie Winform

Le code de test est le suivant. L'attente du test est de déplacer les 2 composants Button de ceci vers groupBox1. Mais le résultat est qu'il y a toujours le bouton 1 et que seul le bouton 2 a été déplacé vers groupBox1.

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;
        }
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal