基本フォームから継承された内容を派生フォームでカスタマイズするには?

連載目次

 「TIPS:各フォームの共通要素を基本フォームにまとめるには?」では、複数のWindowsフォーム(もしくはユーザー・コントロール)に共通する部分(以降、共通要素)を、基本フォーム(ユーザー・コントロールの場合は「基本コントロール」)にまとめる方法を紹介した。各フォームでは、この基本フォームを継承するだけで、共通要素(コントロールなど)を再利用できるようになる。

 しかし、基本フォームを継承した派生フォーム側から、基本フォーム上のコントロールへアクセスしようとすると、アクセスが拒否されてしまう(例えば、フォーム上に配置されたTextBoxコントロールのTextプロパティを取得しようとするコードを記述すると、Visual Studio .NETでビルドするときに失敗する)。

 次の画面は、派生フォーム上に表示されている基本フォーム上のコントロールへのアクセスができないことを示す例である(この例では、コントロールの移動やプロパティ設定ができない)。

派生フォーム側からアクセスできない基本フォーム上のコントロール派生フォーム側からアクセスできない基本フォーム上のコントロール
本稿で使用するサンプル・プログラムは、「TIPS:各フォームの共通要素を基本フォームにまとめるには?」と同じものである。この画面は、このサンプル・プログラムにある、基本フォーム(BaseForm)から派生した派生フォーム(Form2)を、Visual Studio .NETのWindowsフォーム・デザイナで開いたところ。派生フォーム側から基本フォーム上のコントロールにアクセスしようとすると、アクセスが拒否されてしまう。
  (1)基本フォーム上のコントロールを移動しようとしても移動できない。
  (2)アクセスできないコントロールを選択した状態で、[プロパティ]ウィンドウを見てもグレー表示され、プロパティ値を設定できない。

 本稿では、このようなアクセス拒否に関する問題を回避して、各派生フォーム側で、基本フォーム上のコントロールにアクセスしたり、移動したりできるようにする方法を紹介する(ユーザー・コントロールの場合も基本的に同じ作業を行えばよい)。なお本稿では、Visual Studio .NET(以降、VS.NET)を利用することを前提とする。

基本フォームから継承された内容を派生フォームでカスタマイズする方法

 派生フォームから基本フォーム上のコントロールへのアクセスが拒否されてしまうのは、それが意味するとおり、そのコントロールへのアクセス許可(以降、アクセシビリティ)が認められていないからだ。

 このアクセシビリティは、(VS.NETでは)基本フォームの各コントロールのModifiersプロパティによって変更することができる(なおこのModifiersプロパティは実際のプロパティではなく、フォームのクラス内に自動生成されるフィールド変数の宣言で指定される「アクセス修飾子」と、Lockedプロパティなどと同じ「リソース・データ」という2つのデータになる。アクセス修飾子については「オブジェクト指向プログラミング超入門」の「第2回 クラスの定義からプログラム実行まで」が、リソース・データについてはLockedプロパティについて解説した「TIPS:Windowsフォーム上のコントロールの位置やサイズを固定するには?」が参考になる)。

 Modifiersプロパティで指定できる値は次の表とおりだ。

C# VB.NET 説明
Public Public アクセス制限なし
Protected Protected フォーム内と派生フォームに対するアクセス許可
Protected Internal Protected Friend 現在のアセンブリ内、またフォーム内と派生フォームに対するアクセス許可
Internal Friend 現在のアセンブリ内のみのアクセス許可。
Visual Basic .NETでコントロールを配置するとこれが「デフォルト」で設定されるようだ
Private Private フォーム内のみのアクセス許可。デフォルト値。
Visual C# .NETでコントロールを配置するとこれが「デフォルト」で設定されるようだ
Modifiersプロパティで指定できる値

 ここでは、派生フォーム側で基本フォーム上のコントロールにアクセスできさえすればよいので、「Protected」のアクセシビリティが適切だろう。これを実際に適用しているのが、次の画面である。

基本フォーム上のコントロールのアクセシビリティの変更基本フォーム上のコントロールのアクセシビリティの変更
コントロールのModifiersプロパティを指定しているところ。ここでは、派生フォーム側で基本フォーム上のコントロールにアクセスできさえすればよいので、「Protected」のアクセス許可が適切だろう。
  (1)基本フォームをWindowsフォーム・デザイナで開き、アクセシビリティを変更したいコントロールを選択する。
  (2)[プロパティ]ウィンドウを使って、Modifiersプロパティの値を「Protected」に変更する。

 この作業により、次の画面のように、基本フォーム上のコントロールが持つ各種プロパティに対して、派生フォーム側からアクセスできるようになる。

派生フォーム側からアクセスできるようなった基本フォーム上のコントロール派生フォーム側からアクセスできるようなった基本フォーム上のコントロール
Modifiersプロパティの値を「Protected」に変更した(基本フォーム上の)コントロールは、派生フォーム側でアクセスできるようになる。
  (1)基本フォーム上で配置されたコントロールを移動できる。
  (2)[プロパティ]ウィンドウでプロパティ設定が行える。ここではTextプロパティの値を「書き換えられる」に変更している。

 上の画面のようにして、派生フォーム側で基本フォーム上のコントロールのプロパティ設定や移動などを行った場合、それらの値は基本フォーム自体の設定を書き換えるわけではなく、派生フォーム側にそのカスタムの設定内容だけが保存される。つまり、基本フォーム上のコントロールの設定内容は、派生フォーム側のカスタム設定内容によって上書きされるという仕組みになっている。

 またこの状態で、Windowsフォーム・デザイナ上のButtonコントロール(例えば、[追加]ボタン)をダブルクリックすると、そのClickイベント・ハンドラが追加できる。次のコードは、基本フォームから継承したコントロールのClickイベント・ハンドラを、派生フォーム側で実装した例だ。

private void button1_Click(object sender, System.EventArgs e)
{
  listView1.Items.Add(textBox1.Text);
}

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  listView1.Items.Add(textBox1.Text)
End Sub

基本フォーム上のコントロールのClickイベント・ハンドラの派生フォーム側での実装(上:C#、下:VB.NET)


 なお、基本フォームと派生フォームの両方にClickイベント・ハンドラを実装した場合には、基本フォーム→派生フォームの順で実行されることになる。

.NET TIPS

Copyright© 1999-2016 Digital Advantage Corp. All Rights Reserved.