.NET TIPS

各フォームの共通要素を基本フォームにまとめるには?

デジタルアドバンテージ 一色 政彦
2005/07/15

 Windowsアプリケーションで数多くのフォーム(もしくはユーザー・コントロール)を作成するような場合、「それらのフォーム間(もしくはユーザー・コントロール間)に重複した共通部分(以降、共通要素)が存在する」というのはよくあることだろう。例えば、次の2つのWindowsフォームでは、フォームのヘッダ部分(フォーム上部)とフッタ部分(下部)に同じようなコントロールが配置されている。

共通要素がある2つのWindowsフォーム
この2つのフォームは、それぞれ、ヘッダ部分のTextBoxコントロールに何らかのテキストを入力して[追加]ボタンをクリックすると、中央にあるコントロールに入力したテキストが追加されるという仕様になっている。また、フッタ部分の[閉じる]ボタンをクリックすると、フォームが閉じられる。この2つのフォームのForm1(図左)とForm2(図右)を見比べると、両者に共通する部分が存在することが分かる。
  ヘッダ部分には、Labelコントロール(「ヘッダ部分」というテキスト)とTextBoxコントロールとButtonコントロールが配置されており、それらが2つのフォーム間で共通している。
  Form1の方ではTextBoxコントロールが配置され、Form2の方ではListViewコントロールが配置されている。ここは共通していない。
  フッタ部分には、LabelコントロールとButtonコントロールが配置されており、それらが2つのフォーム間で共通している。

 このように複数のフォームに共通要素がある場合、その共通要素を「基本フォーム」(ユーザー・コントロールの場合は「基本コントロール」)にまとめてしまい、残りの個別の要素を各フォームに実装すればよい。要するに各フォームは、オブジェクト指向の「継承」機能を活用することで、基本フォームの共通要素を再利用するわけだ。これによって、各フォームに散在している重複した内容に関するデザインとコードを減らすことができる。つまり、フォームをリファクタリングできるのである。

 具体的な実装手順は、本稿の例でいえば、次のようになる(ユーザー・コントロールの場合でも、フォームがコントロールに変わるだけで、基本的な作業内容は変わらない)。

基本フォームとなるWindowsフォーム(本稿の例では「BaseForm」)を新規作成する

その基本フォームに、共通要素(本稿の例では「ヘッダ部分」と「フッタ部分」)を実装する

既存の各フォーム(本稿の例では「Form1」と「Form2」。上の画面を参照)で実装されている共通要素を削除する

各フォームの継承元クラスを「System.Windows.Forms.Form」(Windowsフォーム)から、で作成した「BaseForm」(基本フォーム)に変更する

 次の画面は、Visual Studio .NET(以降、VS.NET)を使って、これらの手順を実践しているところだ。

VS.NETで各フォームの共通要素を基本フォームにまとめる手順
VS.NETを使って、各フォームの共通要素を「基本フォーム」にまとめているところ。
  基本フォームとなるWindowsフォーム(本稿の例では「BaseForm」)を新規作成する。
  その基本フォームに、共通要素(本稿の例では「ヘッダ部分」と「フッタ部分」)を実装する。なおこの際、既存のWindowsフォーム(本稿の例では「Form2」など)からいったんすべてのコントロールをコピーして基本フォームへ貼り付け、そこから不要なものを削除すれば、ここでの作業がより楽になる。
  既存の各フォーム(本稿の例では「Form1」と「Form2」。上の画面を参照)に実装されている共通要素を削除する。

 そして最後にの「各フォームの継承元クラスの変更」を行う。これは具体的には、次のようにコードを書き換える。

public class Form2 : System.Windows.Forms.Form
            ▼
public class Form2 : BaseForm
Public Class Form1
  Inherits System.Windows.Forms.Form
            ▼
Public Class Form1
  Inherits BaseForm
各フォームの継承元クラスの変更(上:C#、下:VB.NET)

 以上の作業が完了したら、いったんソリューションをビルドしよう(以下のようにWindowsフォーム・デザイナで派生フォームの内容が正しく表示されるようにするためには、この作業が必須である)。

 そして、各フォーム(派生フォーム)をVS.NETのWindowsフォーム・デザイナで開くと、基本フォーム上のコントロールが派生フォーム上にも(派生フォーム上のコントロールと同じように)表示される。次の画面が実際に派生フォームを開いたところだ。

Windowsフォーム・デザイナで開いた「基本フォームを継承した派生フォーム」
VS.NETのWindowsフォーム・デザイナで派生フォームを開くと、基本フォーム上のコントロールも同時に表示される(赤枠の部分)。基本フォーム上のコントロールは、その左上にマークが表示されるのですぐに見分けが付く。

 この画面をよく見ると分かるように、基本フォーム上のコントロールはその左上にマークが表示される(派生フォーム上のコントロールには表示されない)。これにより、コントロールが派生フォーム上のものか、基本フォーム上のものかを判別できる。

 だが実は、このままの状態では、派生フォームを実際に実装していくうえで問題が発生する可能性がある。

 その問題とは、「派生フォーム側から基本フォーム上のコントロールへアクセスできない」ということである。

 例えば、ヘッダ部分のTextBoxコントロールのテキスト内容を読み取ろうとしても、Textプロパティへのアクセスが拒否されてしまうことがある(具体的には例えば、VS.NETでのビルド時に「'WindowsApplication1.BaseForm.button1' はアクセスできない保護レベルになっています。」というようなエラーが発生する)。また、せっかく基本フォーム上のコントロールが表示されているにもかかわらず、それらのコントロールの位置を動かすことができない。

 これらの問題を回避する方法については、「TIPS:基本フォームから継承された内容を派生フォームでカスタマイズするには?」で紹介している。End of Article

カテゴリ:Windowsフォーム 処理対象:ウィンドウ
カテゴリ:Windowsフォーム 処理対象:Windowsフォーム・デザイナ
関連TIPS:基本フォームから継承された内容を派生フォームでカスタマイズするには?
 
この記事と関連性の高い別の.NET TIPS
基本フォームから継承された内容を派生フォームでカスタマイズするには?
Windowsフォームでフォームのコレクションを使用するには?
コントロールに対するキー入力をフォームで処理するには?
Windowsフォーム上のすべてのコントロールを列挙するには?
Windowsフォームで簡単に画像を表示するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間