「TIPS:各フォームの共通要素を基本フォームにまとめるには?」では、複数のWindowsフォーム(もしくはユーザー・コントロール)に共通する部分(以降、共通要素)を、基本フォーム(ユーザー・コントロールの場合は「基本コントロール」)にまとめる方法を紹介した。各フォームでは、この基本フォームを継承するだけで、共通要素(コントロールなど)を再利用できるようになる。
しかし、基本フォームを継承した派生フォーム側から、基本フォーム上のコントロールへアクセスしようとすると、アクセスが拒否されてしまう(例えば、フォーム上に配置されたTextBoxコントロールのTextプロパティを取得しようとするコードを記述すると、Visual Studio .NETでビルドするときに失敗する)。
次の画面は、派生フォーム上に表示されている基本フォーム上のコントロールへのアクセスができないことを示す例である(この例では、コントロールの移動やプロパティ設定ができない)。
本稿では、このようなアクセス拒否に関する問題を回避して、各派生フォーム側で、基本フォーム上のコントロールにアクセスしたり、移動したりできるようにする方法を紹介する(ユーザー・コントロールの場合も基本的に同じ作業を行えばよい)。なお本稿では、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」のアクセシビリティが適切だろう。これを実際に適用しているのが、次の画面である。
この作業により、次の画面のように、基本フォーム上のコントロールが持つ各種プロパティに対して、派生フォーム側からアクセスできるようになる。
上の画面のようにして、派生フォーム側で基本フォーム上のコントロールのプロパティ設定や移動などを行った場合、それらの値は基本フォーム自体の設定を書き換えるわけではなく、派生フォーム側にそのカスタムの設定内容だけが保存される。つまり、基本フォーム上のコントロールの設定内容は、派生フォーム側のカスタム設定内容によって上書きされるという仕組みになっている。
またこの状態で、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イベント・ハンドラを実装した場合には、基本フォーム→派生フォームの順で実行されることになる。
Copyright© 1999-2016 Digital Advantage Corp. All Rights Reserved.