この記事では、プロジェクトにユーザー コントロールを追加し、そのユーザー コントロールをフォームに追加する方法について説明します。 魅力的なビジュアルと機能を備え、再利用可能なユーザー コントロールを作成します。 新しいコントロールは、TextBox コントロールと Button コントロールをグループ分けします。 ユーザーがボタンを選択すると、テキスト ボックス内のテキストがクリアされます。 ユーザー コントロールの詳細については、「ユーザー コントロールの概要」を参照してください。
ユーザー コントロール コンシューマーについて
この記事全体を通して、 コンシューマー という用語は、ユーザー コントロールを使用するすべてのコードを指します。 これには次のものが含まれます。
- ユーザー コントロールを含むフォーム。
- 他のコントロールがユーザーコントロールをホストします。
- ユーザー コントロール ライブラリを参照するアプリケーション。
ユーザー コントロールを作成すると、再利用可能なコンポーネントが構築されます。 コンシューマーは、フォームにコンポーネントを配置したり、プロパティを設定したり、イベントに応答したりして、そのコンポーネントを使用するユーザーです。 コンシューマーは、ユーザー コントロールを構成する内部コントロール ( TextBox や Buttonなど) について知る必要はありません。これらは、公開することを選択したプロパティとイベントとのみ対話します。
ユーザー コントロールに不可欠なコード パターン
詳細な実装を追加する前に、ユーザー コントロールの実行可能な最小限のコード パターンを理解しておくと役立ちます。 その中核となるユーザー コントロールには、次の機能が必要です。
- イベント転送 - 内部コントロールからコンシューマーにイベントを渡します。
- プロパティの公開 - コンシューマーが内部コントロールプロパティにアクセスできるようにします。
- 論理動作 - 内部コントロール間の相互作用を処理します。
次のコードは、これらのパターンを示しています。 基本的なユーザー コントロールにこのコードはすべて必要ありませんが、これらのパターンは、デザイナーおよびコンシューマー アプリケーションとうまく統合される、プロフェッショナルで再利用可能なコンポーネントを作成するのに役立ちます。
新しいユーザー コントロールを追加する
Visual Studio でWindows フォーム プロジェクトを開いた後、Visual Studio テンプレートを使用してユーザー コントロールを作成します。
Visual Studio で、[ ソリューション エクスプローラー ] ウィンドウを見つけます。 プロジェクトを右クリックして、[追加]>[ユーザー コントロール]\(Windows フォーム) を選択します。
コントロールの Name を ClearableTextBox に設定し、 Add キーを押します。
ユーザー コントロールが作成されると、Visual Studio がデザイナーを開きます。
クリア可能なテキスト ボックスを設計する
ユーザー コントロールは、フォームの設計方法と同様に、デザイン サーフェイスで作成するコントロールである内在コントロールで構成されます。 ユーザー コントロールとその内在コントロールを追加して構成するには、次の手順に従います。
デザイナーを開いた状態で、ユーザー コントロールのデザイン サーフェイスを選択したオブジェクトにする必要があります。 そうでない場合は、デザイン サーフェスをクリックして選択します。 [プロパティ] ウィンドウで、次のプロパティを設定します。
プロパティ 価値 最小サイズ 84, 53サイズ 191, 53Label コントロールを追加します。 次のようにプロパティを設定します。
プロパティ 価値 名前 lblTitleロケーション 3, 5TextBox コントロールを追加します。 次のようにプロパティを設定します。
プロパティ 価値 名前 txtValue錨 Top, Left, Rightロケーション 3, 23サイズ 148, 23Button コントロールを追加します。 次のようにプロパティを設定します。
プロパティ 価値 名前 btnClear錨 Top, Rightロケーション 157, 23サイズ 31, 23テキスト ↻コントロールは次の画像のようになります。
F7 キーを押して、
ClearableTextBoxクラスのコード エディターを開きます。次のコード変更を行います。
コード ファイルの先頭で
System.ComponentModel名前空間をインポートします。クラスに
DefaultEvent属性を追加します。 この属性は、コンシューマー (このコントロールを使用するフォームまたはアプリケーション) がデザイナーでコントロールをダブルクリックしたときに生成されるイベントを設定します。 属性の詳細については、「属性 (C#)」または「属性の概要 (Visual Basic)」を参照してください。using System.ComponentModel; namespace UserControlProject { [DefaultEvent(nameof(TextChanged))] public partial class ClearableTextBox : UserControlImports System.ComponentModel <DefaultEvent("TextChanged")> Public Class ClearableTextBoxTextBox.TextChangedイベントをユーザー コントロールのコンシューマーに転送するイベント ハンドラーを追加します。[Browsable(true)] public new event EventHandler? TextChanged { add => txtValue.TextChanged += value; remove => txtValue.TextChanged -= value; }<Browsable(True)> Public Shadows Custom Event TextChanged As EventHandler AddHandler(value As EventHandler) AddHandler txtValue.TextChanged, value End AddHandler RemoveHandler(value As EventHandler) RemoveHandler txtValue.TextChanged, value End RemoveHandler RaiseEvent(sender As Object, e As EventArgs) End RaiseEvent End Eventイベントで
Browsable属性が宣言されていることに注意してください。Browsableがイベントまたはプロパティに適用されている場合、デザイナーでコントロールを選択したときに、項目を [プロパティ] ウィンドウに表示するかどうかを制御します。 この場合、イベントを表示する必要があることを示す属性にtrueがパラメーターとして渡されます。ユーザー コントロールのコンシューマーに
TextBox.Textプロパティを公開する、Textという名前の文字列プロパティを追加します。[Browsable(true)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] public new string Text { get => txtValue.Text; set => txtValue.Text = value; }<Browsable(True)> <DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)> Public Shadows Property Text() As String Get Return txtValue.Text End Get Set(value As String) txtValue.Text = value End Set End Propertyユーザー コントロールのコンシューマーに
Label.Textプロパティを公開する、Titleという名前の文字列プロパティを追加します。[Browsable(true)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] public string Title { get => lblTitle.Text; set => lblTitle.Text = value; }<Browsable(True)> <DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)> Public Property Title() As String Get Return lblTitle.Text End Get Set(value As String) lblTitle.Text = value End Set End Property
ClearableTextBoxデザイナーに戻り、btnClearコントロールをダブルクリックしてClickイベントのハンドラーを生成します。 ハンドラーに次のコードを追加します。これにより、次のtxtValueテキスト ボックスがクリアされます。private void btnClear_Click(object sender, EventArgs e) => Text = "";Private Sub btnClear_Click(sender As Object, e As EventArgs) txtValue.Text = "" End Sub最後に、[ソリューション エクスプローラー] ウィンドウでプロジェクトを右クリックし、[ビルド] を選択してプロジェクトをビルドします。 エラーが発生しないようにし、ビルドが完了すると、
ClearableTextBoxコントロールがツールボックスに表示され、使用できるようになります。
次の手順では、フォームでコントロールを使用します。
サンプル アプリケーション
前のセクションで新しいプロジェクトを作成した場合は、Formという名前の空の があります。それ以外の場合は、新しいフォームを作成します。
ソリューション エクスプローラー ウィンドウで、フォームをダブルクリックしてデザイナーを開きます。 フォームのデザイン画面を選択する必要があります。
フォームの
Sizeプロパティを432, 315に設定します。Toolbox ウィンドウを開き、ClearableTextBox コントロールをダブルクリックします。 このコントロールは、プロジェクト後に名前が付けられたセクションの下に一覧表示されます。
ここでも、 ClearableTextBox コントロールをダブルクリックして、2 つ目のコントロールを生成します。
デザイナーに戻り、両方のコントロールを表示できるようにコントロールを分離します。
コントロールを 1 つ選択し、次のプロパティを設定します。
プロパティ 価値 名前 ctlFirstNameロケーション 12, 12サイズ 191, 53タイトル First Name他のコントロールを 1 つ選択し、次のプロパティを設定します。
プロパティ 価値 名前 ctlLastNameロケーション 12, 71サイズ 191, 53タイトル Last Nameツールボックス ウィンドウに戻り、フォームにラベル コントロールを追加し、次のプロパティを設定します。
プロパティ 価値 名前 lblFullNameロケーション 12, 252次に、2 つのユーザー コントロールのイベント ハンドラーを生成する必要があります。 デザイナーで、
ctlFirstNameコントロールをダブルクリックします。 このアクションにより、TextChangedイベントのイベント ハンドラーが生成され、コード エディターが開きます。デザイナーに戻り、
ctlLastNameコントロールをダブルクリックして、2 番目のイベント ハンドラーを生成します。デザイナーに戻り、フォームのタイトル バーをダブルクリックします。 このアクションにより、
Loadイベントのイベント ハンドラーが生成されます。コード エディターで、
UpdateNameLabelという名前のメソッドを追加します。 このメソッドは、両方の名前を組み合わせてメッセージを作成し、メッセージをlblFullNameコントロールに割り当てます。private void UpdateNameLabel() { if (string.IsNullOrWhiteSpace(ctlFirstName.Text) || string.IsNullOrWhiteSpace(ctlLastName.Text)) lblFullName.Text = "Please fill out both the first name and the last name."; else lblFullName.Text = $"Hello {ctlFirstName.Text} {ctlLastName.Text}, I hope you're having a good day."; }Private Sub UpdateNameLabel() If String.IsNullOrWhiteSpace(ctlFirstName.Text) Or String.IsNullOrWhiteSpace(ctlLastName.Text) Then lblFullName.Text = "Please fill out both the first name and the last name." Else lblFullName.Text = $"Hello {ctlFirstName.Text} {ctlLastName.Text}, I hope you're having a good day." End If End Subどちらの
TextChangedイベント ハンドラーも次のUpdateNameLabelメソッドを呼び出します。private void ctlFirstName_TextChanged(object sender, EventArgs e) => UpdateNameLabel(); private void ctlLastName_TextChanged(object sender, EventArgs e) => UpdateNameLabel();Private Sub ctlFirstName_TextChanged(sender As Object, e As EventArgs) Handles ctlFirstName.TextChanged UpdateNameLabel() End Sub Private Sub ctlLastName_TextChanged(sender As Object, e As EventArgs) Handles ctlLastName.TextChanged UpdateNameLabel() End Sub最後に、フォームの
UpdateNameLabelイベントからLoadメソッドを呼び出します。private void Form1_Load(object sender, EventArgs e) => UpdateNameLabel();Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load UpdateNameLabel() End Sub
次のプロジェクトを実行し、姓と名を入力します。
↻ ボタンを押して、テキスト ボックスの 1 つをリセットしてみてください。
.NET Desktop feedback