2

コントロールを動的に追加する GroupBox があります。追加するコントロールには2つのタイプがDevExpress.XtraEditors.TextEditありWindows.Forms.Label 、次を使用してこれらのコントロールを削除しようとしています

foreach (Control control in salesBox.Controls)
{
  control.Dispose(); 
  salesBox.Controls.Remove(control);
} 

これはコントロールを正しく削除していますが、TextEditコントロールは削除していませんLabelLabelループはコントロールを反復していません。

4

4 に答える 4

5

コントロール コレクションからすべてのコントロールを削除する最も簡単な方法は、そのClearメソッドを呼び出すことです。

salesBox.Controls.Clear();

コレクションを変更すると、列挙子が無効になり、コレクションの種類によっては、予期しない結果が発生InvalidOperationExceptionたり、. 列挙子を使用するため、反復しているコレクションを変更しないでください。foreach

forアイテムを削除した後に間違ったインデックス値を取得しないように、選択的に削除し、逆方向に反復する必要がある場合は、ステートメントを使用します。

for (int i = salesBox.Controls.Count - 1; i >= 0; i--) {
    Control c = salesBox.Controls[i];
    if (c is TextEdit || c is Label) {
        salesBox.Controls.RemoveAt(i);
    }
}
于 2013-04-13T14:03:59.893 に答える
3

繰り返しているコレクションを変更しているため、機能しません。Dispose() メソッドを呼び出すと、親の Control コレクションからコントロールも削除されます。副作用は、偶数番号のコントロールのみを破棄することです。次の 2 つのループのいずれかで作業が完了します。

while (salesBox.Controls.Count > 0) salesBox.Controls[0].Dispose();

for (int ix = salesBox.Controls.Count-1; ix >= 0; ix---) salesBox.Controls[ix].Dispose();

または、パネルに保管し、パネルを廃棄してください。

于 2013-04-13T13:52:42.327 に答える
2

Foreach 内でコレクションの内容を変更することはできません。このようなことをする必要があると思います。

List<Control> toRemove = salesBox.Controls.OfType<Control>().ToList();

foreach(Control c in toRemove)
{
 salesBox.Controls.Remove(c);
 c.Dispose();
}
于 2013-04-13T08:15:50.880 に答える
0

Foreachの長さがsalesbox.Controls変更されたため、反復できません。使用したほうがよいアイテムを追加または削除する場合は、次の方法for で実行できます

   for(int i=0;i<salesBox.Controls.Count;i++)
    {      if(salesBox.Controls[i] is DevExpress.XtraEditors.TextEdit) //your condition here
           { 
             salesBox.Controls.Remove(salesBox.Controls[i]);
             i--;
          }
    }
于 2013-04-13T08:24:00.577 に答える