みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C# 動的に読み込んだコントロールの削除

C#にて動的に読み込んだ不特定多数のコントロールを削除する正しい手順は
どのような物でしょうか。

MSDNによるとコンテナに読み込んだコントロールをFlowLayoutPanel.Clear()で
クリアするとメモリリークにつながるため、Dispose()をしろとあります。

動的に作成したコントロールが不特定多数のため、Foreach文をつかい
FlowLayoutPanel.Controlsで確認できた物をDispose()しましたが、偶数indexの
コントロールしか削除されませんでした。
まぁ、これはなんとなく分かるのですが、では、正しくすべてのコントロールを
削除するにはどうしたら良いのか分かりません。

ご教示のほど、よろしくお願いいたします。



確認コード(空のForm1_Loadに貼り付け)
※現象を再現させるためのサンプルで意味はありません

// コントロール配置用のコンテナ
FlowLayoutPanel panel = new FlowLayoutPanel();
panel.Dock = System.Windows.Forms.DockStyle.Fill;
this.Controls.Add(panel);

// テストコントロール追加ボタン
Button create = new Button();
create.Size = new Size(50, 25);
create.Text = "create";
create.Click += (ss, ee) =>
{
for (int i = 0; i < 100; i++)
{
TextBox text = new TextBox();
text.Size = new Size(50, 25);
text.Text = i.ToString();
panel.Controls.Add(text);
}
};
panel.Controls.Add(create);

// コントロール削除ボタン
Button delete = new Button();
delete.Size = new Size(50, 25);
delete.Text = "delete";
delete.Click += (ss, ee) =>
{
foreach (var control in panel.Controls)
{
if (control is TextBox)
{
((TextBox)control).Dispose();
}
}
};
panel.Controls.Add(delete);

投稿日時 - 2013-03-21 19:45:22

QNo.8004870

困ってます

質問者が選んだベストアンサー

コレクションや配列になっているのを削除する場合は、後ろから削除しないと上手く削除されません。
以下のような方法になります。(実際のソースとはプロパティ等が異なります)

For (int idx= panel.Controls.個数-1; 0<=idx; idx--)
{
panel.Controls[idx].Dispose();
}

投稿日時 - 2013-03-21 20:14:45

お礼

ありがとうございます。
無事に全部解放できました。

一応記録としてソースの方を乗せておきます。
// コントロール削除ボタン
Button delete = new Button();
delete.Size = new Size(50, 25);
delete.Text = "delete";
delete.Click += (ss, ee) =>
{
for(int i = panel.Controls.Count -1; i >= 0; i--)
{
if (panel.Controls[i] is TextBox)
{
((TextBox)panel.Controls[i]).Dispose();
}
}
};
panel.Controls.Add(delete);

投稿日時 - 2013-03-21 22:04:42

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問