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

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

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

Re[2]: コントロールの下にパネルを動的に敷く


(過去ログ 119 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■69647 / inTopicNo.1)  コントロールの下にパネルを動的に敷く
  
□投稿者/ C#研究者 (3回)-(2014/01/16(Thu) 23:42:04)

分類:[C#] 

 フォームに乗っているコントロールの下にパネルを引こうと思ったのですが、
 うまくいきません、このようなソースで引けるかと思ったのですが、
 まだらにラベルが敷かれていないコントロールができてしまいました。
 どうすればよいのでしょうか。

 Form1:Loadメソッド内より

           foreach (Control ctrl in this.Controls)
            {
                Panel panel = new Panel();
                panel.Location = ctrl.Location;
                panel.Size = ctrl.Size;

                panel.Controls.Add(ctrl);
                ctrl.Dock = DockStyle.Fill;
            }

引用返信 編集キー/
■69649 / inTopicNo.2)  Re[1]: コントロールの下にパネルを動的に敷く
□投稿者/ 魔界の仮面弁士 (501回)-(2014/01/17(Fri) 01:03:08)
2014/01/17(Fri) 01:40:04 編集(投稿者)

No69647 (C#研究者 さん) に返信
> うまくいきません、このようなソースで引けるかと思ったのですが、
既に配置済みのコントロールに対して、別の親に Controls.Add し直した場合、
親コントロール(コンテナコントロール)が変更されます。

すなわち、panel.Controls.Add(ctrl); を実行することによって
this.Controls コレクションの中身が減少してしまうわけです。
foreach の最中に、このような増減があってはなりません。


> どうすればよいのでしょうか。
列挙しながら置き換えるのではなく、対象コントロールを
配列や List<> に予め取り出しておき、それを操作しましょう。
たとえばこんな感じ。


var controls = this.Controls.OfType<Control>().ToArray();
//var controls = this.Controls.OfType<Label>().ToArray();
foreach (Control ctrl in controls)
{
 Panel panel = new Panel();
 panel.Location = ctrl.Location;
 panel.Size = ctrl.Size;
 panel.Controls.Add(ctrl);
 panel.BorderStyle = BorderStyle.FixedSingle;
 ctrl.Dock = DockStyle.Fill;
 this.Controls.Add(panel);
}
引用返信 編集キー/
■69650 / inTopicNo.3)  Re[2]: コントロールの下にパネルを動的に敷く
□投稿者/ C#研究者 (5回)-(2014/01/17(Fri) 06:17:00)
foreachの特徴をすっかり忘れておりました。
教えてくださりありがとうございます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -