[方法] オフライン ソリューションを操作する方法
InfoPath オブジェクト モデルに用意されている Application クラスの MachineOnlineState プロパティを使用すると、ユーザーのコンピュータがネットワークに接続されているかどうかをフォーム コードで確認できます。MachineOnlineState プロパティの値を確認することにより、接続の状態に応じてフォーム コードで異なる処理を実行できます。
MachineOnlineState プロパティを使用する
次の例では、ユーザーのコンピュータがオンラインかオフラインかに基づいてフォームを送信する方法を決定するロジックを、フォーム コードに追加する方法を示します。
この例では、販売報告書を送信するためのフォームが既に作成されているものとします。フォームには、報告書の対象期間 (年と月) を指定する period というフィールドがあります。また、データ接続、およびユーザーがオンラインのときに報告書を送信するロジックも既に定義されているものとします。
フォームを電子メール メッセージの添付ファイルとして送信するデータ接続を追加する
InfoPath マネージ コード フォーム テンプレートを作成します。
InfoPath デザイン モードで、[ツール] メニューの [データ接続] をクリックします。
[データ接続] ダイアログ ボックスで、[追加] をクリックします。
データ接続ウィザードで、[データの送信] をクリックし、[次へ] をクリックします。
ウィザードの次のページで、[電子メール メッセージとして送信] をクリックし、[次へ] をクリックします。
ウィザードの次のページで、[宛先] ボックスに自分の電子メール アドレスを入力します。
[件名] ボックスで次の操作を行い、販売期間と "Sales Report" という文字列を結合します。
[件名] ボックスの横の [数式] ボタンをクリックします。
[数式の挿入] ダイアログ ボックスで、[関数の挿入] をクリックします。
[関数の挿入] ダイアログ ボックスで、[カテゴリ] ボックスの一覧の [文字列] をクリックします。次に、[関数] ボックスの一覧の [concat] をダブルクリックします。
[ダブルクリックしてフィールドを挿入してください] の最初のインスタンスを、"Sales Report: " という文字列 (単一引用符を含む) に置き換えます。
[ダブルクリックしてフィールドを挿入してください] の 2 番目のインスタンスをダブルクリックします。
[フィールドまたはグループの選択] ダイアログ ボックスで、period フィールドを選択します。
[ダブルクリックしてフィールドを挿入してください] の最後のインスタンスを削除し、[OK] をクリックします。
ウィザードで、[次へ] をクリックします。
ウィザードの次のページで、[添付ファイル名] ボックスの横の [数式] ボタンをクリックします。上記の手順を繰り返して concat("Sales Report - ", period) という式を作成し、[次へ] をクリックします。
ウィザードの最後のページで、[このデータ接続の名前を入力してください] ボックスに「E-mail Submit」と入力し、[完了] をクリックします。
ユーザーのコンピュータの接続状態に応じてフォームを送信するロジックを追加する
InfoPath デザイン モードで、[ツール] メニューの [送信オプション] をクリックします。
[送信オプション] ダイアログ ボックスで、[ユーザーによるこのフォームの送信を許可する] をクリックします。次に、[フォームコードを使用したユーザー設定送信] を選択し、[コードの編集] をクリックします。
Submit イベント ハンドラの下に、次の 2 つの関数を追加します。
public void OnlineSubmit(SubmitEventArgs e) { // Logic for submitting online goes here. } public void OfflineSubmit(SubmitEventArgs e) { // Access and submit to the e-mail connection. DataConnectionCollection myDataConnections = this.DataConnections; EmailSubmitConnection submitConnection = (EmailSubmitConnection)myDataConnections["E-mail Submit"]; submitConnection.Execute(); // Notify the user that the form was submitted offline. System.Text.StringBuilder myMessage = new System.Text.StringBuilder(); myMessage.Append("You submitted your Sales Report offline. "); myMessage.Append("Your Sales Report is in your outbox "); myMessage.Append("and will be submitted when you connect to "); myMessage.Append("the network."); MessageBox.Show(myMessage.ToString()); // The submission was successful. e.CancelableArgs.Cancel = false; }
Public Sub OnlineSubmit(ByVal e As SubmitEventArgs) ' Logic for submitting online goes here. End Sub Public Sub OfflineSubmit(ByVal e As SubmitEventArgs) ' Access and submit to the e-mail connection. Dim myDataConnections As DataConnectionCollection = _ Me.DataConnections Dim submitConnection As EmailSubmitConnection = _ DirectCast(myDataConnections("E-mail Submit"), _ EmailSubmitConnection) submitConnection.Execute ' Notify the user that the form was submitted offline. Dim myMessage As System.Text.StringBuilder = _ New System.Text.StringBuilder() myMessage.Append("You submitted your Sales Report offline. ") myMessage.Append("Your Sales Report is in your outbox ") myMessage.Append("and will be submitted when you connect to ") myMessage.Append("the network.") MessageBox.Show(myMessage.ToString()) ' The submission was successful. e.CancelableArgs.Cancel = False End Sub
FormEvents_Submit イベント ハンドラ関数に、次の if ステートメントを追加します。
// Check the computer's connection state. if (this.Application.MachineOnlineState == MachineState.Online) { OnlineSubmit(e); } else { OfflineSubmit(e); }
' Check the computer's connection state. If (Me.Application.MachineOnlineState = MachineState.Online) Then OnlineSubmit(e) Else { OfflineSubmit(e) End If
コードをテストする
[デバッグ] メニューの [デバッグ開始] をクリックします。
フォームにデータを入力します。
Microsoft Internet Explorer を起動します。
Internet Explorer で、[ファイル] メニューの [オフライン作業] をクリックします。
InfoPath で、[送信] をクリックします。フォームが電子メール メッセージとして送信されることを示すメッセージが表示されます。
[送信] をクリックします。フォームがオフラインで送信されたこと、およびネットワーク接続時に送信されることを示すメッセージが表示されます。