ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
エラーの内容
System.ArgumentException:
'トップレベルのコントロールをコントロールに追加できません。'
(英語環境)
System.ArgumentException:
'Top-level control cannot be added to a control.'
// 例外が出るコード
var child = new ChildForm();
panel1.Controls.Add(child); // ← ここで ArgumentException
なぜ起きるのか
Windows フォームの Form は、既定で TopLevel = true(=自分がウィンドウそのもの)です。トップレベルのウィンドウは OS が直接管理するため、別のコントロールの子要素にはできません。
| クラス | TopLevel | 他のコントロールに入れられるか |
|---|---|---|
Form | true(既定) | できない |
UserControl | false | できる |
Panel Button などの通常のコントロール | false | できる |
対処 1: TopLevel を false にする
private void ShowChild()
{
var child = new ChildForm();
child.TopLevel = false; // 入れ子にできるようにする
child.FormBorderStyle = FormBorderStyle.None; // タイトルバーと枠を消す
child.Dock = DockStyle.Fill; // 親いっぱいに広げる
panel1.Controls.Add(child);
child.Show(); // ← これを忘れると表示されない
child.BringToFront();
}
Show() の呼び忘れが次のつまずきです。Controls.Add() しただけでは Visible が false のままで、何も表示されません。
入れ替えるとき
private Form? _current;
private void SwitchTo(Form next)
{
// 前の画面を確実に片付ける(残すとメモリを食い続ける)
if (_current != null)
{
panel1.Controls.Remove(_current);
_current.Dispose();
}
next.TopLevel = false;
next.FormBorderStyle = FormBorderStyle.None;
next.Dock = DockStyle.Fill;
panel1.Controls.Add(next);
next.Show();
_current = next;
}
Remove() だけでは破棄されません。Dispose() まで呼ばないと、画面を切り替えるたびにフォームが増え続けます。
対処 2: UserControl にする(推奨)
// 画面の一部として使い回すなら UserControl が正しい
public partial class UserListControl : UserControl
{
public UserListControl()
{
InitializeComponent();
}
}
// 使う側
var view = new UserListControl { Dock = DockStyle.Fill };
panel1.Controls.Add(view); // TopLevel の設定は不要
Visual Studio では プロジェクトを右クリック → 追加 → ユーザー コントロール で作れます。デザイナーで部品を並べられる点は Form と同じです。
| やりたいこと | 使うもの |
|---|---|
| 独立したウィンドウとして開く | Form + Show() / ShowDialog() |
| 画面の一部として埋め込む | UserControl |
既存の Form を作り直さず埋め込む | TopLevel = false(応急処置) |
| 複数の子ウィンドウを親の中で管理する | MDI(IsMdiContainer) |
| タブで切り替える | TabControl + UserControl |
対処 3: MDI を使う
// 親フォーム
public MainForm()
{
InitializeComponent();
IsMdiContainer = true;
}
private void OpenChild()
{
var child = new ChildForm();
child.MdiParent = this; // TopLevel は変更しない
child.Show();
}
MDI では MdiParent を設定するだけで、Controls.Add() は使いません。MdiParent と TopLevel = false を同時に使うと例外になります。
関連するエラー
| エラー | 原因 |
|---|---|
| トップレベルのコントロールをコントロールに追加できません。 | Form を Controls.Add() した(本記事) |
フォームが MDI 親フォームの場合、TopLevel を false に設定できません | IsMdiContainer = true の親に TopLevel = false を設定した |
コントロールをそれ自体に追加することはできません | 自分自身を Controls.Add() している |
ObjectDisposedException | Dispose() 済みのフォームを再度 Show() した |
| 追加したのに何も表示されない | Show() の呼び忘れ/Dock と Size の指定漏れ |
埋め込んだフォームの後始末
// 埋め込んだフォームで Close() を呼ぶと Dispose されて再表示できない
child.Close();
child.Show(); // ObjectDisposedException
// 一時的に隠すだけなら Hide()
child.Hide();
child.Show(); // 再表示できる
// 完全に破棄するとき
panel1.Controls.Remove(child);
child.Dispose();
child = null;
Form.Close() はそのフォームを破棄します(モーダル表示の ShowDialog() を除く)。埋め込んだフォームを使い回すなら Hide() にしてください。
親子で値をやり取りする
// 子側: イベントで親に知らせる
public partial class ChildForm : Form
{
public event EventHandler<string>? Selected;
private void listBox1_DoubleClick(object sender, EventArgs e)
{
Selected?.Invoke(this, listBox1.SelectedItem?.ToString() ?? "");
}
}
// 親側: 受け取る
var child = new ChildForm();
child.Selected += (s, value) => textBox1.Text = value;
child.TopLevel = false;
child.FormBorderStyle = FormBorderStyle.None;
child.Dock = DockStyle.Fill;
panel1.Controls.Add(child);
child.Show();
子から親のコントロールを直接触らないでください。イベントで知らせる形にすると、子を別の画面でも使い回せます。
画面の切り替え方の選択肢
| やり方 | 向いている場面 | 注意点 |
|---|---|---|
Panel + UserControl | 最も素直。メニューで画面を切り替える | 破棄を忘れない |
TabControl | 並列に見比べる画面 | タブが増えると重くなる |
| MDI | 同じ種類の画面を複数開く(帳票など) | 見た目が古く感じられる |
ShowDialog() | 入力を確定させたい(設定・確認) | 閉じるまで親を操作できない |
Show()(別ウィンドウ) | 並べて作業する | ウィンドウの管理が要る |
// モーダルで開いて結果を受け取る
using var dialog = new SettingsForm();
if (dialog.ShowDialog(this) == DialogResult.OK)
{
ApplySettings(dialog.Settings);
}
// ShowDialog は自動で Dispose されないので using を付ける
デザイナーで起きる場合
フォームのデザイナー上で他のフォームをドラッグしたときにも同じ例外が出ます。この場合はコードではなくデザイナーの操作が原因なので、ツールボックスから UserControl を配置する形に直してください。
1. UserControl を追加してビルドする
2. ツールボックスの先頭に、そのプロジェクトのコントロールが表示される
3. デザイナーにドラッグして配置する
ビルドしないとツールボックスに出てこないため、作成したら 1 度ビルドしてください。
関連
- エラー一覧 — 親カテゴリ
- 【Visual Studio】Form自動生成時に「値が有効な範囲にありません」エラー
- 指定された名前のソリューションファイルが既に存在するため、ソリューション名を変更できません
- 文法
- 基本的なルール
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
- 【Visual Studio】Form自動生成時に「値が有効な範囲にありません」エラー
- トップレベルのコントロールをコントロールに追加できません。
- 指定された名前のソリューションファイルが既に存在するため、ソリューション名を変更できません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- クラウドネットワークの記事一覧 2026-10-02 16:08:51
- ルーティングとスイッチング完全ガイド — 静的/動的ルーティング/RIP/OSPF/BGP/VLAN/STP 2026-10-02 16:08:51
- ネットワークのアドレッシング完全ガイド — IP/MAC/ポート/サブネット/CIDR/IPv6/NAT 2026-10-02 16:08:51
- 本番環境のdll内で参照しているdllファイルの置き場所 2026-10-02 16:08:50
- 【Visual Studio】 C#のForm自動生成時に「値が有効な範囲にありません」エラー 2026-10-02 16:08:50
- 【Laravelエラー】does not comply with psr-4 autoloading standard. Skipping. 2026-10-02 16:08:50
- 【Laravelエラー】could not find driver(Windows, MySQL編) 2026-10-02 16:08:49
- The following channel memory did not pass cpu memory test. 2026-10-02 16:08:49
- 【pycharm】connecting to console が終わらない 2026-10-02 16:08:49
- 【DB2】テーブル定義からDDL(CREATE TABLE)を生成する方法 2026-10-02 16:08:49
- 【DB2】特定スキーマの全テーブルの全カラム情報を取得する方法 2026-10-02 16:08:48
- 【Vue.jsエラー】Error in created hook: "ReferenceError: axios is 2026-10-02 16:08:48
- 【Spring】@Dataとは 2026-10-02 16:08:48
- 【Xcodeエラー 】...のiPhone is busy: Preparing debugger support 2026-10-02 16:08:47
- 【Xcode/iPhoneアプリ】テンプレートの種類一覧 2026-10-02 16:08:47
コメントを削除してもよろしいでしょうか?