|
.NET TIPS 基本フォームから継承された内容を派生フォームでカスタマイズするには?デジタルアドバンテージ 一色 政彦2005/07/15 |
![]() |
|
|
|
「TIPS:各フォームの共通要素を基本フォームにまとめるには?」では、複数のWindowsフォーム(もしくはユーザー・コントロール)に共通する部分(以降、共通要素)を、基本フォーム(ユーザー・コントロールの場合は「基本コントロール」)にまとめる方法を紹介した。各フォームでは、この基本フォームを継承するだけで、共通要素(コントロールなど)を再利用できるようになる。
しかし、基本フォームを継承した派生フォーム側から、基本フォーム上のコントロールへアクセスしようとすると、アクセスが拒否されてしまう(例えば、フォーム上に配置されたTextBoxコントロールのTextプロパティを取得しようとするコードを記述すると、Visual Studio .NETでビルドするときに失敗する)。
次の画面は、派生フォーム上に表示されている基本フォーム上のコントロールへのアクセスができないことを示す例である(この例では、コントロールの移動やプロパティ設定ができない)。
![]() |
||||||
| 派生フォーム側からアクセスできない基本フォーム上のコントロール | ||||||
| 本稿で使用するサンプル・プログラムは、「TIPS:各フォームの共通要素を基本フォームにまとめるには?」と同じものである。この画面は、このサンプル・プログラムにある、基本フォーム(BaseForm)から派生した派生フォーム(Form2)を、Visual Studio .NETのWindowsフォーム・デザイナで開いたところ。派生フォーム側から基本フォーム上のコントロールにアクセスしようとすると、アクセスが拒否されてしまう。 | ||||||
|
本稿では、このようなアクセス拒否に関する問題を回避して、各派生フォーム側で、基本フォーム上のコントロールにアクセスしたり、移動したりできるようにする方法を紹介する(ユーザー・コントロールの場合も基本的に同じ作業を行えばよい)。なお本稿では、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」のアクセス許可が適切だろう。 | ||||||
|
この作業により、次の画面のように、基本フォーム上のコントロールが持つ各種プロパティに対して、派生フォーム側からアクセスできるようになる。
![]() |
||||||
| 派生フォーム側からアクセスできるようなった基本フォーム上のコントロール | ||||||
| Modifiersプロパティの値を「Protected」に変更した(基本フォーム上の)コントロールは、派生フォーム側でアクセスできるようになる。 | ||||||
|
上の画面のようにして、派生フォーム側で基本フォーム上のコントロールのプロパティ設定や移動などを行った場合、それらの値は基本フォーム自体の設定を書き換えるわけではなく、派生フォーム側にそのカスタムの設定内容だけが保存される。つまり、基本フォーム上のコントロールの設定内容は、派生フォーム側のカスタム設定内容によって上書きされるという仕組みになっている。
またこの状態で、Windowsフォーム・デザイナ上のButtonコントロール(例えば、[追加]ボタン)をダブルクリックすると、そのClickイベント・ハンドラが追加できる。次のコードは、基本フォームから継承したコントロールのClickイベント・ハンドラを、派生フォーム側で実装した例だ。
|
||
| 基本フォーム上のコントロールのClickイベント・ハンドラの派生フォーム側での実装(上:C#、下:VB.NET) |
なお、基本フォームと派生フォームの両方にClickイベント・ハンドラを実装した場合には、基本フォーム→派生フォームの順で実行されることになる。![]()
| カテゴリ:Windowsフォーム 処理対象:ウィンドウ カテゴリ:Windowsフォーム 処理対象:Windowsフォーム・デザイナ 関連TIPS:各フォームの共通要素を基本フォームにまとめるには? 関連TIPS:Windowsフォーム上のコントロールの位置やサイズを固定するには? |
|
||||||||||||||||||||||||||||
| 「.NET TIPS」 |
TechTargetジャパン
- 新人プログラマーのためのInsider.NETの歩き方 2012 (2012/5/22)
晴れて.NETプログラマーとなる新人が効率的に開発技術を習得するには? 大量にある記事群の中から新人が読むべきお勧めを厳選して紹介 - jQuery MobileでJavaScriptプログラミング (2012/5/17)
jQuery Mobileは手軽なだけでなく、JavaScriptのAPIも充実しており、独自機能の実装もできる。今回は「グローバル設定」と「イベント」を解説 - Windows上で開発するための開発環境構築入門 (2012/5/16)
Windowsを使ってチームで開発している? なのにサーバOSを設定・運用した経験がない? そうなら、今すぐ学ぼう - 「コントラクト」でアプリのサンドボックスを乗り越える! (2012/5/11)
Metroスタイル・アプリはサンドボックスの中で動作する。それを乗り越えてほかのアプリと連携する仕組み「コントラクト」を解説
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -





