C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


■90069 / )  Re[1]: ユーザーコントロールの使い方
□投稿者/ 魔界の仮面弁士 (2036回)-(2019/02/04(Mon) 10:43:36)
2019/02/04(Mon) 11:21:16 編集(投稿者)

No90068 (ルパン さん) に返信
> ユーザーコントロール上にはラベル、ボタン(終了)など
> 他に複数のコントロールが配置しています。
親子関係がどうなっているのか読み取りきれませんでした…。
コードから察すると、そこまでに登場した UI 部品としては、
 ・Form
 ・Button イベントハンドラに割り当てられた Button コントロール
 ・SelectButton フィールド変数に割り当てられた Button コントロール
 ・終了ボタン
 ・btnTime (Button コントロール)
 ・pnlSub (Panel コントロール)
 ・ucTime (UserControl コントロール)
 ・lblTime (Label コントロール)
などがありそうですが。


> foreach (Control cnt in pnlSub.Controls)
> {
>  pnlSub.Controls.Remove(cnt);
>  cnt.Dispose();
> }

コレクションのループ中に、そのコレクション自身の要素を増減させると
カウンターがずれるので避けてください。

回避策としては、たとえば .ToArray() で配列にコピーしてから、
それを列挙するという手が使えます。あるいは全削除なら、
while ループで空になるまで繰り返し [0] 番を削っていくという手も。


> private void ucTime_Disposed(object sender, EventArgs e)
> {
>  Properties.Settings.Default.ucTime = lblTime.Text;

上記の処理ですが、処理順などを考慮した上で、
ucTime が Diposed となったときに、
lblTime がまだ Disposed 状態でないことは
確実に保証できているのでしょうか。
返信 編集キー/


管理者用

- Child Tree -