Heim  >  Artikel  >  Backend-Entwicklung  >  .NET Framework – Detaillierte Erläuterung der Falle von Komponenten, auf die von Containern in der Winform-Technologie verwiesen wird

.NET Framework – Detaillierte Erläuterung der Falle von Komponenten, auf die von Containern in der Winform-Technologie verwiesen wird

黄舟
黄舟Original
2017-03-20 11:48:081468Durchsuche

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


.NET Framework – Detaillierte Erläuterung der Falle von Komponenten, auf die von Containern in der Winform-Technologie verwiesen wird

Der Testcode lautet wie folgt: Die Erwartung des Tests besteht darin, 2 Button-Komponenten von dieser nach GroupBox1 zu verschieben. Das Ergebnis ist jedoch, dass darin immer noch Button1 vorhanden ist und nur Button2 in GroupBox1 verschoben wurde.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn