[方法] InfoPath 2003 オブジェクト モデルを使用してエラーを処理する方法
カスタム アプリケーションを作成する際、開発者はしばしばエラー ハンドリングを行わなければなりません。これには、アプリケーションで発生したエラーをチェックするプログラム コードや、カスタム エラーを作成して発生させるプログラム コードの記述などの作業が伴います。InfoPath 2003 互換オブジェクト モデルでは、ErrorObject オブジェクトと ErrorsCollection コレクションを組み合わせて使用することによるエラー ハンドリングがサポートされています。
InfoPath では、フォームに入力されたデータが XML スキーマ検証に失敗したとき、カスタム検証制約に違反があったとき、DataDOMEventObject オブジェクトの ReportError メソッドによりエラーが生成されたとき、および ErrorsCollection コレクションの Add メソッドを使用してエラーが作成されたときにエラーが発生します。
ErrorsCollection コレクションの概要
ErrorsCollection コレクションには、次のメソッドとプロパティがあります。フォームの開発者は、これらを使用することにより、コレクションに含まれている ErrorObject オブジェクトを管理できます。
名前 | 説明 |
---|---|
Add メソッド |
ErrorObject オブジェクトを作成し、それをコレクションに追加します。 |
Delete メソッド |
指定した XML ノードと条件名に関連付けられている、ReportError メソッドを使用して追加したカスタム エラー以外のすべての ErrorObject オブジェクトを削除します。 |
DeleteAll メソッド |
コレクションに含まれているすべての ErrorObject オブジェクトを削除します。 |
Count プロパティ |
コレクションに含まれている ErrorObject オブジェクトの数を取得します。 |
Item プロパティ |
指定したインデックス番号に基づく ErrorObject オブジェクトへの参照を取得します。 |
ErrorObject オブジェクトの概要
ErrorObject オブジェクトには、次のプロパティがあります。フォームの開発者は、これらを使用することにより、発生したエラーに関する情報にアクセスできます。
名前 | 説明 |
---|---|
ConditionName プロパティ |
ErrorObject オブジェクトの型に応じて、エラー条件の名前を取得するか、または null を返します。 |
DetailedErrorMessage プロパティ |
ErrorObject オブジェクトの詳細なエラー メッセージを取得または設定します。 |
ErrorCode プロパティ |
ErrorObject オブジェクトのエラー コードを取得または設定します。 |
Node プロパティ |
ErrorObject オブジェクトに関連付けられている XML ノードへの参照を取得します。 |
ShortErrorMessage プロパティ |
ErrorObject オブジェクトの短いエラー メッセージを取得または設定します。 |
ErrorType プロパティ |
ErrorObject オブジェクトの型を取得します。 |
ErrorsCollection および ErrorObject を使用する
ErrorsCollection コレクションにアクセスするには、XDocument オブジェクトの Errors プロパティを使用します。ErrorsCollection コレクションはフォームの基になる XML ドキュメントと関連付けられているため、エラー発生時にはエラーは XML ドキュメント内で発生します。次の例は、Visual C# の foreach ループを使用して、フォームの基になる XML ドキュメント内にあるエラーをチェックする方法を示します。エラーがある場合は、関数で各エラーをループ処理し、ErrorObject オブジェクトの ShortErrorMessage プロパティを使用してメッセージをユーザーに表示します。
public void CheckErrors(IXMLDOMNode xmlNode)
{
foreach(ErrorObject err in thisXDocument.Errors)
{
if(xmlNode==err.Node)
thisXDocument.UI.Alert("The following error has occured: "
+ err.ShortErrorMessage + ".");
}
}
上の関数は、フォームのデータ検証イベントハンドラの 1 つから呼び出すことができます。たとえば、フォーム内のフィールドの OnAfterChange イベント ハンドラ内で使用する場合なら、次に示すように DataDOMEventObject オブジェクトの Site プロパティを使用して、関数の呼び出し時に XML ノードを引数として渡します。
CheckErrors(e.Site);
フォームの開発者は、InfoPath により生成されたエラーの処理に加えて、DataDOMEventObject オブジェクトの ReportError メソッドまたは ErrorsCollection コレクションの Add メソッドを使用してカスタム エラーを発生させることもできます。ReportError メソッドおよび Add メソッドの使用方法の詳細については、このトピックの先頭にあるメソッド名をクリックしてください。
マネージ コードの例外を処理する
try-catch 例外処理を使用すると、次のコードに示すようにマネージ コード フォーム テンプレート内で発生した例外を処理することができます。
DataAdapters dataAdapters;
dataAdapters = thisXDocument.DataAdapters;
XMLFileAdapterObject queryXMLFile =
(XMLFileAdapterObject)dataAdapters["form1"];
// Perform the query.
try
{
queryXMLFile.Query();
}
catch (Exception ex)
{
thisXDocument.UI.Alert("Failed to query.\n\n" + ex.Message);
}
// Perform the submit.
try
{
queryXMLFile.Submit();
}
catch (Exception ex)
{
thisXDocument.UI.Alert("Failed to submit.\n\n" + ex.Message);
}
フォーム コード内で try-catch 例外処理を使用していないと、Visual Studio .NET でのデバッグ中およびプレビュー中に、未処理の例外に関する情報が InfoPath によって InfoPath のエラー ダイアログ ボックスに表示されます。また、既定では、マネージ コード フォーム テンプレートを展開した場合の実行時には、未処理の例外は Info Path エラー ダイアログ ボックスに表示されません。実行時に未処理の例外に関する情報を表示するには、次の手順を使用します。
未処理のマネージ コード例外の実行時の通知を有効にする
InfoPath を開きます。
[ツール] メニューの [オプション] をクリックします。
[詳細設定] タブで、[マネージ コード エラーを表示する] チェック ボックスをオンにします。