C# UserControlの作り方と使い方を初心者向けに解説|Windowsフォームで再利用できる部品を作る方法
はじめに
C#でWindowsフォームアプリを作っていると、同じような入力欄やボタン、表示エリアを何度も作る場面があります。たとえば、名前を入力する欄、検索ボックス、設定画面の一部、一覧の操作ボタンなどです。
このような部品を毎回Formに直接配置していると、画面が増えるほどコードが重複し、修正も大変になります。そこで便利なのが、C#のUserControlです。
UserControlを使うと、Label、TextBox、Buttonなどの複数のコントロールをひとつの部品としてまとめ、Form上で再利用できます。この記事では、C# UserControlの作り方と使い方を、Windowsフォーム初心者にもわかるように順番に解説します。
1. C#のUserControlとは?初心者にもわかる基本
1-1. UserControlの役割とWindowsフォームで使うメリット
UserControlとは、Windowsフォームアプリで使える「自作の画面部品」です。
通常、FormにはLabelやTextBox、Buttonなどを直接配置します。しかし、複数のコントロールを組み合わせたまとまりを何度も使いたい場合は、UserControlとして作成しておくと便利です。
たとえば、次のような部品をUserControlとして作れます。
名前入力欄、検索ボックス、ログイン入力欄、商品情報表示エリア、設定項目の入力パネルなどです。
UserControlを使うメリットは、同じ部品を複数のFormで使い回せることです。また、部品ごとに処理をまとめられるため、Form側のコードがすっきりします。
1-2. Form・Panel・CustomControlとの違い
Formは、アプリの画面そのものです。ウィンドウとして表示され、メニューやボタンなどを配置できます。
Panelは、Form上でコントロールをまとめるための入れ物です。ただし、Panel自体は再利用するための部品として作るものではありません。
UserControlは、複数のコントロールと処理をまとめて、Formに配置できる自作部品です。
CustomControlは、既存のコントロールを継承したり、自分で描画処理を書いたりして作る、より高度な独自コントロールです。
初心者がまず使いやすいのはUserControlです。デザイナーで見た目を作れるため、Formを作る感覚に近いからです。
1-3. UserControlが向いている場面・向いていない場面
UserControlが向いているのは、複数の画面で同じ部品を使いたい場合です。
たとえば、検索条件入力欄を複数画面で使う場合や、同じ形式の入力エリアを何度も表示する場合に便利です。
一方で、単純なButtonひとつだけを少し変更したい場合は、UserControlにする必要がないこともあります。また、細かい描画を自分で制御したい場合は、CustomControlのほうが向いています。
UserControlは、既存のコントロールを組み合わせて作る部品だと考えるとわかりやすいです。
1-4. 再利用できる部品を作ると開発が楽になる理由
再利用できる部品を作ると、同じ処理を何度も書かなくて済みます。
たとえば、名前入力欄に「未入力ならエラーを表示する」という処理を入れたい場合、Formごとに同じコードを書くと修正漏れが起きやすくなります。
UserControlにまとめておけば、修正する場所は基本的にUserControl側だけです。デザイン変更や入力チェックの変更もまとめて行えるため、保守が楽になります。
2. C# UserControlを作る前に準備するもの
2-1. 必要な開発環境
C#でUserControlを作るには、Visual Studioを使うのが一般的です。
Windowsフォームアプリを作成できる環境であれば、UserControlも作成できます。Visual Studio Communityでも問題ありません。
必要なものは、Visual Studio、.NETまたは.NET Framework、Windowsフォームアプリのプロジェクトです。
2-2. Windowsフォームアプリのプロジェクトを作成する
まず、Visual StudioでWindowsフォームアプリのプロジェクトを作成します。
新しいプロジェクトの作成から「Windows フォーム アプリ」を選び、プロジェクト名を入力して作成します。
作成すると、Form1.csが用意されます。このFormに後ほどUserControlを配置して使います。
2-3. サンプルで作るUserControlの完成イメージ
この記事では、名前入力用のUserControlを例にします。
完成イメージは、Label、TextBox、Buttonを持つ部品です。
Labelには「名前」と表示し、TextBoxに名前を入力します。Buttonをクリックすると、入力内容を確認して、Form側に通知できるようにします。
2-4. 初心者が事前に理解しておきたいクラスとイベントの考え方
UserControlはクラスとして作成されます。
クラスとは、部品の設計図のようなものです。UserControlをFormに配置すると、そのクラスから作られた実体が画面に表示されます。
また、Buttonをクリックしたときの処理はイベントで書きます。イベントとは、「クリックされた」「文字が変更された」など、何かが起きたときに実行される処理のことです。
3. C# UserControlの作り方
3-1. プロジェクトにUserControlを追加する手順
Visual Studioのソリューションエクスプローラーで、プロジェクトを右クリックします。
「追加」から「ユーザー コントロール」を選択します。
名前は、たとえばNameInputControl.csのようにします。
追加すると、通常のFormと同じようにデザイナー画面が表示されます。ここにLabelやTextBox、Buttonを配置していきます。
3-2. デザイナーでLabel・TextBox・Buttonを配置する
UserControlのデザイナーを開き、ツールボックスからLabel、TextBox、Buttonを配置します。
LabelのTextプロパティを「名前」に変更します。
TextBoxは入力欄として使います。
ButtonのTextプロパティは「確認」や「入力完了」など、わかりやすい文字にします。
3-3. コントロール名をわかりやすく変更する
配置したコントロールは、Nameプロパティを変更しておくとコードが読みやすくなります。
たとえば、次のように名前を付けます。
LabelはlblTitle、TextBoxはtxtName、ButtonはbtnSubmitのようにします。
名前をわかりやすくしておくと、後からコードを見たときに、どの部品を操作しているのかすぐに理解できます。
3-4. UserControl内に処理を書く
Buttonをダブルクリックすると、クリックイベントの処理を書く場所が作られます。
たとえば、入力値を確認する処理は次のように書けます。
C#private void btnSubmit_Click(object sender, EventArgs e)
{
if (string.IsNullOrWhiteSpace(txtName.Text))
{
MessageBox.Show("名前を入力してください。");
return;
}
MessageBox.Show("入力された名前:" + txtName.Text);
}
このように、UserControl内のTextBoxやButtonに対する処理は、UserControlのクラス内に書けます。
3-5. ビルドしてツールボックスに表示させる
UserControlを作成したら、一度プロジェクトをビルドします。
ビルドが成功すると、ツールボックスに作成したUserControlが表示されることがあります。
表示されない場合は、ツールボックスを右クリックして更新したり、プロジェクトを再ビルドしたりします。
4. 作成したUserControlをFormで使う方法
4-1. ツールボックスからFormに配置する
Formのデザイナーを開き、ツールボックスから作成したUserControlを選んでForm上に配置します。
配置すると、Label、TextBox、Buttonをまとめた部品として表示されます。
Form側では、通常のButtonやTextBoxと同じように位置やサイズを変更できます。
4-2. コードからUserControlを追加する
UserControlは、コードから追加することもできます。
C#NameInputControl control = new NameInputControl();
control.Location = new Point(20, 20);
this.Controls.Add(control);
このようにインスタンスを作成し、FormのControlsに追加すると画面に表示されます。
複数個追加したい場合も、同じクラスから複数のUserControlを作成できます。
4-3. Dock・Anchorでサイズ変更に対応する
Formのサイズ変更に対応するには、DockやAnchorを設定します。
Dockを使うと、UserControlをFormの上、下、左、右、全体などに固定できます。
Anchorを使うと、Formの端に合わせて位置やサイズを維持できます。
たとえば、横幅をFormに合わせて広げたい場合は、Anchorを左、右、上に設定します。
4-4. 複数のフォームで同じUserControlを再利用する
UserControlの大きなメリットは、複数のFormで同じ部品を使えることです。
たとえば、Form1とForm2の両方にNameInputControlを配置できます。
UserControl側に入力チェックや表示処理を書いておけば、どのFormでも同じ動きをします。
4-5. 配置できない・表示されないときの確認ポイント
UserControlが表示されない場合は、まずビルドが成功しているか確認します。
次に、UserControlのコンストラクターでエラーが発生していないか確認します。
また、InitializeComponentが正しく呼ばれているか、デザイナーファイルを誤って編集していないかも確認しましょう。
5. UserControlにプロパティを追加して使いやすくする
5-1. 外部からTextBoxの値を取得・設定できるようにする
UserControl内のTextBoxは、通常そのままではForm側から直接扱わないほうがよいです。
代わりに、UserControlにpublicプロパティを作成して、値を取得・設定できるようにします。
C#public string UserName
{
get { return txtName.Text; }
set { txtName.Text = value; }
}
このようにすると、Form側から次のように使えます。
C#nameInputControl1.UserName = "山田太郎";
string name = nameInputControl1.UserName;
5-2. publicプロパティを作成する基本
publicプロパティは、外部からUserControlの値を操作するための窓口です。
内部のTextBoxを直接公開するのではなく、必要な値だけをプロパティとして公開するのが基本です。
これにより、UserControlの内部構造を変更しても、Form側への影響を少なくできます。
5-3. デザイナーのプロパティ欄に表示する方法
publicプロパティを作成すると、Visual Studioのプロパティ欄に表示される場合があります。
よりわかりやすくするには、Category属性やDescription属性を使います。
C#[Category("表示")]
[Description("名前入力欄の値を取得または設定します。")]
public string UserName
{
get { return txtName.Text; }
set { txtName.Text = value; }
}
これにより、デザイナー上でもプロパティの意味がわかりやすくなります。
5-4. 初期値や表示テキストをForm側から変更する
Labelの表示文字も、プロパティで変更できるようにできます。
C#public string TitleText
{
get { return lblTitle.Text; }
set { lblTitle.Text = value; }
}
Form側では次のように設定できます。
C#nameInputControl1.TitleText = "お名前";
このようにしておくと、同じUserControlを「名前」「担当者名」「顧客名」など、用途に合わせて使い回せます。
5-5. プロパティ設計で注意すべきこと
プロパティを増やしすぎると、UserControlの使い方がわかりにくくなります。
Form側から変更する必要があるものだけをpublicにしましょう。
また、TextBoxそのものをpublicにするより、文字列や数値など必要な値だけを公開するほうが安全です。
6. UserControlでイベントを扱う方法
6-1. UserControl内のButtonクリックイベントを作る
UserControl内のButtonクリックイベントは、通常のButtonと同じように作れます。
C#private void btnSubmit_Click(object sender, EventArgs e)
{
MessageBox.Show("ボタンがクリックされました。");
}
ただし、この処理だけではForm側にクリックされたことを伝えにくい場合があります。
6-2. Form側にイベントを通知する方法
UserControl内で起きた操作をForm側に知らせたい場合は、カスタムイベントを使います。
たとえば、UserControlのButtonがクリックされたときに、Form側で処理を実行したい場合です。
6-3. カスタムイベントを定義する
UserControlにカスタムイベントを定義します。
C#public event EventHandler SubmitClicked;
そして、Buttonクリック時にイベントを発生させます。
C#private void btnSubmit_Click(object sender, EventArgs e)
{
SubmitClicked?.Invoke(this, EventArgs.Empty);
}
これで、Form側からSubmitClickedイベントを受け取れるようになります。
6-4. EventHandlerを使った基本実装
Form側では、次のようにイベントを登録します。
C#private void Form1_Load(object sender, EventArgs e)
{
nameInputControl1.SubmitClicked += NameInputControl1_SubmitClicked;
}
private void NameInputControl1_SubmitClicked(object sender, EventArgs e)
{
MessageBox.Show(nameInputControl1.UserName);
}
これにより、UserControl内のButtonがクリックされたときに、Form側の処理を実行できます。
6-5. 入力完了・検索実行・選択変更などの実用例
カスタムイベントは、さまざまな場面で使えます。
入力完了、検索ボタンのクリック、項目の選択変更、削除ボタンのクリックなどです。
UserControl側では「何が起きたか」を通知し、Form側では「それに対して何をするか」を決めるようにすると、役割分担がわかりやすくなります。
7. 実践サンプル:入力フォーム用UserControlを作る
7-1. 名前入力用UserControlの仕様を決める
ここでは、名前入力用UserControlを作ります。
仕様は次の通りです。
Labelに項目名を表示します。TextBoxに名前を入力します。Buttonをクリックすると入力チェックを行います。入力が空の場合はエラーメッセージを表示します。入力がある場合はForm側に通知します。
7-2. 入力値を検証する処理を追加する
UserControlに入力チェック用のメソッドを作ります。
C#public bool ValidateInput()
{
return !string.IsNullOrWhiteSpace(txtName.Text);
}
Buttonクリック時には、このメソッドを使って判定します。
C#private void btnSubmit_Click(object sender, EventArgs e)
{
if (!ValidateInput())
{
lblError.Text = "名前を入力してください。";
return;
}
lblError.Text = "";
SubmitClicked?.Invoke(this, EventArgs.Empty);
}
7-3. エラーメッセージを表示する
エラーメッセージを表示するには、UserControlにLabelを追加します。
LabelのNameをlblErrorにし、初期状態ではTextを空にします。
入力が空の場合だけ、lblError.Textにメッセージを設定します。
C#lblError.Text = "名前を入力してください。";
入力が正しい場合は、エラーメッセージを消します。
C#lblError.Text = "";
7-4. Form側で入力値を受け取る
Form側では、UserControlのUserNameプロパティを使って入力値を取得します。
C#private void nameInputControl1_SubmitClicked(object sender, EventArgs e)
{
string name = nameInputControl1.UserName;
MessageBox.Show("入力された名前は " + name + " です。");
}
UserControl側は入力欄と検証を担当し、Form側は受け取った値を使って処理を行います。
7-5. 複数項目に応用する方法
同じ仕組みを使えば、メールアドレス入力、電話番号入力、住所入力などにも応用できます。
Labelの表示文字をプロパティで変更できるようにしておけば、ひとつのUserControlを複数の入力項目に使えます。
ただし、入力チェックの内容が大きく異なる場合は、別のUserControlとして作るほうが管理しやすいこともあります。
8. UserControlを再利用しやすくする設計のコツ
8-1. 1つのUserControlに詰め込みすぎない
UserControlには、関係のある部品だけをまとめるようにしましょう。
入力欄、一覧、ボタン、検索条件などをすべてひとつのUserControlに詰め込むと、かえって使いにくくなります。
1つのUserControlは、1つの役割に絞るのが基本です。
8-2. Form側とUserControl側の役割を分ける
UserControl側は、表示や入力、部品内の簡単な処理を担当します。
Form側は、画面全体の制御やデータ保存、画面遷移などを担当します。
UserControlから親Formの処理を直接呼び出しすぎると、再利用しにくくなります。イベントやプロパティを使って連携するのがおすすめです。
8-3. 名前付けルールを統一する
UserControl名や内部コントロール名は、わかりやすく統一しましょう。
たとえば、UserControlはNameInputControl、SearchBoxControlのように役割がわかる名前にします。
LabelはlblTitle、TextBoxはtxtName、ButtonはbtnSubmitのようにルールを決めておくと、コードが読みやすくなります。
8-4. 共通部品として別プロジェクトに分ける方法
複数のアプリで同じUserControlを使いたい場合は、クラスライブラリとして別プロジェクトに分ける方法があります。
共通部品用のプロジェクトを作り、そこにUserControlをまとめます。
別のWindowsフォームアプリから参照を追加すれば、同じUserControlを使えるようになります。
8-5. 保守しやすいコードにするポイント
保守しやすくするには、コードの役割を明確にすることが大切です。
UserControl内に業務処理を詰め込みすぎないようにしましょう。
また、publicにするプロパティやイベントは必要最小限にし、コメントや名前で意味が伝わるようにします。
9. C# UserControlでよくあるエラーと解決方法
9-1. ツールボックスにUserControlが表示されない
UserControlがツールボックスに表示されない場合は、まずプロジェクトをビルドしてください。
ビルドエラーがあると表示されないことがあります。
それでも表示されない場合は、ツールボックスを右クリックして「ツールボックスのリセット」や「アイテムの選択」を試します。
9-2. Formに配置するとエラーになる
Formに配置した瞬間にエラーになる場合は、UserControlのコンストラクターやLoadイベントで例外が発生している可能性があります。
デザイナー上でもコンストラクターは実行されることがあるため、ファイル読み込みやデータベース接続などを直接書くとエラーになる場合があります。
9-3. InitializeComponentでエラーが出る
InitializeComponentは、デザイナーで配置したコントロールを初期化する重要なメソッドです。
この部分でエラーが出る場合は、デザイナーファイルを誤って編集した可能性があります。
通常、Designer.csファイルは手動で大きく編集しないようにしましょう。
9-4. デザイナーが開けない
デザイナーが開けない場合は、UserControlのコードにコンパイルエラーがないか確認します。
また、コンストラクターで例外が出ていないかも重要です。
まずはビルドエラーを解消し、コンストラクター内にはInitializeComponent以外の重い処理を置かないようにしましょう。
9-5. プロパティやイベントがForm側から使えない
Form側からプロパティやイベントが使えない場合は、アクセス修飾子を確認します。
外部から使いたいプロパティやイベントにはpublicを付けます。
また、名前空間が違う場合は、usingの追加や参照設定も確認しましょう。
9-6. UserControlのサイズや表示が崩れる
UserControlの表示が崩れる場合は、Dock、Anchor、AutoSizeなどの設定を確認します。
Formのサイズ変更に合わせたい場合は、Anchorを正しく設定します。
また、UserControl内部のコントロールにもAnchorやDockを設定しておくと、サイズ変更に強くなります。
10. C# UserControlに関するよくある質問
10-1. UserControlとCustomControlはどちらを使うべき?
初心者はまずUserControlから使うのがおすすめです。
Label、TextBox、Buttonなどを組み合わせて部品を作りたい場合はUserControlが向いています。
一方で、描画を細かく制御したい場合や、既存コントロールの動作を大きく拡張したい場合はCustomControlを検討します。
10-2. UserControlはWPFでも使える?
WPFにもUserControlがあります。
ただし、WindowsフォームのUserControlとは仕組みや作り方が異なります。
この記事で解説しているのは、WindowsフォームアプリのUserControlです。
10-3. UserControlをDLL化して別アプリで使える?
UserControlは、クラスライブラリとして作成してDLL化できます。
共通部品用のプロジェクトを作成し、そこにUserControlを配置します。
別のWindowsフォームアプリからそのDLLを参照すれば、共通部品として利用できます。
10-4. UserControlから親Formの処理を呼び出してもよい?
技術的には可能ですが、あまりおすすめしません。
UserControlが特定のFormに依存すると、他のFormで再利用しにくくなります。
親Formに何かを伝えたい場合は、イベントを使うのが基本です。
10-5. 初心者はまず何を作ると理解しやすい?
初心者は、入力欄をまとめたUserControlから作ると理解しやすいです。
Label、TextBox、Buttonを配置し、TextBoxの値をプロパティで取得できるようにします。
さらにButtonクリックをイベントでForm側に通知できるようにすると、UserControlの基本がかなり理解できます。
まとめ
C#のUserControlは、Windowsフォームアプリで再利用できる部品を作るための便利な仕組みです。
Label、TextBox、Buttonなどを組み合わせてひとつの部品にまとめることで、複数のFormで同じ機能を使い回せます。
基本的な流れは、UserControlを追加し、デザイナーで部品を配置し、必要な処理をコードに書き、Formに配置して使うというものです。
さらに、publicプロパティを追加すればForm側から値を取得・設定でき、カスタムイベントを使えばUserControl内の操作をForm側に通知できます。
初心者はまず、名前入力用や検索ボックス用など、小さなUserControlから作ってみるのがおすすめです。小さな部品を作りながら、プロパティ、イベント、再利用の考え方を理解していくと、Windowsフォームアプリの開発がより効率的になります。

