ホームページ  >  記事  >  バックエンド開発  >  コンテナ トラップによって参照される Microsoft bug .net コンポーネントのコード例

コンテナ トラップによって参照される Microsoft bug .net コンポーネントのコード例

黄舟
黄舟オリジナル
2017-03-04 11:11:341265ブラウズ

.net (C#) WinForm 開発では、ビジュアルデザインなので、必要なコンポーネントをデザインインターフェースに直接手動で追加できます。.net はこのコンポーネントをプロパティ設定なども含めて自動的に初期化し、InitilizeComponent に追加します。 ()、このコンポーネントは対応する親コンポーネントに追加されます。これらはすべて .net によって自動的に行われます。

ただし、シナリオによっては、コンポーネントが属する親コンテナを変更するコードを手動で記述する必要があります。たとえば、一部のコンポーネントはもともと親コンテナ A に属していましたが、これらのコンポーネントを親コンテナ B に調整したいとします。このとき、興味深い問題が発生します。

次の 3 つのコンポーネントは元々この中にありました:

            this.Controls.Add(this.operRateUC);
            this.Controls.Add(this.personProductUg);
            this.Controls.Add(this.procedingPanel);

はこれら 3 つのコンポーネントを adjustPanel コンポーネントに調整したいと考えています。次のコードに示すように:

     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);                    
                }  
            }
     }

コンポーネントを別の親コンポーネントにバッチ移動するこの方法は失敗します。
adjustPanel が新しいコンポーネントを追加するたびに、this.Controls のコンポーネントが変更され、 foreach イテレーターが変更されたという例外はスローされませんこれが Microsoft のバグかどうかはわかりません。

ヘルプを求めて bbs.csdn.net に投稿すると、ほとんどのユーザーが foreach トラバーサルでエラーが報告されると考えていましたが、コンパイラが例外をスローしなかったのは事実でした。コンパイラを使用して簡単なテストを再実行した結果、foreach トラバーサルではエラーが報告されませんでしたが、期待した結果が得られませんでした。


コンテナ トラップによって参照される Microsoft bug .net コンポーネントのコード例

テストコードは次のとおりです。テストの目的は、2 つの Button コンポーネントを groupBox1 に移動することです。しかし、結果として、この中にはまだ button1 が存在し、button2 だけが groupBox1 に移動されています。


奇妙な点:

foreachイテレータが変更されているのに、なぜエラーが報告されないのでしょうか? ? ?
button2 だけが 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;
        }

.net (C#) WinForm 開発は、ビジュアルデザインなので、必要なコンポーネントをデザインインターフェイスに手動で直接追加でき、.net はプロパティ設定などを含めてこのコンポーネントを自動的に初期化します。 InitilizeComponent() に追加すると、このコンポーネントは対応する親コンポーネントに追加されます。これらはすべて .net によって自動的に行われます。

上記は、コンテナーによって参照される Microsoft bug .net コンポーネントのコード例の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。