.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 トラバーサルではエラーが報告されませんでしたが、期待した結果が得られませんでした。
奇妙な点:
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) に注目してください。