スタートアップフォームの登録と設定
WTWorkplaceControllerは、呼び出す側と呼び出される側の両モジュールの橋渡しとなります。サンプルのForm1ファイルは、ワークプレースとモジュールを使った例です。Form1には、IWTWorkplaceのワークプレースが2つあります。そのうちの1つ目に、メニューの役割を果たすIWTModule(Dashboard)をロードします。メニュー項目からは、同じワークプレースまたは右側のワークプレースに対し、さまざまなサンプルモジュールを起動します。このVisual WebGUIプロジェクトでは、Form1をスタートアップフォームとして設定する必要があります。
Visual WebGUIでは、同じアプリケーションに対して複数のフォームをスタートフォームとして設定できます。これらのフォームはそれぞれ別のアプリケーションとみなされます。各フォームには、.wgxという拡張子を使って関連する名前を付けることができます。この名前は、フォームの実際の名前と異なっていても構いません。
スタートフォームを設定するには、まずプロジェクトをビルドします。次に、[プロジェクトのプロパティ]ダイアログボックスを開き、[登録]タブをクリックします。[登録]タブは、Visual WebGUIプロジェクトでのみ表示される特別なタブです(図2を参照)。[登録]タブが表示されない場合は、プロジェクトでVisual WebGUIを有効にする必要があります(詳細については第1回の記事を参照)。
[登録]タブの[アプリケーション]の表で、ソリューションのさまざまな開始位置を設定できます。図2にあるように、最上部のボタンでは、ソリューションで定義されたフォームを選択し、アプリケーション(開始点)として登録できます。2番目のボタンでは、アプリケーションの登録解除や、削除または名前の変更が可能です。3番目のボタンでは、フォームに対応するアプリケーション名を変更できます。例えば、フォームの名前はfrmHumanResources.frmとしたいが、アクセスするときの名前はHumanResources.wgxにしたいとします。この場合、frmHumanResources.frmのアプリケーション名を変更すればOKです。
Webサーバに配置したアプリケーションにブラウザからアクセスするときには、どのフォームからでもアプリケーションを開始できますが、Visual Studio内で開始するときには、単一のスタートアップWebページを指定する必要があります。これは、[プロジェクトのプロパティ]の[Web]セクションで行います。[開始動作]を[ページを指定する]に設定し、[登録]セクションでVisual WebGUIアプリケーションとして指定した、いずれかのフォームのアプリケーション名を指定します(図3を参照)。
イベントを利用した柔軟な構造での設計
モジュール間で柔軟性のあるやり取りを円滑に進めるために、この例では、2つのデリゲートと、対応するジェネリックEventArgsクラスを使用します。これにより、モジュール間であらゆるデータを受け渡すことができます。EventArgsクラスとそのデリゲートを図4に示します。
WTGenericEventHandlerデリゲートはWTGenericEventArgsと、WTCancelGenericEventHandlerはWTCancelGenericEventと、それぞれ組み合わせて使用します。
WTGenericEventArgsクラスでは、任意のデータを独自に追加できるため、イベントを発生させるオブジェクトと、そのイベントにサブスクライブするオブジェクトとの間で、データ交換を行いやすくなります。表4はこのクラスのプロパティとメソッドです。
| プロパティ | 説明 |
| string EventType { get; set; } |
イベントの識別子または名前を表すオプションの値です。イベントハンドラはこの値に基づいてイベントデータの扱い方を判断できます。たとえば、複数のコンポーネントからのイベントを監視するイベントディスパッチャの場合、どのターゲットコンポーネントがイベントを受け取るべきかを判断するときにEventTypeを使用できます |
| bool IsEventDataAvailable { get; } |
イベント引数にカスタムデータがある場合にtrueを返します(たとえば、EventDataメンバを実装したHashtableがnullでない場合、何らかのオブジェクトを保持しています) |
| メソッド | 説明 |
| void AddEventData( string key, object data) |
イベント引数にキーと値のペアでデータを追加します。データは後からイベントハンドラで取り出せます |
| void RemoveEventData( string key) |
指定したキーのデータをイベント引数から削除します |
| void ClearEventData() | イベントデータをすべて消去します |
| bool CheckEventDataExists( string dataKey) |
指定したキーに対応するイベントデータが存在するかどうかを確認します |
WTGenericEventArgsクラスはインデクサプロパティを実装しているため、イベントデータの設定と取得は、次のコードのように簡単に行えます。
// . . . WTCancelGenericEventArgs evt = new WTCancelGenericEventArgs(); evt["Name"] = textName.Text; evt["Age"] = textAge.Text; evt["City"] = textCity.Text; string userName = evt["Name"]; // return the name // if data for a certain key was not set // returns null string userCountry = evt["Country"]; // userCountry is null
また、IEnumerableインターフェースも実装しているため、イベントのすべてのデータを取得するときにforeachを使用できます。
WTCancelGenericEventArgsは、WTGenericEventArgsを継承し、Cancelプロパティを実装しています。IWTModuleのCloseイベントハンドラはWTCancelGenericEventHandler型です。呼び出された側のモジュールから呼び出し側モジュールにイベントデータを渡すだけでなく、キャンセルで終了したかどうかを呼び出し側のモジュールで確認できて便利です。その場合は更新処理を行う必要がなく、キャンセルに対応するための追加的な処理を実行できます。

![図2 アプリケーションの設定:アプリケーションのスタートアップフォームとして複数のフォームを設定できる。設定はVisual WebGUIプロジェクトの[登録]タブで行う](http://cz-cdn.shoeisha.jp/static/images/article/4395/02s.gif)
![図3 Visual Studioのスタートアップフォーム:開始動作を[ページを指定する]に設定し、Visual Studioでアプリケーションを起動するページを選択する](http://cz-cdn.shoeisha.jp/static/images/article/4395/03s.gif)
