Greg Collins
in

InfoPath Dev

This Blog

Syndication

Archives

Greg Collins

  • Internet Explorer のクロスドメイン セキュリティのダイアログ ボックスが表示されないようにする

    Internet Explorer は、既定の設定の場合、InfoPath フォームが複数のドメインにまたがってデータにアクセスするときに警告を表示することがあります (図 1 を参照)。タイトル バーのラベルが "Internet Explorer" になっているのは、InfoPath ではなく Internet Explorer がセキュリティ上のリスクを警告していることを示します。これはセキュリティの点では有用ですが、制御された環境で作業している場合は、このダイアログ ボックスがわずらわしくなってくることがあります。


    図 1 Internet Explorer のクロスドメイン データ アクセスのセキュリティ リスクを通知するダイアログ ボックス

    たとえば、New メソッドまたは NewFromSolutionWithData メソッドを初めて使用するときに、図 1 のようなセキュリティ警告ダイアログ ボックスが表示されます。[はい] をクリックすると、メソッドは想定どおりに処理を行います。[いいえ] をクリックすると、アクセスが拒否されたことを通知するエラー ダイアログ ボックスが表示され、メソッドは失敗します。この警告ダイアログ ボックスが表示されるのは、フォームの使用中に 1 回だけです。それ以降は、このボックスの選択が既定で再使用されます。新しく選択し直すには、フォームを閉じて開き直す必要があります。

    フォームを Web サーバーに発行している場合は、このダイアログ ボックスが表示されないことがあります。フォーム テンプレートに完全な信頼を設定するか、またはダイアログ ボックスを無効する方法で、このダイアログ ボックスが表示されないようにすることができます。

    このタスクでは、Internet Explorer のセキュリティ設定を変更して、Internet Explorer のセキュリティ リスクのダイアログ ボックスを無効にします。この変更によってダイアログ ボックスが表示されなくなるのは、設定が変更されたマシン上だけです。

    Internet Explorer のセキュリティ リスクのダイアログ ボックスを無効にする

    1. [ツール] メニューの [インターネット オプション] をクリックします。
    2. [インターネット オプション] ダイアログ ボックスの [セキュリティ] タブで、Web コンテンツのゾーンとして [イントラネット] をクリックし、[レベルのカスタマイズ] をクリックします。
    3. [その他/ドメイン間でのデータ ソースのアクセス] 設定を探し、[有効にする] をクリックします (図 2 を参照)。
    4. [OK] をクリックし、表示される警告ダイアログ ボックスで [はい] をクリックします。
    5. [OK] をクリックして、[インターネット オプション] ダイアログ ボックスを閉じます。


    図 2 Internet Explorer でのクロスドメイン データ アクセスを有効にします。

    これらの Internet Explorer セキュリティ オプションは、マシンごとの設定です。ソフトウェア展開の一環としてこのソリューションの使用を選択する場合は、フォームを使用する各マシンで、前述の手順に従う必要があります。

    ©2005 Greg Collins. All rights reserved. Licensed to Autonomy Systems, LLC for display on InfoPathDev.com.

    英文記事: Prevent the Internet Explorer Cross-Domain Security Dialog Boxからの翻訳

  • パラメータ化されたアクティブ サーバー ページからリンク画像を表示する

    フォームに、フィールド値に基づいてカスタム画像を表示することが必要になる場合があります。これは、パラメータをとるアクティブ サーバー ページ (ASP: Active Server Page) を使用して実行できます。ASP は、バーコード、地図、写真などの画像を返すことができます。フォームでは、リンク画像コントロールを使用します。

    このタスクでは、リンク画像のバインドを設定して、メイン データ ソースの 2 つのフィールド値を使用して ASP から画像を取得する方法を説明します。ここでは、パラメータを受け取って画像を返すことができる ASP が既に存在することを前提としています。まず、新しい空白のフォームを作成しておきます。

    メイン データ ソースにパラメータ フィールドを追加する

    1. [データ ソース] 作業ウィンドウを開きます。
    2. Param1」および「Param2」という名前の 2 つのテキスト フィールドを追加します。

    カスタムのリンク画像のバインドを作成する

    1. [コントロール] 作業ウィンドウを開きます。
    2. ビューに画像を挿入します。
    3. [画像コントロールの挿入] ダイアログ ボックスで、[リンクとして挿入する] をクリックし、[OK] をクリックします。
    4. ビューの画像コントロールをダブルクリックします。
    5. [画像のプロパティ] ダイアログ ボックスで、XPath を以下と置き換えます。

    concat("http://server/picture.asp?param1=", my:Param1, "&param2=", my:Param2)

    使用しているサーバー、ASP、およびパラメータの名前に合わせて、URL を適切に修正します。

    1. [ユーザーに新しい画像の参照を許可する] チェック ボックスをオフにして、[OK] をクリックしします。

    確認

    フォームをプレビューします。URL が有効で ASP が適切に動作している場合は、Param1 および Param2 に有効な値を入力したときに、適切に更新された画像が表示されます。

    ©2004 Greg Collins. All rights reserved. Licensed to Autonomy Systems, LLC for display on InfoPathDev.com.

    英文記事: Display a Linked Picture from a Parameterized Active Server Pageからの翻訳

  • フォーム テンプレートを InfoPath キャッシュから削除する

    フォーム テンプレートを削除したのに、引き続きそのフォーム テンプレートでフォームが開かれることがあります。これを奇妙に思われるかもしれませんが、InfoPath がフォーム テンプレートをキャッシュすることがわかれば納得できるでしょう。物理コピーは削除されていますが、キャッシュされているフォーム テンプレートがまだ残っているのです。

    フォーム テンプレートは、InfoPath で初めて使用されるときにキャッシュされます。これによって、オンライン上に公開された InfoPath フォームをオフラインでも使用できます。また、性能も向上します。物理フォーム テンプレートとキャッシュ フォーム テンプレートの両方が削除されると、それを使用するフォームを InfoPath で開くことができなくなります。

    フォーム テンプレートの物理コピーを削除せずに、InfoPath キャッシュからフォーム テンプレートを削除することもできます。これは、フォームの開発中に、適用した変更を表示するときなどに必要になります。このタスクでは、フォーム テンプレートを InfoPath キャッシュから削除する方法を説明します。

    キャッシュからフォーム テンプレートを削除する

    1. InfoPath を起動します。
    2. [フォームの入力] ダイアログ ボックスの [すべてのフォーム] カテゴリをクリックします。
    3. InfoPath キャッシュから削除するフォーム テンプレートを選択します。

      目的のフォーム テンプレートが一覧に含まれていない場合は、[フォームの入力] ダイアログ ボックスの左上の [フォームのカテゴリ] の一覧から [すべてのフォーム] を選択します。
    4. ダイアログの右上の [フォームのタスク] の一覧から [このフォームの削除] をクリックします。
    5. InfoPath を終了します。

    確認

    フォーム テンプレートの物理コピーおよびキャッシュ コピーの両方を削除したら、そのフォーム テンプレートから作成されたフォーム ファイルを開きます。まだ InfoPath は起動されますが、フォーム テンプレートが見つからないことを通知する警告ダイアログ ボックスが表示されます。

    InfoPath 以外で フォームの XML を開く

    フォームが InfoPath で起動されないようにする場合は、フォームから (処理命令と呼ばれます) 2 つの タグを削除する必要があります。Notepad などのテキスト エディタを使用して、フォームの .xml ファイルから次の 2 つの処理命令を削除します。

    <?mso-infoPathSolution . . . ?>
    <?mso-application . . . ?>

    ©2004 Greg Collins. All rights reserved. Licensed to Autonomy Systems, LLC for display on InfoPathDev.com.

    英文記事: Remove a Form Template from the InfoPath Cacheからの翻訳

  • ファイルのダウンロードでセキュリティの警告が表示されないようにする

    InfoPath 2003 SP1 のインストール後、Web サイトまたは SharePoint から InfoPath フォーム テンプレート (図 1 を参照) またはフォーム (図 2 を参照) を開こうとすると、新しい [ファイルのダウンロード] ダイアログ ボックスが表示されるようになったのにお気づきかもしれません。これらの警告ダイアログ ボックスをわずらわしく感じる場合は、次の手順で表示されないようにすることができます。


    図 1 InfoPath フォーム テンプレートの [ファイルのダウンロード] ダイアログ ボックス


    図 2 InfoPath フォームの [ファイルのダウンロード] ダイアログ ボックス

    InfoPath フォーム テンプレートの [ファイルのダウンロード] ダイアログ ボックスが表示されないようにする

    InfoPath フォーム テンプレートの [ファイルのダウンロード] ダイアログ ボックスが表示されないようにする方法は 2 つあります。最も簡単な方法は、[ファイルのダウンロード] ダイアログ ボックスの一番下にある [この種類のファイルであれば常に警告する] チェック ボックスをオフにする方法です (図 1 を参照)。2 つ目の方法については、次の手順に従います。

    1. Windows エクスプローラの [ツール] メニューの [フォルダ オプション] をクリックします。
    2. [フォルダ オプション] ダイアログ ボックスの [ファイルの種類] タブで、「XSN」と入力します。

      リスト ボックスが自動的にスクロールして、[Microsoft Office InfoPath フォーム テンプレート] が選択されます。
    3. [詳細設定] をクリックします。
    4. [ダウンロード後に開く確認をする] チェック ボックスをオフにし、[OK] をクリックします。

    InfoPath フォームの場合に [ファイルのダウンロード] ダイアログ ボックスが表示されないようにする

    1. [登録されているファイルの種類] ボックス内をクリックしてフォーカスを設定し、「INFO」と入力します。
    [登録されているファイルの種類] ボックスが自動的にスクロールして、[Microsoft Office InfoPath 1.0 XML ドキュメント] が選択されます。これを図 3 に示します。


    図 3 ファイルの種類として InfoPath XML ドキュメントを選択します。

    1. [詳細設定] をクリックします。
    2. [ダウンロード後に開く確認をする] チェック ボックスをオフにし (図 4 を参照)、[OK] をクリックします。


    図 4 [ファイルのダウンロード] ダイアログ ボックスが表示されないようにします。

    1. [閉じる] をクリックします。

    以上の変更により、Web サイトまたは SharePoint から InfoPath フォーム テンプレートまたはフォームを開いても、この警告ダイアログ ボックスは表示されなくなります。

    これらの手順の配備は簡単ではありませんが、今後、別のオプションが出てくる可能性もあります。それまでは、ユーザーがダイアログ ボックスの [開く] をクリックするか、前述の手順に従ってダイアログ ボックスが表示されないようにすることができます。

    ©2004 Greg Collins. All rights reserved. Licensed to Autonomy Systems, LLC for display on InfoPathDev.com.

    英文記事: Prevent the File Download Security Warningの翻訳

  • .XML 以外の拡張子のファイルを InfoPath で開く

    企業や個人でしばらく XML ファイルを使用していると、.xml 以外のファイル拡張子のファイルが多数できることがあります。これらのファイルの拡張子が .xdf (XML データ ファイル) であるとします。InfoPath では、これらの .xdf ファイルを、その拡張子のままでメイン データ ソースまたはセカンダリ データ ソースとして使用できます。InfoPath では、ファイルに有効な XML が含まれていれば、.xdf 拡張子を含む完全パスおよびファイル名を入力するだけで、ファイルを使用できます。

    このタスクでは、これらの .xdf ファイルをダブルクリックしたときに InfoPath で開く方法を説明します。以下に示すように、これはわずかな変更で実現できます。

    InfoPath で開く .xdf ファイルを準備する

    .xdf ファイルの冒頭に、処理命令 (PI: Processing Instructions) と呼ばれる 2、3 行の XML コードを配置する必要があります。これらの PI は、既存の InfoPath .xml ファイルの冒頭に置かれています。PI は、使用する .xdf ファイルと一緒に開くフォーム テンプレートを使用して作成されたファイルから取得する必要があります。また、InfoPath フォームの名前空間を .xdf ファイルのルート要素で宣言する必要があります。これらの変更について説明します。

    XML 宣言の処理命令

    <?xml version="1.0" encoding="UTF-8"?>

    .xdf ファイルの最初の行は XML 宣言の PI です。通常はこれをそのままコピーできますが、UTF-8 以外のエンコーディングを使用している場合は、適宜修正します。

    InfoPath 処理命令

    <?mso-infoPathSolution name="..." solutionVersion="1.0.0.1" productVersion="11.0.6357" PIVersion="1.0.0.0" href="..." ?>

    .xdf ファイルの 2 行目は InfoPath mso-infoPathSolution PI です。これは、InfoPath によってさまざまな目的で使用されます。ここでは属性ごとの説明は省きますが、これらは、作成済みの最新バージョンのフォーム テンプレートで作成されるフォームと一致するはずです。

    <?mso-application progid="InfoPath.Document"?>

    .xdf ファイルの 3 行目は InfoPath mso-application PI です。これは、ファイル システムに、このファイルが InfoPath に属していることを通知します。

    InfoPath 名前空間

    <RootElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:my="..." xmlns:xd="http://schemas.microsoft.com/office/infopath/2003" xml:lang="en-us">

    宣言する名前空間の数に制限はありません。フォーム テンプレートによって作成される、サンプルの .xml ファイルで宣言されるすべての名前空間が .xdf ファイルのルート要素に存在することを確認する必要があります。

    .xdf ファイルの「開く」アクションを作成する

    ここまでで、.xsd ファイルに PI および名前空間を追加できました。次は、オペレーティング システムに、.xdf ファイルをダブルクリックしたときの処理を通知する必要があります。

    InfoPath で開くために必要なアクションを識別する

    1. Windows エクスプローラの [ツール] メニューの [フォルダ オプション] をクリックします。
    2. [フォルダ オプション] ダイアログ ボックスの [ファイルの種類] タブに「INFOPA」と入力して、INFOPATHXML ファイルの種類にすばやく移動します。
    3. [詳細設定] をクリックします。
    4. [開く] アクションをクリックし、[編集] をクリックします。
    5. このファイルの種類を開くために使用されている情報をコピーします (これを .xdf ファイルで使用します)。
    6. [キャンセル] を 2 回クリックして、[フォルダ オプション] ダイアログ ボックスに戻ります。

    .xdf ファイルを開くアクションを設定する

    1. ファイルの種類のリスト内をクリックしてフォーカスを設定します。
    2. XDF」と入力して、サンプルの XDF ファイルの種類にすばやく移動します。
    3. [詳細設定] をクリックします。
    4. [開く] アクションが存在する場合は [編集] をクリックします。ない場合は [新規] をクリックして作成します。
    5. 前にコピーしていた情報を入力します。
    6. [OK] を 3 回クリックして、設定を保存します。

    確認

    これで完了です。更新した .xdf ファイルのいずれかをダブルクリックして、InfoPath で開きます。

    ©2004 Greg Collins. All rights reserved. Licensed to Autonomy Systems, LLC for display on InfoPathDev.com.

    英文記事: Launch Files with Extensions Other Than .XML in InfoPathよりの翻訳

  • 番号付きのリストを続ける

    InfoPath で番号付きリストを作成する際に、最初のリストを中断したところから 2 つ目のリストの番号を付けることが必要になる場合があります。Microsoft Word では、2 つ目のリストの番号を右クリックし、[自動的に番号を振る] をクリックできます。しかし、InfoPath ではこの操作ができません。その代わりに、Word ほど便利ではありませんが、番号を振り直す方法がいくつか用意されています。

    このタスクでは、番号付きのリストを続ける方法を 2 つ紹介します。1 つは特定の数字から番号を振り始める方法、もう 1 つは段落内改行を使用する方法です。どちらのアプローチにも、長所と短所があります。まず、新しい空白のフォームを作成しておきます。

    アプローチ 1 – 特定の数字から番号を振り始める

    あまり目立ちませんが、InfoPath には、[箇条書きと段落番号] 作業ウィンドウの一番下に番号付きリストの開始番号を指定できる機能があります。このアプローチの長所は、2 つのリスト間に配置されたコンテンツを通常の段落として表示できることです。この段落はインデントされず、コンテンツも実際にはリストに含まれていません。また、使用できるコンテンツに制限はありません。一方、短所は 2 つ目のリストの開始番号として選択された数字が固定されるので、1 つ目のリストで項目の増減があった場合に更新が必要になることです。

    項目が 10 個ある番号付きリストを作成する

    1. [段落番号] ツールバー ボタンをクリックして、番号付きリストを作成します。
    2. 番号付きリストに任意の項目を 10 個追加します。

    リストの開始番号を指定する

    1. リストの 5 番目の項目の最後をクリックしてカーソルを配置します。
    2. Enter キーを押し、Backspace キーを押してリストを分けます。
    3. リストに含まれないコンテンツを任意で追加します。
    4. 2 つ目のリストの最初をクリックして、カーソルを配置します。
    5. [書式] メニューの [箇条書きと段落番号] をクリックします。
    6. [箇条書きと段落番号] 作業ウィンドウの一番下にある [開始番号] ボックスで、番号として「6」を指定します。

    番号付けにはアラビア数字、ローマ数字、およびアルファベットから選択できますが、おもしろいことに [開始番号] ボックスに表示されるのは常にアラビア数字です。

    アプローチ 2 – 段落内改行の使用

    もう 1 つのあまり目立たない機能は、リッチ テキスト編集に含まれています。リスト項目で Enter キーを押すと新しいリスト項目が作成されますが、代わりに Shift + Enter キーを押すと、段落内改行を作成できます。このアプローチの長所は、リストが実際には中断されないことです。したがって、2 つ目以降のリストで番号がずれる問題はありません。短所は、段落内改行がリスト項目と左揃えになるようにインデントされること、およびリストに含めていないコンテンツも実際はリスト項目の一部であり、レイアウト用の表が新しいリスト項目に強制的に適用されることです。また、このアプローチでは、特定の書式設定機能が適切に (またはまったく) 機能しないことがあります。

    項目が 10 個ある番号付きリストを作成する

    1. [段落番号] ツールバー ボタンをクリックして、番号付きリストを作成します。
    2. 番号付きリストに任意の項目を 10 個追加します。

    段落内改行の挿入

    1. リストの 5 番目の項目の最後をクリックしてカーソルを配置します。
    2. Shift + Enter キーを押して段落内改行を作成します。
    3. リストに含めないコンテンツをいくつか任意で追加します。段落内改行するときは、Enterキーの代わりに必ず Shift + Enter キーを使用します。

    ©2005 Greg Collins. All rights reserved. Licensed to Autonomy Systems, LLC for display on InfoPathDev.com.

    英文記事:Continue a Number Listからの翻訳
     

  • 補助フォームを開く

    InfoPath フォームでは多くのことを実行できます。しかし、ときには 1 つのフォームから、関連するタスクを実行する別のフォームを開きたい場合があります。また、全体的なソリューションの一部として、多数のフォームを連携させることが必要になる場合もあります。

    このタスクでは、複数のボタンを作成し、それぞれが XDocuments コレクションの NewNewFromSolutionNewFromSolutionWithData の各メソッドを使用する補助フォームを開くようにします。各メソッドでは、補助フォームまたはドキュメントへの絶対パスが要求されます。このタスクでは補助フォーム、ソース フォーム、および作成されるドキュメントをすべて同じフォルダに保存するので、XDocument.Solution.URI プロパティからパスを取得します。これによって、フォームおよびテンプレートを移動してもコードを更新せずにすみます。まず、補助フォーム用に新しい空白のフォームを作成しておきます。

    補助フォーム

    補助フォームの作成

    1. ビューの一番上に「Supporting Form」と入力し、Enter キーを押します。
    2. [コントロール] 作業ウィンドウから、テキスト ボックスを挿入します。
    3. [ファイル] メニューの [上書き保存] をクリックし、[保存] をクリックします。
    4. MultiForm」という名前のフォルダを作成します。
    5. ファイルに「Supporting.xsn」という名前を付け、[保存] をクリックします。
    6. InfoPath を終了します。

    補助フォームを使用してテスト ドキュメントを作成する

    1. MultiForm フォルダ から Supporting.xsn ファイルを開きます。
    2. テキスト ボックスに「Test Data」と入力します。
    3. フォームを「Form1.xml」という名前で MultiForm フォルダに保存します。
    4. InfoPath を終了します。

    これで、補助フォームおよびテスト ドキュメントを作成できたので、今度は補助フォームを開くために使用するソース フォームを作成します。もう一度、新しい空白のフォームを作成しておきます

    ソース フォーム

    ソース フォームの作成

    1. ビューの一番上に「Source Form」と入力し、Enter キーを押します。
    2. [コントロール] 作業ウィンドウから、ボタンを 3 つ挿入します。

    絶対パスの識別

    1. [ツール] メニューの [プログラミング | 読み込み時のイベント] をクリックします。
    2. 他の関数からグローバルにアクセスできるように、次のような sFormPath 変数宣言を OnLoad イベント ハンドラの直前 (外側) に追加します。

    var sFormPath = "";

    1. OnLoad イベント ハンドラに次のコードを追加します。

    var sUri = XDocument.Solution.URI;
    var i = sUri.lastIndexOf("\\");
    if(-1 == i)
        i = sUri.lastIndexOf("/");
    sFormPath = sUri.substring(0, i + 1);

    1. InfoPath のデザイン モードに戻ります。

    [New] ボタンのコードを追加する

    1. 1 つ目のボタンをダブルクリックし、ラベルを「New」に変更し、ID を「btnNew」に変更してから、[フォームのコードを編集] をクリックします。
    2. btnNew OnClick イベント ハンドラに次のコードを追加します。

    Application.XDocuments.New(sFormPath + "Form1.xml");

    1. InfoPath デザイン モードに戻ります。

    [NewFromSolution] ボタンのコードを追加する

    1. 2 つ目のボタンをダブルクリックし、ラベルを「NewFromSolution」に変更し、ID を「btnNewFromSolution」に変更してから、[フォームのコードを編集] をクリックします。
    2. btnNewFromSolution OnClick イベント ハンドラに次のコードを追加します。

    Application.XDocuments.NewFromSolution(sFormPath + "Supporting.xsn");

    1. InfoPath デザイン モードに戻ります。

    [NewFromSolutionWithData] ボタンの背後のコードを追加する

    1. 3 つ目のボタンをダブルクリックし、ラベルを「NewFromSolutionWithData」に変更し、ID を「btnNewFromSolutionWithData」に変更してから、[フォームのコードを編集] をクリックします。
    2. btnNewFromSolutionWithData OnClick  イベント ハンドラに次のコードを追加します。

    Application.XDocuments.NewFromSolutionWithData(sFormPath + "Form1.xml", sFormPath + "Supporting.xsn");

    フォームの保存

    1. コードを保存し、スクリプト エディタを終了します。
    2. InfoPath のデザイン モードで、[ファイル] メニューの [上書き保存] をクリックし、[保存] をクリックします。
    3. MultiForm フォルダに移動します。
    4. ファイルに「Source.xsn」という名前を付け、[保存] をクリックします。
    5. InfoPath を終了します。

    確認

    これで、ソース テンプレート、補助テンプレート、補助テスト ドキュメントを作成できたので、さまざまなメソッドを試します。フォームをプレビューし、それぞれのボタンをクリックして結果を確認します。

    [New] または [NewFromSolutionWithData] ボタンを初めてクリックしたときに、図 1 のようなセキュリティの警告ダイアログ ボックスが表示されるのにお気づきでしょう。このダイアログ ボックスを非表示または無効にする方法については、「Internet Explorer のクロスドメイン セキュリティのダイアログ ボックスが表示されないようにする」を参照してください。


    図 1 Internet Explorer のクロスドメイン データ アクセスのセキュリティ リスクを通知するダイアログ ボックス

    ©2005 Greg Collins. All rights reserved. Licensed to Autonomy Systems, LLC for display on InfoPathDev.com.

    英文記事:  Launch a Supporting Formよりの翻訳

  • コード経由でドロップダウン リスト ボックスを設定する

    InfoPath ではドロップダウン リスト ボックスの項目の設定は簡単にできますが、デザイン モードでは実現できないような複雑な設定が必要になることがあります。これは、InfoPath 外で少し作業することで可能になります。コード経由のドロップダウン リスト ボックスの設定は非常に強力ですが、コード ブロックの保持機能を使用する必要があります。

    このタスクでは、ドロップダウン リスト ボックスをコード経由で設定します。ドロップダウン リスト ボックスは、保持するコード ブロックの作成に使用されるセクション内に配置します。まず、新しい空白のフォームを作成しておきます。

    ビューの設計

    1. [コントロール] 作業ウィンドウを開きます。
    2. ビューにセクションを挿入します。
    3. セクションにドロップダウン リスト ボックスを挿入します。

    オプションのリストを返すコードを書く

    1. Alt + Shift + F11 キーを押して Microsoft Script Editor を開きます。
    2. 次の関数を挿入します。

    Java Script:
    function PopulateDropdown(sSelectedValue)
    {
        return "<option value=''>Select...</option><option value='Test'>Test</option>";
    }

    C#:
    public string PopulateDropdown(string sSelectedValue)
    {
        return "<option value=''>Select...</option><option value='Test'>Test</option>";
    }

    1. コードを保存し、Microsoft Script Editor を閉じます。

    ビューの .xsl ファイルを変更して、保持するコード ブロックを作成する

    1. InfoPath デザイン モードで、[ファイル] メニューの [フォーム構成ファイルの取り出し] をクリックします。
    2. 取り出したフォーム構成ファイルの保存先を選択し、[OK] をクリックします。
    3. InfoPath を終了して、フォーム構成ファイルに対するロックを解除します。
    4. テキスト エディタを使用して、ビューの.xsl ファイルを開きます。
    5. ドロップダウン リスト ボックスを含む xsl:template を探します。
    6. xsl:template 要素とそれに関連付けられている xsl:apply-templates 要素の両方で、mode="_nn" 属性を mode="xd:preserve" と置き換えます。

    mode 属性の値は、xsl:template 要素と xsl:apply-templates 要素の両方で同じになります。

    1. このドロップダウン リスト ボックス用にリストされているすべての option 要素を次のコードと置き換えます。

    <xsl:value-of select="xdExtension:PopulateDropdown(string(my:BoundField))" disable-output-escaping="yes"/>

    ここで my:BoundField は select 要素の xd:binding 属性の値と同じです。

    1. .xsl ファイルを保存して、テキスト エディタを閉じます。

    確認

    1. manifest.xsf ファイルをダブルクリックして、変更したソリューションを起動します。

      InfoPath エディタには、"Select..." および "Test" が設定されたドロップダウン リスト ボックスが表示されます。
    2. [ツール] メニューの [このフォームのデザイン] をクリックします。
    3. InfoPath デザイン モードで、保持しているコード ブロックを示す赤いボックスが表示されます。

    これで、PopulateDropdown 関数を修正して、必要な情報を処理してドロップダウン リスト ボックスに設定できるようになりました。返される文字列は、 option要素を含み、適切に書式化された HTML だけにして、XSL コードを含めないようにします。

    現在選択されているオプションがどの option要素であるかを識別するには、sSelectedValue パラメータを使用する必要があります。コード内で、正しい option要素に selected="selected"属性を設定していることを必ず確認してください。設定していない場合、ビューのドロップダウン リストには選択値が表示されず、代わりに常にリスト内の最初のオプションの表示に戻ります。

    このテクニックの使用例を参照するには、InfoPath Dev のサンプル フォーム「Fully Editable Drop-Down List Box 」および「Moving Items Between List Boxes」をダウンロードしてください。

    ©2004 Greg Collins. All rights reserved. Licensed to Autonomy Systems, LLC for display on InfoPathDev.com.

    英文記事: Populate a Drop-Down List Box via Codeからの翻訳

  • セカンダリ データ ソースからドロップダウン リスト ボックスを設定する

    InfoPath SP1 の優れた機能の 1 つに、ドロップダウン リスト ボックスの項目をさまざまなソースからすばやく設定できる機能があります。このようなソースの 1 つが、セカンダリ データ ソースとしてフォームに追加されている XML ファイルです。この場合、ドロップダウン リスト ボックス コントロールを間違ったデータ ソースにバインドするというミスがよく起こります。

    セカンダリ データ ソースは、メイン データ ソースを必須のフォーム データだけの保存場所にするのにたいへん役立ちます。セカンダリ データ ソース内の値は、フォームの使用中に更新されることもありますが、フォームの一部としては保存されません。フォームが保存または発行されるときは、メイン データ ソース内の値だけが保存されます。

    バインドは、コントロール (ドロップダウン リスト ボックスなど) とデータ ノード間で行われます。[データ ソース] 作業ウィンドウでデータ ノードを選択してビューにドラッグするか、データ ノードを右クリックしてコントロールの種類をクリックすると、ビュー内のコントロールがそのデータ ノードに "バインド" されます。つまり、コントロールによって保持される値は、すべてデータ ノード内の保存値になります。

    コントロールがセカンダリ データ ソースにバインドされている場合、保存値はフォームの使用中は維持されますが、フォームを閉じると失われます。コントロールがメイン データ ソースにバインドされている場合、値は保存されるフォームの一部として維持されます。

    セカンダリ データ ソースを正しく使用してドロップダウン リスト ボックスの項目を設定し、選択した値を同じフォームの一部として保存するには、コントロールのバインド先をメイン データ ソースにする一方で、データの設定元をセカンダリ データ ソースにする必要があります。このためには、次の手順を実行します。

    メイン データ ソースにバインドするドロップダウン リスト ボックス コントロールを挿入する

    1. [データ ソース] 作業ウィンドウの[データ ソース]ドロップダウン リストから[メイン]を選択します。
    2. 値の保存先にするデータ ノードを選択し、それをビューに右ドラッグし、コントロールを配置する場所にドロップします。
    3. ドロップしたときに表示されるコンテキスト メニューの [ドロップダウン リスト ボックス] をクリックします。

    セカンダリ データ ソースからドロップダウン リスト ボックスを設定する

    1. ドロップダウン リスト ボックス コントロールをダブルクリックします。
    2. [ドロップダウン リスト ボックスのプロパティ]ダイアログ ボックスで、[データ接続の値をデータベース、Web サービス、ファイル、SharePoint ライブラリまたはリストで参照する]を選択します。
    3. [データ接続]ドロップダウン リストからセカンダリ データ ソースを選択します。
    4. [エントリ] フィールドの右にある [XPath の選択] ボタンをクリックします。
    5. 値の設定に使用するノードをクリックし、[OK] をクリックします。
    6. 必要な場合は、[値] フィールドおよび [表示名] フィールドの右にある [XPath の選択] ボタンを使用して、ノードを適切に変更します。
    7. [OK] をクリックして ダイアログ ボックスを閉じます。

    これで、ドロップダウン リスト ボックスの準備ができました。リストの値はセカンダリ データ ソースから設定されますが、選択した値は、フォームが保存または発行されるときにメイン データ ソースに保存されます。

    ©2004 Greg Collins. All rights reserved. Licensed to Autonomy Systems, LLC for display on InfoPathDev.com.

    英文記事: Populate a Drop-Down List Box via a Secondary Data Source からの翻訳

  • ドロップダウン リスト ボックスに複数のフィールドを表示する

    InfoPath フォームの開発中、ドロップダウン リスト ボックスに複数のフィールドから多くの情報を表示することが必要になる場合があります。これは、手動でビューの .xsl ファイルを変更するだけで簡単に設定できます。このタスクでは、1 つのドロップダウン リスト ボックスに複数のフィールドを表示するための変更を行います。

    アプローチ 1
    1 つ目の方法は最も簡単です。ビューの .xsl ファイルを手動で変更し、XPath の concat() 関数を使用して、複数のフィールドを結合した値をドロップダウン リスト ボックスに表示します。

    たとえば、次のような XSL があるとします。

    <option>
        <xsl:attribute name="value">
            <xsl:value-of select="my:EmployeeId"/>
        </xsl:attribute>
        <xsl:if test="$val=my:EmployeeId">
            <xsl:attribute name="selected">selected</xsl:attribute>
        </xsl:if>
        <xsl:value-of select="my:LastName"/>
    </option>

    これを次のように変更します (変更箇所を赤字で示します)。

    <option>
        <xsl:attribute name="value">
            <xsl:value-of select="my:EmployeeId"/>
        </xsl:attribute>
        <xsl:if test="$val=my:EmployeeId">
            <xsl:attribute name="selected">selected</xsl:attribute>
        </xsl:if>
        <xsl:value-of select="concat(my:LastName, ', ', my:FirstName, ' (', my:EmployeeId, ')')"/>
    </option>

    これらの変更は、デザイン モードでラウンドトリップします。つまり、デザイン モードでフォーム テンプレートを読み込んで変更し、それを保存しても、XSL での変更は失われません。

    アプローチ 2
    2 つ目は、コード経由でドロップダウン リストを設定する方法です。おそらくこちらの方が信頼性が高くなります。このテクニックは、InfoPath Dev のサンプル フォーム「Fully Editable Drop-Down List Box」で使用されています。コードを使用すると、ドロップダウン リスト ボックスを完全にカスタマイズできます。

    ©2004 Greg Collins. All rights reserved. Licensed to Autonomy Systems, LLC for display on InfoPathDev.com.

  • リストの選択値を記録する

    場合によっては、単一のリスト ボックスまたはドロップダウン リスト ボックスでユーザーが行った選択の順序を記録することが必要になることがあります。これを実現するは、OnAfterChange イベント ハンドラに独自のコードを記述します。また、動作規則を使用することもできます。

    このタスクでは、リスト ボックスを作成し、メインデータソース内の別のフィールドにユーザーの選択順序を記録します。ここでは、前述の 2 つのアプローチの両方を説明します。まず、新しい空白のフォームを作成しておきます。

    スキーマの作成

    1. [データ ソース] 作業ウィンドウを開きます。
    2. SelectionsViaRules」という名前のテキスト フィールドを追加します。
    3. SelectionsViaCode」という名前のテキスト フィールドを追加します。
    4. Choice」という名前のテキスト フィールドを追加します。

    ビューの設計

    1. [マイフィールド] を右クリックし、[コントロール] をクリックします。
    2. 各テキストボックスの前にキャリッジリターンを追加して、それぞれを新しい行に配置します。
    3. 「Selections Via Rules」 というラベルのテキスト ボックスをダブルクリックします。
    4. [テキスト ボックスのプロパティ] ダイアログ ボックスの [表示] タブで、[読み取り専用] チェック ボックスおよび [文字列を折り返して全体を表示する] チェック ボックスをオンにし、[スクロール] ボックスの一覧の [展開してすべての文字列を表示する] をクリックします。
    5. [サイズ] タブで、幅の値を「651」に設定し (図 1 を参照)、[OK] をクリックします。


    図 1 テキスト ボックスのプロパティの調整

    1. Selections Via Code」というラベルのテキスト ボックスについても、前のテキスト ボックスとすべて同じように設定します。
    2. 「Choice」というラベルのテキスト ボックスを右クリックし、[変更 | リスト ボックス] をクリックします。 Make all of the same adjustments to the text box labeled Selections

    リスト ボックスの設定

    1. リスト ボックスをダブルクリックします。
    2. [リスト ボックスのプロパティ] ダイアログ ボックスの [データ] タブで、値を文字「A」、「B」、「C」、「D」、「E」に設定した 5 つのエントリを追加し (図 2 を参照)、[OK] をクリックします。


    図 2 リスト ボックスの項目の追加

    1. Stretch the list box down to reveal all of the entries we just added.


    アプローチ 1 – 動作規則を使用して選択を記録する

    サンプルフォーム用に選択したデザインで最も便利なアプローチは、動作規則を使用してリスト ボックスの選択を記録する方法です。動作規則を使用すると、既定の空白の選択項目など、記録したくない選択値をフィルタで除外できます。また、選択間の区切り文字を追加するかどうかを判断するために、すでに選択が行われているかどうかを調べることができます。

    最初の選択用の動作規則を追加する

    1. リスト ボックスをダブルクリックします。
    2. [動作規則] をクリックし、[追加] をクリックし、動作規則に「Set Selection」という名前を付けます。
    3. [条件の設定] をクリックします。
    4. 最初の条件として、1 つ目のボックスの一覧の [Choice] をクリックし、2 つ目のボックスの一覧の [が空白でない] をクリックします。
    5. [AND/OR] をクリックし、そのボックスの一覧で、[OR] ではなく [AND] がクリックされていることを確認します。
    6. 2 つ目の条件として、1 つ目のボックスの一覧の [SelectionsViaRules] をクリックし、2 つ目のボックスの一覧の [が空白である] をクリックし (図 3 を参照)、[OK] をクリックします。


    図 3 Set Selection 動作規則の条件

    1. [動作の追加] をクリックします。 
    2. [動作] ボックスの一覧の [フィールドの値を設定する] をクリックします。
    3. [フィールド] テキスト ボックスの右にある [XPath の選択] ボタンをクリックし、[SelectionsViaRules] をクリックし、[OK] をクリックします。
    4. [値] テキスト ボックスの右にある [数式の挿入] ボタンをクリックし、ピリオドを入力し、[OK] を 2 回クリックします。
      ピリオドは、self::node() の場所を示す XPath の省略構文です。このシナリオでは Choice ノードを示します。
    5. [この動作規則が完了したら規則の処理を停止する] チェック ボックスをオンにし、[OK] をクリックします。

    追加の選択の動作規則を追加する

    1. [動作規則] をクリックし、[追加] をクリックし、動作規則に「Add Selection」という名前を付けます
    2. [条件の設定] をクリックします。
    3. 最初の条件として、1 つ目のボックスの一覧の [Choice] をクリックし、2 つ目のボックスの一覧の [が空白でない] をクリックし、[OK] をクリックします。
    4. [動作の追加] をクリックします。
    5. [動作] ボックスの一覧の [フィールドの値を設定] をクリックします。
    6. [Field] テキスト ボックスの右にある [XPath の選択] ボタンをクリックし、[SelectionsViaRules] をクリックし、[OK] をクリックします。
    7. [値] テキスト ボックスの右にある [数式の挿入] ボタンをクリックし、次の式を入力します (図 4 を参照)。

    concat(../my:SelectionsViaRules, ", ", .)

    図 4 追加の選択をテキスト ボックスに追加するための式

    1. [OK] を 5 回クリックします。

    この式は少しわかりにくいかもしれませんが、具体的には、[SelectionsViaRules] テキストボックスの既存の値にカンマおよび空白文字を付けて現在の [Choice] リスト ボックスの選択値と連結します。


    アプローチ 2 – コードを使用して選択を記録する

    動作規則を使用するのに適していないフォームデザインを選択している場合、またはより複雑な処理機能が必要な場合は、コードを使用してリスト ボックスの選択を記録します。このタスクは、前のアプローチの動作規則の動作をコードに複製するだけです。

    選択変更時のコードを追加する

    1. リスト ボックスをダブルクリックします。
    2. [リスト ボックスのプロパティ] ダイアログ ボックスの [データ] タブの [データの入力規則] をクリックします。
    3. [データの入力規則] ダイアログ ボックスの [イベント] ボックスの一覧の [OnAfterChange] をクリックし、[編集] をクリックします。
    4. Microsoft Script Editor で、OnAfterChange イベント ハンドラの内容を次のコードと置き換えます。

    if(eventObj.IsUndoRedo || "Insert" != eventObj.Operation)
        return;

    var oChoice = XDocument.DOM.selectSingleNode("my:myFields/my:Choice");
    if("" == oChoice.text)
        return;

    var oSelectionsViaCode = XDocument.DOM.selectSingleNode("/my:myFields/my:SelectionsViaCode");
    if("" == oSelectionsViaCode.text)
        oSelectionsViaCode.text = oChoice.text;
    else
        oSelectionsViaCode.text += ", " + oChoice.text;

    1. [ファイル] メニューの [保存] をクリックしてから Microsoft Script Editor を終了します。

    確認

    動作規則とコードを用意したら、フォームをプレビューします。リスト ボックスで、[A]、[B]、[D]、[A]、[C]、[E] の順に選択します。図 5 に示されているように、両方のテキストボックスに、選択された順に選択値が記録されます。また、各選択値の間には区切り文字が含まれます。


    図 5 リスト ボックスの選択値の順がテキスト フィールドに保存されます。

    ユーザーの選択値を保存するために使用されるテキストボックスは、ビューに表示する必要はありません。ボックスを表示しない場合は、読み取り専用のテキストボックスの代わりに式ボックスを使用できます。また、ユーザーの選択をフォームの一部として保存する必要がない場合は、記録にメインデータソースではなくセカンダリデータソースを使用することもできます。

    ©2004 Greg Collins. All rights reserved. Licensed to Autonomy Systems, LLC for display on InfoPathDev.com.

  • リストに一意のオプションだけを表示する

    データソースまたはデータ接続を参照してXPath フォームのリスト ボックス エントリを作成した結果、重複したオプションがユーザーに表示されることがあります。フィルタと適切な XPath を使用することによって、これを修正し、リストに一意のオプションだけを表示することができます。

    このタスクでは、ユーザーに一意のオプション セットを表示するようにフィルタしたドロップダウン リスト ボックスを作成します。まず、新しい空白のフォームを作成しておきます。

    ビューにコントロールを追加する

    1. [コントロール] 作業ウィンドウを開きます。
    2. ドロップダウン リスト ボックスをビューに挿入します。
    3. 1 列の繰り返しテーブルをビューに挿入します。
    4. 繰り返しテーブルの見出し行に「Source Values」と入力します。

    ドロップダウン リスト ボックスを設定する

    1. ドロップダウン リスト ボックスをダブルクリックします。
    2. [ドロップダウン リスト ボックスのプロパティ] ダイアログ ボックスの [データ] タブで、[フォームのデータ ソースで値を検索する] をクリックします。
    3. [エントリ] テキスト ボックスの右にある [XPath の選択] ボタンをクリックし、[グループ1/グループ2/フィールド2] をクリックします。

    一意の値を表示するためのフィルタ

    1. [フィルタ データ] をクリックし、[追加] をクリックします。
    2. [フィルタ条件の指定] ダイアログ ボックスの 1 つ目のボックスの一覧から [式] をクリックし、次の式を入力します (図 1 を参照)。

    not(. = ../preceding::my:グループ2/my:フィールド2)


    図 1 一意の値だけを表示するためにリスト オプションに適用するフィルタ

    1. [OK] を 4 回クリックします。

    確認

    フォームをプレビューします。繰り返しテーブルに値の行を複数追加します。このとき、いくつかの値が重複するようにしてください。その後、ドロップダウン リストのオプションを調べます。図 2 に示すように、ドロップダウン リストには一意の値だけが表示されます。これは、XPath 式によって、重複する値がリストに追加されないように設定されているためです。

    図 2 フィルタされたリスト ボックスには一意の値だけが表示されます。

    InfoPath では、繰り返しテーブルで値を処理してリスト ボックス エントリに追加するときにフィルタが自動的に適用されます。フィルタの XPath 式は、前の行 (my:グループ2) の my:フィールド2 の値が現在の行の my:フィールド2 の値と同じかどうかをチェックします。同じ場合、値はリストに追加されません。

    ©2005 Greg Collins. All rights reserved. Licensed to Autonomy Systems, LLC for display on InfoPathDev.com.

    英文記事:Display Only Unique Options in a List  からの翻訳

  • 表示/非表示条件を使用してチェック ボックスを非表示にする

    チェック ボックス コントロールおよびオプション ボタン コントロールの条件付き書式の選択肢は非常に限られています。実際に、InfoPath UI で、これらの 2 つのコントロールに対して用意されている条件付き書式の選択肢は、「無効にする」の 1 つだけです。しかし、コントロールを無効にすることが常に正しい選択であるとは限りません。条件によっては、コントロールを非表示にする方が望ましい場合があります。これから説明するテクニックは、どちらのコントロールにも適用できますが、ここではチェック ボックスを使用して説明します。

    このタスクでは、車両解体業者が販売用に所有している車両の部品をリストするために使用する簡単なフォームを作成します。最初に車両の繰り返しテーブルを作成し、このテーブルに、種類のドロップダウン リスト (自動車、オートバイ、または自転車)、車両の部品を示す 5 つのチェック ボックス セット (タイヤ、エンジン、シート、ハンドル、ハンドルバー) を含めます。種類によっては必要のない部品もあるので、選択した種類に応じて特定のチェック ボックスを非表示にします。

    チェック ボックスのレイアウトは、縦型と横型の 2 種類が可能です。それぞれのレイアウトは、異なるアプローチで表示/非表示条件を使用してチェック ボックスを非表示にします。縦型のレイアウトでは、チェック ボックスをセクションに入れます。横型のレイアウトでは、手動で XSL を変更します。まず、新しい空白のフォームを作成しておきます。

    スキーマの作成

    1. [データ ソース] 作業ウィンドウを開きます。
    2. [マイフィールド] をダブルクリックし、名前を「Vehicles」に変更します。
    3. Vehicle」という名前の繰り返しグループを追加します。
    4. [Vehicle] グループをクリックし、5 つのはい/いいえ (Boolean) 型の属性フィールドを追加します。名前はそれぞれ「tires」、「engine」、「seat」、「steeringWheel」、および「handlebars」とし、既定値は [いいえ] とします。
    5. テキスト フィールドを 3 つ追加します。名前はそれぞれ「Id」、「Type」、「Description」とします。


    アプローチ 1 – 縦型のレイアウト: セクションに入れる

    縦型のレイアウトで、表示/非表示条件を使用してチェック ボックスを非表示にする最も簡単な方法は、そのチェック ボックスをセクションに配置し、そのセクションに表示/非表示条件を追加する方法です。このアプローチは、タスクをすべてデザイン モード内で実行できるという利点があります。

    セクションは、ブロック要素として表示されます。したがって、同じ行に他のコントロールを配置することはできません。配置しようとしても、強制的にセクションの上か下に表示されます。このアプローチが、横型ではなく縦型のレイアウトに適しているのはこのためです。このアプローチを、レイアウト用の表を使用して横型のレイアウトに適用することもできますが、非表示になったチェック ボックスの空きスペースが折りたたまれないという大きな欠点があります。

    レイアウトの設計

    1. [データ ソース] 作業ウィンドウで、[Vehicle] を右クリックし、[繰り返しセクション] をクリックします。
    2. 繰り返しセクションから余計な空白行を削除し、「VEHICLE:」と入力します。
    3. レイアウト用の 1 列 x 2 行の表を挿入します。
    4. 1行目のセルを右クリックし、[セルの分割] をクリックします。
    5. [セルの分割] ダイアログ ボックスで、列数に「2」と入力し、[OK] をクリックします。

    チェック ボックス以外のコントロールを挿入する

    1. [データ ソース] 作業ウィンドウから、[Id] をドラッグして、表の左上のセルにドロップします。
    2. [Type] を右ドラッグして、右上のセルにドロップし、[ドロップダウン リスト ボックス] をクリックします。
    3. [Description] をドラッグして、下のセルにドロップします。

    各チェック ボックスのセクションを挿入する

    1. レイアウト用の表の下で、最初の空白行をクリックして、カーソルを置きます。
    2. 5 つのはい/いいえ (Boolean) 属性フィールド ([tires]、[engine]、[seat]、[steeringWheel]、および [handlebars]) をそれぞれ右クリックし、[その他 | セクション] をクリックして、[OK] をクリックします。

    セクションのプロパティを調整する

    1. 挿入した 5 つのセクションを、Ctrl キーを押しながらクリックしてこれらをすべて選択し、Alt + Enter キーを押します。
    2. [プロパティ (複数選択)] ダイアログ ボックスで、スペースおよび余白のそれぞれの値を設定します。ただし、右の余白は「0px」にします。次に、[OK] をクリックします。
    3. 複数選択のままで、いずれかのセクションを右クリックし、[罫線と網掛けの設定] をクリックします。
    4. [罫線と網掛けの設定] ダイアログ ボックスの [罫線] タブで、[なし] をクリックして既存の罫線を削除し、[OK] をクリックします。

    チェック ボックス コントロールを挿入する

    1. 5 つのはい/いいえ (Boolean) 属性フィールド ([tires]、[engine]、[seat]、[steeringWheel]、および [handlebars]) をそれぞれドラッグして、関連付けられているセクションにドロップします。
    2. 5 つの各セクション内の余計な空白行を削除します。完成したレイアウトは、図 1 のようになります。

    図 1 表示/非表示条件を設定するチェック ボックスの縦型レイアウトの完成版

    [Type] ドロップダウン リスト ボックスに項目を追加する

    1. [Type] ボックスをダブルクリックし、[追加] をクリックします。
    2. [選択肢の追加] ダイアログ ボックスで、「Car」と入力し、[OK] をクリックします。
    3. さらに「Motorcycle」および「Bicycle」の 2 つの項目を追加します。

    チェック ボックスが非表示になるように engine 属性の値を false に設定する動作規則を追加する

    1. [動作規則] をクリックし、[追加] をクリックします。
    2. 動作規則の名前を「Set engine = false」とし、[条件の設定] をクリックします。
    3. [条件] ダイアログ ボックスの 3 つ目のボックスの一覧から [文字列の入力] をクリックし、「Bicycle」と入力してから、[OK] をクリックします。
    4. [動作の追加] をクリックします。
    5. [動作] ダイアログ ボックスの [動作] ボックスの一覧の [フィールドの値を設定する] をクリックします。
    6. [フィールド] ボックスの右にある [XPath の選択] ボタンをクリックし、[Vehicles/Vehicle/engine] をクリックしてから、[OK] をクリックします。
    7. [値] ボックスの右にある [数式の挿入] ボタンをクリックし、[関数の挿入] をクリックします。[関数] ボックスの一覧の [false] をクリックしてから、[OK] を 4 回クリックします。

    チェック ボックスが非表示になるように steeringWheel 属性の値を false に設定する動作規則を追加する

    1. [追加] をクリックします。
    2. 動作規則の名前を「Set steeringWheel = false」とし、[条件の設定] をクリックします。
    3. [条件] ダイアログ ボックスの 3 つ目のボックスの一覧から [文字列の入力] をクリックし、「Motorcycle」と入力します。[AND/OR] をクリックし、[AND] の代わりに [OR] をクリックします。
    4. 3 つ目のボックスの一覧の [文字列の入力] をクリックし、「Bicycle」と入力して (図 2 を参照)、[OK] をクリックします。

    図 2 steeringWheel 属性を false に設定するための動作規則の条件

    1. [動作の追加] をクリックします。
    2. [動作] ダイアログ ボックスの [動作] ボックスの一覧の [フィールドの値を設定する] をクリックします。
    3. [フィールド] ボックスの右にある [XPath の選択] ボタンをクリックし、[Vehicles/Vehicle/steeringWheel] をクリックしてから、[OK] をクリックします。
    4. [値] ボックスの右にある [数式の挿入] ボタンをクリックし、[関数の挿入] をクリックします。[関数] ボックスの一覧の [false] をクリックしてから、[OK] を 4 回クリックします。

    チェック ボックスが非表示になるように handlebars属性の値を false に設定する動作規則を追加する

    1. [追加] をクリックします。
    2. 動作規則の名前を「Set handlebars = false」とし、[条件の設定] をクリックします。
    3. [条件] ダイアログ ボックスの 3 つ目のボックスの一覧の [文字列の入力] をクリックし、「Car」と入力し、[OK] をクリックします。
    4. [動作の追加] をクリックします。
    5. [動作] ダイアログ ボックスの [動作] ボックスの一覧の [フィールドの値を設定する] をクリックします。
    6. [フィールド] ボックスの右にある [XPath の選択] ボタンをクリックし、[Vehicles/Vehicle/handlebars] をクリックしてから、[OK] をクリックします。
    7. [値] ボックスの右にある [数式の挿入] ボタンをクリックし、[関数の挿入] をクリックします。[関数] ボックスの一覧の [false] をクリックし、[OK] を 6 回クリックして、開いているダイアログ ボックスをすべて閉じます。

    [Engine] セクションに表示/非表示条件を追加する

    1. [Engine] セクションをダブルクリックします。
    2. [セクションのプロパティ] ダイアログ ボックスの [表示] タブで、[条件付き書式] をクリックし、[追加] をクリックします。
    3. 1 つ目のボックスの一覧の [Type] をクリックし、2 つ目のボックスの一覧の [が次の値に等しい] をクリックします。3 つ目のボックスの一覧の [文字列の入力] をクリックし、「Bicycle」と入力します。
    4. [このコントロールを表示しない] チェック ボックスをオンにし、[OK] を 3 回クリックします。

    [Steering Wheel] セクションに表示/非表示条件を追加する

    1. [Steering Wheel] セクションをダブルクリックします。
    2. [セクションのプロパティ] ダイアログ ボックスの [表示] タブで、[条件付き書式] をクリックし、[追加] をクリックします。
    3. 1 つ目のボックスの一覧の [Type] をクリックし、2 つ目のボックスの一覧の [が次の値に等しい] をクリックします。3 つ目のボックスの一覧の [文字列の入力] をクリックし、「Motorcycle」と入力します。[AND/OR] をクリックし、[AND] の代わりに [OR] をクリックします。
    4. 1 つ目のボックスの一覧の [Type] をクリックし、2 つ目のボックスの一覧の [が次の値に等しい] をクリックします。3 つ目のボックスの一覧の [文字列の入力] をクリックし、「Bicycle」と入力します。
    5. [このコントロールを表示しない] チェック ボックスをオンにし (図 3 を参照)、[OK] を 3 回クリックします。

    図 3 [Steering Wheel]セクションの表示/非表示条件

    [Handlebars] セクションに表示/非表示条件を追加する

    1. [Handlebars] セクションをダブルクリックします。
    2. [セクションのプロパティ] ダイアログ ボックスの [表示] タブで、[条件付き書式] をクリックし、[追加] をクリックします。
    3. 1 つ目のボックスの一覧の [Type] をクリックし、2 つ目のボックスの一覧の [が次の値に等しい] をクリックします。3 つ目のボックスの一覧の [文字列の入力] をクリックし、「Car」と入力します。
    4. [このコントロールを表示しない] チェック ボックスをオンにし、[OK] を 3 回クリックします。

    確認

    1. フォームをプレビューします。
    2. [Type] ボックスの一覧の各項目をクリックして、チェック ボックスとラベルが不要なものを表示しないかを確認します。

    これで、車両の種類に基づいて不要なものを表示しない縦型の動的なチェック ボックスのリストができました。フォームを保存するときに無効なセクションが残らないように、非表示のチェック ボックスは自動的にオフになります。


    アプローチ 2 – 横型のレイアウト: XSL を手動で変更する

    横型のレイアウトの場合、表示/非表示条件を使用してチェック ボックスを非表示にするための最も簡単な方法は、ラベルに表示/非表示条件を設定した式ボックスを使用し、手動で XSL を変更してチェック ボックス コントロールに表示/非表示条件を追加する方法です。このアプローチは、縦型のレイアウトでも使用できますが、デザイン モード外での作業を伴うので、縦型の場合は 1 つ目のアプローチを使用することをお勧めします。

    レイアウトの設計

    1. [データ ソース] 作業ウィンドウで [Vehicle] を右クリックし、[繰り返しセクション] をクリックします。
    2. 繰り返しセクションから余計な空白行を削除し、「VEHICLE:」と入力します。
    3. レイアウト用の 1 列 2 行の表を挿入します。
    4. 1行目のテーブル セルを右クリックし、[セルの分割] をクリックします。
    5. [セルの分割] ダイアログ ボックスで、列数に「2」と入力し、[OK] をクリックします。

    コントロールを挿入する

    1. [データ ソース] 作業ウィンドウから、[Id] をドラッグして、表の左上のセルにドロップします。
    2. [Type] を右ドラッグして、右上のセルにドロップし、[ドロップダウン リスト ボックス] をクリックします。
    3. [Description]をドラッグして、下のセルにドロップします。
    4. 5 つのはい/いいえ (Boolean) 属性フィールド ([tires]、[engine]、[seat]、[steeringWheel]、および [handlebars]) をそれぞれドラッグして、下のセルにドロップします。

    [Type] ドロップダウン リスト ボックスに項目を追加する

    1. [Type] ボックスをダブルクリックし、[追加] をクリックします。
    2. [選択肢の追加] ダイアログ ボックスで、「Car」と入力し、[OK] をクリックします。
    3. さらに、「Motorcycle」および「Bicycle」の 2 つの項目を追加します。

    チェック ボックスが非表示になるように engine 属性の値を false に設定する動作規則を追加する

    1. [動作規則] をクリックし、[追加] をクリックします。
    2. 動作規則の名前を「Set engine = false」とし、[条件の設定] をクリックします。
    3. [条件] ダイアログ ボックスの 3 つ目のボックスの一覧から [文字列の入力] をクリックし、「Bicycle」と入力してから、[OK] をクリックします。
    4. [動作の追加] をクリックします。
    5. [動作] ダイアログ ボックスの [動作] ボックスの一覧の [フィールドの値を設定する] をクリックします。
    6. [フィールド] ボックスの右にある [XPath の選択] ボタンをクリックし、[Vehicles/Vehicle/engine] をクリックしてから、[OK] をクリックします。
    7. [値] ボックスの右にある [数式の挿入] ボタンをクリックし、[関数の挿入] をクリックします。[関数] ボックスの一覧の [false] をクリックしてから、[OK] を 4 回クリックします。

    チェック ボックスが非表示になるように steeringWheel 属性の値を false に設定する動作規則を追加する

    1. [追加] をクリックします。
    2. 動作規則の名前を「Set steeringWheel = false」とし、[条件の設定] をクリックします。
    3. [条件] ダイアログ ボックスの 3 つ目のボックスの一覧の [文字列の入力] をクリックし、「Motorcycle」と入力します。[AND/OR] をクリックし、[AND] の代わりに [OR] をクリックします。
    4. 3 つ目のボックスの一覧の [文字列の入力] をクリックし、「Bicycle」と入力して、[OK] をクリックします。
    5. [動作の追加] をクリックします。
    6. [動作] ダイアログ ボックスで、 [動作] ボックスの一覧の [フィールドの値を設定する] をクリックします。
    7. [フィールド] ボックスの右にある [XPath の選択] ボタンをクリックし、[Vehicles/Vehicle/steeringWheel] をクリックしてから、[OK] をクリックします。
    8. [値] ボックスの右にある [数式の挿入] ボタンをクリックし、[関数の挿入] をクリックします。[関数] ボックスの一覧の [false] をクリックしてから、[OK] を 4 回クリックします。

    チェック ボックスが非表示になるように handlebars 属性の値を false に設定する動作規則を追加する

    1. [追加] をクリックします。
    2. 動作規則の名前を「Set handlebars = false」とし、[条件の設定] をクリックします。
    3. [条件] ダイアログ ボックスの 3 つ目のボックスの一覧の [文字列の入力] をクリックし、「Car」と入力し、[OK] をクリックします。
    4. [動作の追加] をクリックします。
    5. [動作] ダイアログ ボックスの [動作] ボックスの一覧の [フィールドの値を設定する] をクリックします。
    6. [フィールド] ボックスの右にある [XPath の選択] ボタンをクリックし、[Vehicles/Vehicle/handlebars] をクリックしてから、[OK] をクリックします。
    7. [値] ボックスの右にある [数式の挿入] ボタンをクリックし、[関数の挿入] をクリックします。[関数] ボックスの一覧の [false] をクリックし、[OK] を 6 回クリックして、開いているダイアログ ボックスをすべて閉じます。完成した動作規則セットを図 4 に示します。

    図4 [Type] ボックスの動作規則のセット

    チェック ボックスのレイアウトを修正する

    1. 各チェック ボックスとラベルの間の空白文字を削除します。
    2. すべてのチェック ボックスが同じ行に配置されるように、改行をすべて削除します。
    3. Engine」、「Seat」、「Steering Wheel」、および「Handlebars」のラベルのチェック ボックスを Ctrl キーを押しながらクリックしてこれらをすべて選択し、Alt + Enter キーを押します。
    4. [プロパティ (複数選択)] ダイアログ ボックスで、左の余白の値を「10px」にし、[OK] をクリックします。

    チェック ボックス間のスペースをあける場合に重要なのは、空白文字ではなく余白を使用することです。空白文字を使用した場合、チェック ボックスが非表示になったときにそれが残ってしまうので、想定しているよりも広い間隔があいてしまいます。余白はチェック ボックス コントロールの一部なので、チェック ボックスとともに非表示になります。

    [Engine] チェック ボックスのラベルを表示/非表示条件を設定した式ボックスと置き換える

    1. [Engine] チェック ボックスのラベル テキストを選択します。
    2. [コントロール] 作業ウィンドウを開き、式ボックスをクリックして、選択したラベル テキストの場所に挿入します。
    3. [式ボックスの挿入] ダイアログ ボックスで、「"Engine"」と入力し、[OK] をクリックします。
    4. 新しい式ボックスをダブルクリックします。
    5. [式ボックスのプロパティ] ダイアログ ボックスの [サイズ] タブで、幅に「自動」と入力し、スペースと余白のそれぞれの値を設定します。ただし、右の余白は「0」にします。
    6. [表示] タブで、[条件付き書式] をクリックし、[追加] をクリックします。
    7. 1 つ目のボックスの一覧の [Type] をクリックし、2 つ目のボックスの一覧の [が次の値に等しい] をクリックします。3 つ目のボックスの一覧の [文字列の入力] をクリックし、「Bicycle」と入力します。
    8. [このコントロールを表示しない] チェック ボックスをオンにし、[OK] を 3 回クリックします。

    [Steering Wheel] チェック ボックスのラベルを表示/非表示条件設定した式ボックスと置き換える

    1. [Steering Wheel] チェック ボックスのラベル テキストを選択します。
    2. [コントロール] 作業ウィンドウで式ボックスをクリックして、選択したラベル テキストの場所に挿入します。
    3. [式ボックスの挿入] ダイアログ ボックスで、「"Steering Wheel"」と入力し、[OK] をクリックします。
    4. 新しい式ボックスをダブルクリックします。
    5. [式ボックスのプロパティ] ダイアログ ボックスの [サイズ] タブで、幅に「自動」 と入力し、スペースと余白のそれぞれの値を設定します。ただし、右の余白は「0」にします。
    6. [表示] タブで、[条件付き書式] をクリックし、[追加] をクリックします。
    7. 1 つ目のボックスの一覧の [Type] をクリックし、2 つ目のボックスの一覧の [が次の値に等しい] をクリックします。3 つ目のボックスの一覧の [文字列の入力] をクリックし、「Motorcycle」と入力します。[AND/OR] をクリックし、[AND] の代わりに [OR] をクリックします。
    8. 1 つ目のボックスの一覧の [Type] をクリックし、2 つ目のボックスの一覧の [が次の値に等しい] をクリックします。3 つ目のボックスの一覧の [文字列の入力] をクリックし、「Bicycle」と入力します。
    9. [このコントロールを表示しない] チェック ボックスをオンにし、[OK] を 3 回クリックします。

    [Handlebars] チェック ボックスのラベルを表示/非表示条件を設定した式ボックスと置き換える

    1. [Handlebars] チェック ボックスのラベル テキストを選択します。
    2. [コントロール] 作業ウィンドウで式ボックスをクリックして、選択したラベル テキストの場所に挿入します。
    3. [式ボックスの挿入] ダイアログ ボックスで、「"Handlebars"」と入力し、[OK] をクリックします。
    4. 新しい式ボックスをダブルクリックします。
    5. [式ボックスのプロパティ] ダイアログ ボックスの [サイズ] タブで、幅に「自動」 と入力し、スペースと余白のそれぞれの値を設定します。ただし、右の余白は「0」にします。
    6. [表示] タブで、[条件付き書式] をクリックし、[追加] をクリックします。
    7. 1 つ目のボックスの一覧の [Type] をクリックし、2 つ目のボックスの一覧の [が次の値に等しい] をクリックします。3 つ目のボックスの一覧の [文字列の入力] をクリックし、「Car」と入力します。
    8. [このコントロールを表示しない] チェック ボックスをオンにし、[OK] を 3 回クリックします。完成したレイアウトは、図 5 のようになります。


    図 5 表示/非表示条件が設定されたチェック ボックスの横型のレイアウトの完成版

    ビューの .xsl ファイルを変更する

    1. [ファイル] メニューの [フォーム構成ファイルの取り出し] をクリックします。
    2. 取り出したフォーム構成ファイルの保存先を選択し、[OK] をクリックします。
    3. InfoPath を終了して、フォーム構成ファイルに対するロックを解除します。
    4. テキスト エディタを使用して、view1.xsl ファイルを開きます。

    [Engine] チェック ボックスを条件によって非表示にするコードを追加する

    1. テキスト「my:engine」を検索して、非表示にするチェック ボックス コントロールを表す input 要素を探します。
    2. input 要素の直後に、次のコードを追加します。

    <xsl:attribute name="style">MARGIN-LEFT: 10px;<xsl:choose>
            <xsl:when test="my:Type = &quot;Bicycle&quot;">DISPLAY: none</xsl:when>
        </xsl:choose>
    </xsl:attribute>

    重要なのは、input 要素の style 属性の値をコピーして xsl:attribute 要素と xsl:choose 要素の間に貼り付けることです。また、xsl:choose 要素の直前にはセミコロンを必ず追加してください。上のコードでは MARGIN-LEFT: 10px; を使用していますが、ここは style 属性で指定されている値と同じにする必要があります。

    1. input要素の style 属性を削除します。

    ここで注目してほしいのは、このコードをすべてタイプしなくても、単にこのチェック ボックスの式ボックス ラベルから (既に非表示になるように設定されているので) コードをコピーして、それを目的のチェック ボックス コードに貼り付けることも可能ということです。この後、input要素の style属性の内容を移動して、xsl:attribute 要素の内容を置き換えます。最後に、input要素の style 属性を削除します。

    [Steering Wheel] チェック ボックスを条件によって非表示にするコードを追加する

    1. テキスト「my:steeringWheel」を検索して、非表示にするチェック ボックス コントロールを表す input 要素を探します。
    2. input 要素の直後に、次のコードを追加します。

    <xsl:attribute name="style">MARGIN-LEFT: 10px;<xsl:choose>
            <xsl:when test="my:Type = &quot;Motorcycle&quot; or my:Type = &quot;Bicycle&quot;">DISPLAY: none</xsl:when>
        </xsl:choose>
    </xsl:attribute>

    1. input 要素の style 属性を削除します。

    [Handlebars] チェック ボックスを条件によって非表示にするコードを追加する

    1. テキスト「my:handlebars」を検索して、非表示にするチェック ボックス コントロールを表す input  要素を探します。
    2. input 要素の直後に、次のコードを追加します。

    <xsl:attribute name="style">MARGIN-LEFT: 10px;<xsl:choose>
            <xsl:when test="my:Type = &quot;Car&quot;">DISPLAY: none</xsl:when>
        </xsl:choose>
    </xsl:attribute>

    1. input要素の style 属性を削除します。

    確認

    1. ビューの .xsl ファイルを保存し、テキスト エディタを閉じます。
    2. manifest.xsf ファイルを右クリックし、[デザイン] をクリックして、フォーム テンプレートを再度開きます。
    3. フォームをプレビューします。
    4. [Type] ボックスの一覧の各項目をクリックして、適切なチェック ボックスとラベルのみが表示されることを確認します。

    以上の変更により、車両の種類に基づいて不要なものを表示しない横型の動的なチェック ボックスのリストができました。非表示のチェック ボックスは自動的にオフになります。 手動の修正は、デザイン モードでラウンドトリップされ、後で [チェック ボックスのプロパティ] ダイアログ ボックスで変更が行われてもそのまま維持されます。このアプローチは、少々の追加作業を伴いますが、最終的にその労力に十分見合った結果が得られます。

    ©2005 Greg Collins. All rights reserved. Licensed to Autonomy Systems, LLC for display on InfoPathDev.com.

    英文記事: Hide a Check Box Using Conditional Visibilityからの翻訳

  • 階層的なデータ ソースから繰り返しカスケード リストを作成する

    1 つのボックスの選択肢が別のボックスの値に依存する 2 つ以上のリスト ボックスが必要になることはよくあります。これは、カスケードリストと呼ばれます。カスケードを実行できるのは、最小 2 レベルからで、最大レベル数の制限はありません。以下はカスケードリストを必要とする一般的なシナリオの例です。

    • 場所: 州/市
    • 車両: メーカー/車種/装備
    • 学校: 年度/学期/授業科目/講師

    カスケードのレベル数が増えると、それにかかわる処理と作業もより複雑になります。また、カスケードリストが繰り返しテーブルまたは繰り返しセクション内に表示される場合は、別の問題、「データのクロスオーバー」に対処する必要があります。データのクロスオーバーとは、特定の行のカスケードに表示されるオプションが、他の行で先に選択された値の影響を受けることを意味し、これによって真のカスケード効果が失われます。

    このタスクでは、リストの設定に使用されるさまざまな値を含むフラットなセカンダリ データ ソースを作成します。次にドロップダウン リストボックスを使用して、レベルが 3 つある繰り返しカスケード リストを作成します。カスケード レベルを 3 つ作成するのは、レベルが 3 つ以上になると複雑さが増すことを示すためです。データのクロスオーバーの問題は、current 関数を使用して解決します。最後に、カスケード内で先に選択されていた項目が変更されたときに選択済みのリストの値をクリアする方法で、選択項目の組み合わせが常に有効になるようにします。
     
    階層的なセカンダリ データ ソース

    階層的なデータソースは、一般に XML で使用するために作成され、通常、フラットなデータソースよりも構造的で組織的です。階層を整理する方法は多数ありますが、ここでは、タスクに適した構造を選択しています。階層構造では、通常、一意の値だけが各リストに表示されますが、それでもやはり一意の値を表示するためのフィルタが必要な場合は、「リストに一意のオプションだけを表示する」を参照してください。まず、階層的なセカンダリ データ ソースを作成します。

    階層的なセカンダリ データ ソースを作成する

    次のコードをテキスト エディタにコピーし、Vehicles - Hierarchical Data Source.xml という名前でファイルを保存します。このファイルをこれから作成するフォームでセカンダリ データ ソースとして使用します。

    <?xml version="1.0" encoding="UTF-8"?>
    <Vehicles>
        <Year value="1963">
            <Make value="Chevrolet">
                <Model value="Corvette"/>
                <Model value="Nova"/>
            </Make>
            <Make value="Porsche">
                <Model value="356"/>
                <Model value="Carrera"/>
            </Make>
        </Year>
        <Year value="1973">
            <Make value="Ford">
                <Model value="Bronco"/>
                <Model value="Mustang"/>
                <Model value="Pinto"/>
            </Make>
            <Make value="Toyota">
                <Model value="Celica"/>
                <Model value="Land Cruiser"/>
            </Make>
        </Year>
        <Year value="1979">
            <Make value="Jaguar">
                <Model value="XJ6"/>
            </Make>
            <Make value="Pontiac">
                <Model value="Trans Am"/>
            </Make>
            <Make value="Volvo">
                <Model value="240"/>
                <Model value="244DL"/>
            </Make>
        </Year>
        <Year value="1987">
            <Make value="Dodge">
                <Model value="Ram Charger"/>
                <Model value="Grand Caravan"/>
            </Make>
            <Make value="Honda">
                <Model value="Civic"/>
                <Model value="Prelude"/>
            </Make>
            <Make value="Nissan">
                <Model value="300ZX"/>
                <Model value="Pulsar"/>
                <Model value="Sentra"/>
            </Make>
        </Year>
        <Year value="1999">
            <Make value="GMC">
                <Model value="Jimmy"/>
                <Model value="Sierra 2500 HD"/>
                <Model value="Yukon"/>
            </Make>
            <Make value="Honda">
                <Model value="Passport"/>
                <Model value="Prelude"/>
                <Model value="CR-V"/>
            </Make>
            <Make value="Jeep">
                <Model value="Cherokee"/>
            </Make>
            <Make value="Mercury">
                <Model value="Grand Marquis"/>
                <Model value="Sable"/>
                <Model value="Villager"/>
            </Make>
            <Make value="Pontiac">
                <Model value="Firebird"/>
                <Model value="Montana"/>
                <Model value="Sunfire"/>
            </Make>
        </Year>
        <Year value="2003">
            <Make value="Dodge">
                <Model value="Dakota"/>
                <Model value="Caravan"/>
                <Model value="Ram Charger"/>
                <Model value="Viper"/>
            </Make>
            <Make value="Mercury">
                <Model value="Sable"/>
            </Make>
        </Year>
        <Year value="2004">
            <Make value="Dodge">
                <Model value="Stratus"/>
                <Model value="Viper"/>
            </Make>
            <Make value="Ford">
                <Model value="Crown Victoria"/>
                <Model value="F250"/>
                <Model value="Thunderbird"/>
            </Make>
            <Make value="GMC">
                <Model value="Sierra 3500"/>
            </Make>
            <Make value="Jeep">
                <Model value="Grand Cherokee"/>
                <Model value="Liberty"/>
            </Make>
        </Year>
    </Vehicles>


    フォーム

    階層的なセカンダリ データ ソースができたので、これからフォームを作成します。まず、レベルが 3 つある繰り返しカスケードリストをサポートする単純なスキーマを設計します。次に、繰り返しテーブル内のドロップダウン リストボックスを使用して、レイアウトを設計します。レイアウトができたら、カスケードの作成に集中します。

    セカンダリ データ ソースをフォームに追加する

    1. 新しい空白のフォームをデザインします。
    2. [Tools] メニューの [Data Connections] をクリックし、[Add] をクリックします。
    3. Data Connection Wizard (データ接続ウィザード) の [Receive Data] をクリックし、[Next] をクリックします。
    4. [XML Document] をクリックし、[Next] をクリックします。
    5. [Browse] をクリックし、Vehicles - Hierarchical Data Source.xml ファイルを探して選択し、[Open] をクリックします。次に、[Next] をクリックします。
    6. [Finish] をクリックし、[Yes] をクリックしてから、[Close] をクリックします。

    スキーマの作成

    1. [Data Source] 作業ウィンドウを開きます。
    2. Vehicles」という名前のグループを追加します。
    3. [Vehicles] グループをクリックし、「Vehicle」という名前の繰り返しグループを追加します。
    4. [Vehicle] グループをクリックし、テキスト フィールドを 3 つ追加します。名前はそれぞれ「Year」、「Make」、および「Model」とします。

    ビューの設計

    1. [Vehicle] を右クリックし、[Repeating Table] をクリックします。
    2. 見出し行の3 つのセルをすべて選択し、フォント サイズを「8」に設定します。
    3. 3 つのテキストボックスをそれぞれ右クリックし、[Change To | Drop-Down List Box] をクリックします。この結果を図 1 に示します。


    図 1 繰り返しカスケード ドロップダウン リスト ボックスのレイアウト

    1. 繰り返しテーブルのラベルをダブルクリックします。
    2. [Repeating Table Properties] ダイアログボックスの [Data] タブで、挿入ボタンのヒントのテキストを「Insert Vehicle」に変更し、[OK] をクリックします。


    カスケード リスト

    フォームのレイアウトができたので、タスクの主目的である繰り返しリストを別のリストからカスケードさせる作業に入ります。処理はそれほど難しくありませんが、カスケード レベルの数が増えるごとに複雑さも増します。カスケードの作成にはフィルタの使用が必要です。リストボックスに表示されるオプションは、前のリスト ボックスで選択された値に基づいてフィルタされます。作成するカスケードは繰り返し構造なので、current 関数を使用して、フィルタが他の行の値にクロスオーバーしないようにする必要があります。それでは、用意しているセカンダリ データ ソースを使用して、各ドロップダウン リスト ボックスのオプションを設定し、カスケード フィルタを作成しましょう。

    [Year] ドロップダウン リストを設定する

    1. [Year] ボックスをダブルクリックします。
    2. [Drop-Down List Box Properties] ダイアログ ボックスで [Look Up Values In A Data Connection] をクリックします。
    3. [Data Connection] ボックスの一覧の [Vehicles - Hierarchical Data Source] をクリックします。
    4. [Entries] ボックスの右にある [Select XPath] ボタンをクリックし、[Vehicles/Year/value] をクリックしてから、[OK] を 2 回クリックして、開いているダイアログ ボックスを閉じます。

    [Make] ドロップダウン リストを設定する

    1. [Make] ボックスをダブルクリックします。
    2. [Drop-Down List Box Properties] ダイアログ ボックスで [Look Up Values In A Data Connection] をクリックします。
    3. [Data Connection] ボックスの一覧の [Vehicles - Hierarchical Data Source] をクリックします。
    4. [Entries] ボックスの右にある [Select XPath] ボタンをクリックし、[Vehicles/Year/Make/value] をクリックします。

    現在の行の [Year] の選択値に基づいて [Make] ドロップダウン リストをフィルタする

    1. [Filter Data] をクリックし、[Add] をクリックします。
    2. [Specify Filter Conditions] ダイアログ ボックスの 1 つ目のボックスの一覧の [Select A Field Or Group] をクリックします。
    3. [Select A Field Or Group] ダイアログ ボックスの [Vehicles/Year/value] をクリックし、[OK] をクリックします。
    4. 2 つ目のボックスの一覧の [Is Equal To] をクリックします。
    5. 3 つ目のボックスの一覧の [Use A Formula] をクリックします。
    6. 次の式を入力します (図 2 を参照)。

    current()/my:Year


    図 2 [Year] を現在の行の値と比較するためのフィルタ

    1. [OK] を 5 回クリックして、開いているダイアログ ボックスをすべて閉じます。

    データ クロスオーバーの問題が発生することは前に述べました。データ クロスオーバーの例は、図 3 と図 4 の違いに示されています。current 関数を使用しない場合、車両のメーカーは、現在繰り返しテーブル内で選択されているすべての年式でフィルタされるため、無効な選択項目の組み合わせが表示されます。したがって、年式で 1963 年、1979 年、および 2004 年の 3 行が選択されている場合、それぞれの [Make] ボックスの一覧には、図 4 のように、選択されている 3 つの年式のメーカーすべてのリストが含まれます。current 関数を適切に使用すると、[Make] ボックスの選択項目が、同じ行の [Year] ボックスで選択された年式の項目に限定されるので、データのクロスオーバーを回避できます。これを図 3 に示します。


    図 3 current 関数を使用して年式でフィルタされた車両メーカー


    図 4 current 関数を使用しないで年式でフィルタされた車両メーカー

    ここまでで、レベルが 2 つの繰り返しカスケードができました。[Make] ボックスのオプションは、現在の行で選択されている [Year] の値に基づいてフィルタされます。これについては、フォームをプレビューしてテストできます。次は、第 3 レベルのカスケードを作成します。ここから、カスケードのレベルを追加作成するたびにどんどん複雑になってくることがわかります。

    [Model] ドロップダウン リストを設定する

    1. [Model] ボックスをダブルクリックします。
    2. [Drop-Down List Box Properties] ダイアログ ボックスで、[Look Up Values In A Data Connection] をクリックします。
    3. [Data Connection] ボックスの一覧の [Vehicles - Hierarchical Data Source] をクリックします。
    4. [Entries] テキスト ボックスの右にある [Select XPath] ボタンをクリックし、[Vehicles/Year/Make/Model/value] をクリックします。

    現在の行の [Year] の選択値に基づいて [Model] ドロップダウン リストをフィルタする

    1. [Filter Data] をクリックし、[Add] をクリックします。
    2. [Specify Filter Conditions] ダイアログ ボックスの 1 つ目のボックスの一覧の [Select A Field Or Group] をクリックします。
    3. [Select A Field Or Group] ダイアログ ボックスの [Vehicles/Year/value] をクリックし、[OK] をクリックします。
    4. 2 つ目のボックスの一覧の [Is Equal To] をクリックします。
    5. 3 つ目のボックスの一覧の [Use A Formula] をクリックします。
    6. [Insert A Formula] ダイアログ ボックスに次の式を入力します。

    current()/my:Year

    1. [OK] をクリックします。

    現在の行の [Make] の選択値に基づいて [Model] ドロップダウン リストをフィルタする

    1. [And] をクリックして、2 つ目のフィルタ条件を作成します。
    2. 2 つ目のフィルタ条件の 1 つ目のボックスの一覧の [Select A Field Or Group] をクリックします。
    3. [Select A Field Or Group] ダイアログ ボックスの [Vehicles/Year/Make/value] をクリックし、[OK] をクリックします。
    4. 2 つ目のボックスの一覧の [Is Equal To] をクリックします。
    5. 3 つ目のボックスの一覧の [Use A Formula] をクリックします。
    6. [Insert A Formula] ダイアログ ボックスに次の式を入力します。

    current()/my:Make

    1. [OK] をクリックします。2 つのフィルタの条件を図 5 に示します。


    図 5 繰り返しカスケード リストの第 3 レベルのフィルタ

    1. [OK]を 4 回クリックして、開いているダイアログ ボックスをすべて閉じます。

    これでレベルが 3 つあるカスケードを作成できました。フォームをプレビューして、ドロップダウン リストボックスの機能をテストしてください。ここで、無効な選択項目の組み合わせを作成できるという問題にお気づきかもしれません。次のセクションでこの問題を解決します。


    変更後に選択項目をクリアする

    カスケードリストで対応が必要な問題として、既に選択されていた項目が、その前のレベルで選択項目が変更されたときに無効になる可能性が高いことがあります。たとえば、年式に 1963 年、車種に Chevrolet を選択し、後で年式に 1973 年を選択した場合、Chevrolet は 1973 年式の車種としてデータソースにリストされていないのに、選択済みの車種としてそのまま残ります。そこで、無効な選択項目の組み合わせが存在できないように古い値をクリアする必要があります。これは、動作規則を使って簡単に修正できます。

    少し時間をかければ、おそらく後に続く選択済みの値が有効かどうかを判断して、無効な値だけをクリアすることもできるでしょう。しかし、後の選択項目を単純にすべてクリアすることには利点があります。その 1 つは、ドミノ効果のように動作規則もカスケードできることです。1 つの値が変更されると、次の値がクリアされます。その値のクリアによって、さらにそれに続く値が次々にクリアされます。動作規則は自動的に現在の行に適用されるので、動作規則でcurrent 関数を使用してフィルタする必要はありません。

    作成する動作規則には条件を指定しないので、選択値が変更されるたびに処理されます。フィールドの選択値をクリアするために、動作規則の [Value] ボックスは空白のままにします。

    [Year] の選択値が変更されたときに [Make] の選択済みの値をクリアする

    1. [Year] ボックスをダブルクリックします。
    2. [Drop-Down List Box Properties] ダイアログ ボックスの [Rules] をクリックし、[Add] をクリックします。
    3. 動作規則に「Clear Make」という名前を付け、[Add Action] をクリックします。
    4. [Action] ダイアログ ボックスの [Action] ボックスの一覧の [Set A Field's Value] をクリックします。
    5. [Field] ボックスの右にある [Select XPath] ボタンをクリックし、メイン データ ソースの [myFields/Vehicles/Vehicle/Make] をクリックします。
    6. [OK] を 5 回クリックして、開いているダイアログ ボックスをすべて閉じます。

    [Make] で選択値が変更されたときに [Model] の選択済みの値をクリアする

    1. [Make] ボックスをダブルクリックします。
    2. [Drop-Down List Box Properties] ダイアログ ボックスの [Rules] をクリックし、[Add] をクリックします。
    3. 動作規則に「Clear Model」という名前を付け、[Add Action] をクリックします。
    4. [Action] ダイアログ ボックスの [Action] ボックスの一覧の [Set A Field's Value] をクリックします。
    5. [Field] ボックスの右にある [Select XPath] ボタンをクリックし、メイン データ ソースの [myFields/Vehicles/Vehicle/Model] をクリックします。
    6. [OK] を 5 回クリックして、開いているダイアログ ボックスをすべて閉じます。

    確認

    これで、レベルが 3 つあり、無効な選択項目の組み合わせが表示されない繰り返しカスケード リストを作成できました。フォームをプレビューし、さまざまな選択項目の組み合わせを試してください。

    ©2005 Greg Collins. All rights reserved. Licensed to Autonomy Systems, LLC for display on InfoPathDev.com.

  • フラットなデータ ソースから繰り返しカスケード リストを作成する

    1 つのボックスの選択肢が別のボックスの値に依存する 2 つ以上のリスト ボックスが必要になることはよくあります。これは、カスケードリストと呼ばれます。カスケードを実行できるのは、最小 2 レベルからで、最大レベル数の制限はありません。以下はカスケードリストを必要とする一般的なシナリオの例です。

    • 場所: 州/市
    • 車両: メーカー/車種/装備
    • 学校: 年度/学期/授業科目/講師

    カスケードのレベル数が増えると、それにかかわる処理と作業もより複雑になります。また、カスケードリストが繰り返しテーブルまたは繰り返しセクション内に表示される場合は、別の問題、「データのクロスオーバー」に対処する必要があります。データのクロスオーバーとは、特定の行のカスケードに表示されるオプションが、他の行で先に選択された値の影響を受けることを意味し、これによって真のカスケード効果が失われます。

    このタスクでは、リストの設定に使用されるさまざまな値を含むフラットなセカンダリ データ ソースを作成します。次にドロップダウン リストボックスを使用して、レベルが 3 つある繰り返しカスケード リストを作成します。カスケード レベルを 3 つ作成するのは、レベルが 3 つ以上になると複雑さが増すことを示すためです。さらに、フラット データソースの性質を考えて、各リストをフィルタし、一意の値だけが表示されるようにします。データのクロスオーバーの問題は、current 関数を使用して解決します。最後に、カスケード内で先に選択されていた項目が変更されたときに選択済みのリストの値をクリアする方法で、選択項目の組み合わせが常に有効になるようにします。


    フラットなセカンダリ データ ソース

    データベース、Web サービス、および SharePoint からは、通常、フラットなデータ ソースが返されます。フラットなデータソースの構造には階層がありません。これは同一の要素を並べただけのリストで、それぞれが同じ属性セットを持っています。変更されるのは属性の値だけです。フラットなデータ ソースでは、一意の値だけがドロップダウン リストに表示されるようにフィルタすることも必要です。まず、フラットなセカンダリデータ ソースを作成します。

    フラットなセカンダリ データ ソースを作成する

    次のコードをテキスト エディタにコピーし、Vehicles - Flat Data Source.xml という名前でファイルを保存します。このファイルをこれから作成するフォームでセカンダリ データ ソースとして使用します。

    <?xml version="1.0" encoding="UTF-8"?>
    <Vehicles>
        <Vehicle year="1963" make="Chevrolet" model="Corvette"/>
        <Vehicle year="1963" make="Chevrolet" model="Nova"/>
        <Vehicle year="1963" make="Porsche" model="356"/>
        <Vehicle year="1963" make="Porsche" model="Carrera"/>
        <Vehicle year="1973" make="Ford" model="Bronco"/>
        <Vehicle year="1973" make="Ford" model="Mustang"/>
        <Vehicle year="1973" make="Ford" model="Pinto"/>
        <Vehicle year="1973" make="Toyota" model="Celica"/>
        <Vehicle year="1973" make="Toyota" model="Land Cruiser"/>
        <Vehicle year="1979" make="Jaguar" model="XJ6"/>
        <Vehicle year="1979" make="Pontiac" model="Trans Am"/>
        <Vehicle year="1979" make="Volvo" model="240"/>
        <Vehicle year="1979" make="Volvo" model="244DL"/>
        <Vehicle year="1987" make="Dodge" model="Ram Charger"/>
        <Vehicle year="1987" make="Dodge" model="Grand Caravan"/>
        <Vehicle year="1987" make="Honda" model="Civic"/>
        <Vehicle year="1987" make="Honda" model="Prelude"/>
        <Vehicle year="1987" make="Nissan" model="300ZX"/>
        <Vehicle year="1987" make="Nissan" model="Pulsar"/>
        <Vehicle year="1987" make="Nissan" model="Sentra"/>
        <Vehicle year="1999" make="GMC" model="Jimmy"/>
        <Vehicle year="1999" make="GMC" model="Sierra 2500 HD"/>
        <Vehicle year="1999" make="GMC" model="Yukon"/>
        <Vehicle year="1999" make="Honda" model="Passport"/>
        <Vehicle year="1999" make="Honda" model="Prelude"/>
        <Vehicle year="1999" make="Honda" model="CR-V"/>
        <Vehicle year="1999" make="Jeep" model="Cherokee"/>
        <Vehicle year="1999" make="Mercury" model="Grand Marquis"/>
        <Vehicle year="1999" make="Mercury" model="Sable"/>
        <Vehicle year="1999" make="Mercury" model="Villager"/>
        <Vehicle year="1999" make="Pontiac" model="Firebird"/>
        <Vehicle year="1999" make="Pontiac" model="Montana"/>
        <Vehicle year="1999" make="Pontiac" model="Sunfire"/>
        <Vehicle year="2003" make="Dodge" model="Dakota"/>
        <Vehicle year="2003" make="Dodge" model="Caravan"/>
        <Vehicle year="2003" make="Dodge" model="Ram Charger"/>
        <Vehicle year="2003" make="Dodge" model="Viper"/>
        <Vehicle year="2003" make="Mercury" model="Sable"/>
        <Vehicle year="2004" make="Dodge" model="Stratus"/>
        <Vehicle year="2004" make="Dodge" model="Viper"/>
        <Vehicle year="2004" make="Ford" model="Crown Victoria"/>
        <Vehicle year="2004" make="Ford" model="F250"/>
        <Vehicle year="2004" make="Ford" model="Thunderbird"/>
        <Vehicle year="2004" make="GMC" model="Sierra 3500"/>
        <Vehicle year="2004" make="Jeep" model="Grand Cherokee"/>
        <Vehicle year="2004" make="Jeep" model="Liberty"/>
    </Vehicles>


    フォーム

    フラットなセカンダリ データ ソースができたので、これからフォームを作成します。まず、レベルが 3 つある繰り返しカスケードリストをサポートする単純なスキーマを設計します。次に、繰り返しテーブル内のドロップダウン リストボックスを使用して、レイアウトを設計します。レイアウトができたら、繰り返しカスケードの作成に集中します。

    セカンダリ データ ソースをフォームに追加する

    1. 新しい空白のフォームをデザインします。
    2. [Tools] メニューの [Data Connections] をクリックし、[Add] をクリックします。
    3. Data Connection Wizard (データ接続ウィザード) の [Receive Data] をクリックし、[Next] をクリックします。
    4. [XML Document] をクリックし、[Next] をクリックします。
    5. [Browse] をクリックし、Vehicles - Flat Data Source.xml ファイルを探して選択し、[Open] をクリックします。次に、[Next] をクリックします。
    6. [Finish] をクリックし、[Yes] をクリックしてから、[Close] をクリックします。

    スキーマの作成

    1. [Data Source] 作業ウィンドウを開きます。
    2. Vehicles」という名前のグループを追加します。
    3. [Vehicles] グループをクリックし、「Vehicle」という名前の繰り返しグループを追加します。
    4. [Vehicle] グループをクリックし、テキスト フィールドを 3 つ追加します。名前はそれぞれ「Year」、「Make」、および「Model」とします。

    ビューの設計

    1. [Vehicle] を右クリックし、[Repeating Table] をクリックします。
    2. 見出し行の3 つのセルをすべて選択し、フォント サイズを「8」に設定します。
    3. 3 つのテキストボックスをそれぞれ右クリックし、[Change To | Drop-Down List Box] をクリックします。この結果を図 1 に示します。


    図 1 繰り返しカスケード ドロップダウン リスト ボックスのレイアウト

    1. 繰り返しテーブルのラベルをダブルクリックします。
    2. [Repeating Table Properties] ダイアログボックスの [Data] タブで、挿入ボタンのヒントのテキストを「Insert Vehicle」に変更し、[OK] をクリックします。

    カスケード リスト

    フォームのレイアウトができたので、タスクの主目的であるリストを別のリストからカスケードさせる作業に入ります。処理はそれほど難しくありませんが、カスケード レベルの数が増えるごとに複雑さも増します。カスケードの作成にはフィルタの使用が必要です。リストボックスに表示されるオプションは、前のリスト ボックスで選択された値に基づいてフィルタされます。作成するカスケードは繰り返し構造なので、current 関数を使用して、フィルタが他の行の値にクロスオーバーしないようにする必要があります。それでは、用意しているセカンダリ データ ソースを使用して、各ドロップダウン リスト ボックスのオプションを設定し、カスケード フィルタを作成しましょう。

    [Year] ドロップダウン リストを設定する

    1. [Year] ボックスをダブルクリックします。
    2. [Drop-Down List Box Properties] ダイアログ ボックスで [Look Up Values In A Data Connection] をクリックします。
    3. [Data Connection] ボックスの一覧の [Vehicles - Flat Data Source] をクリックします。
    4. [Entries] ボックスの右にある [Select XPath] ボタンをクリックし、[Vehicles/Vehicle/year] をクリックしてから、[OK] を 2 回クリックして、開いているダイアログ ボックスを閉じます。

    [Make] ドロップダウン リストを設定する

    1. [Make] ボックスをダブルクリックします。
    2. [Drop-Down List Box Properties] ダイアログ ボックスで [Look Up Values In A Data Connection] をクリックします。
    3. [Data Connection] ボックスの一覧の [Vehicles - Flat Data Source] をクリックします。
    4. [Entries] ボックスの右にある [Select XPath] ボタンをクリックし、[Vehicles/Vehicle/make] をクリックします。

    現在の行の [Year] の選択値に基づいて [Make] ドロップダウン リストをフィルタする

    1. [Filter Data] をクリックし、[Add] をクリックします。
    2. [Specify Filter Conditions] ダイアログ ボックスの 1 つ目のボックスの一覧の [Select A Field Or Group] をクリックします。
    3. [Select A Field Or Group] ダイアログ ボックスの [Vehicles/Vehicle/year] をクリックし、[OK] をクリックします。
    4. 2 つ目のボックスの一覧の [Is Equal To] をクリックします。
    5. 3 つ目のボックスの一覧の [Use A Formula] をクリックします。
    6. 次の式を入力します (図 2 を参照)。

    current()/my:Year


    図 2 [Year] を現在の行の値と比較するためのフィルタ

    1. [OK] を 5 回クリックして、開いているダイアログ ボックスをすべて閉じます。

    データ クロスオーバーの問題が発生することは前に述べました。データ クロスオーバーの例は、図 3 と図 4 の違いに示されています (図 3 および図 4 は既に一意の値を表示するようにフィルタされています) 。current 関数を使用しない場合、車両のメーカーは、現在繰り返しテーブル内で選択されているすべての年式でフィルタされるため、無効な選択項目の組み合わせが表示されます。したがって、年式で 1963 年、1979 年、および 2004 年の 3 行が選択されている場合、それぞれの [Make] ボックスの一覧には、図 4 のように、選択されている 3 つの年式のメーカーすべてのリストが含まれます。current関数を適切に使用すると、[Make] ボックスの選択項目が、同じ行の [Year] ボックスで選択された年式の項目に限定されるので、データのクロスオーバーを回避できます。これを図 3 に示します。


    図 3 current 関数を使用して年式でフィルタされた車両メーカー

    図 4 current 関数を使用しないで年式でフィルタされた車両メーカー

    ここまでで、レベルが 2 つの繰り返しカスケードができました。[Make] ボックスのオプションは、現在の行で選択されている [Year] の値に基づいてフィルタされます。これについては、フォームをプレビューしてテストできます。テストすると、各ドロップダウンリストに繰り返しの値が含まれていることがわかります。これは、フラットデータソースの使用による副産物ですが、後のセクションで一意の値を表示するためのフィルタを適用すると修正されます。次は、第 3 レベルのカスケードを作成します。ここから、カスケードのレベルを追加作成するたびにどんどん複雑になってくることがわかります。

    [Model] ドロップダウン リストを設定する

    1. [Model] ボックスをダブルクリックします。
    2. [Drop-Down List Box Properties] ダイアログ ボックスで、[Look Up Values In A Data Connection] をクリックします。
    3. [Data Connection] ボックスの一覧の [Vehicles - Flat Data Source] をクリックします。
    4. [Entries] テキスト ボックスの右にある [Select XPath] ボタンをクリックし、[Vehicles/Vehicle/model] をクリックします。

    現在の行の [Year] の選択値に基づいて [Model] ドロップダウン リストをフィルタする

    1. [Filter Data] をクリックし、[Add] をクリックします。
    2. [Specify Filter Conditions] ダイアログ ボックスの 1 つ目のボックスの一覧の [Select A Field Or Group] をクリックします。
    3. [Select A Field Or Group] ダイアログ ボックスの [Vehicles/Vehicle/year] をクリックし、[OK] をクリックします。
    4. 2 つ目のボックスの一覧の [Is Equal To] をクリックします。
    5. 3 つ目のボックスの一覧の [Use A Formula] をクリックします。
    6. [Insert A Formula] ダイアログ ボックスに次の式を入力します。

    current()/my:Year

    1. [OK] をクリックします。

    現在の行の [Make] の選択値に基づいて [Model] ドロップダウン リストをフィルタする

    1. [And] をクリックして、2 つ目のフィルタ条件を作成します。
    2. 2 つ目のフィルタ条件の 1 つ目のボックスの一覧の [Select A Field Or Group] をクリックします。
    3. [Select A Field Or Group] ダイアログ ボックスの [Vehicles/Vehicle/make] をクリックし、[OK] をクリックします。
    4. 2 つ目のボックスの一覧の [Is Equal To] をクリックします。
    5. 3 つ目のボックスの一覧の [Use A Formula] をクリックします。
    6. [Insert A Formula] ダイアログ ボックスに次の式を入力します。

    current()/my:Make

    1. [OK] をクリックします。2 つのフィルタの条件を図 5 に示します。

    図 5 繰り返しカスケード リストの第 3 レベルのフィルタ

    1. [OK] を 4 回クリックして、開いているダイアログ ボックスをすべて閉じます。

    これでレベルが 3 つあるカスケードを作成できました。フォームをプレビューして、ドロップダウン リストボックスの機能をテストしてください。お気づきかもしれませんが、ここでは問題が 2 つあります。1 つは、リストオプションが一意ではないこと、もう 1 つは、無効な選択項目の組み合わせを作成できることです。この 2 つの問題を次の 2 つのセクションで解決します。


    一意の値を表示するためにリストをフィルタする

    通常、フラット データ ソース内の値は繰り返されます。XML の構造を考えるとこれは重要ですが、一方でリストボックスのオプションの増大につながります。同じオプションを多数を表示しても、ユーザーは混乱し、いら立つだけです。これを解決するには、リストをフィルタして一意の値だけを表示します。このためには、XPath を使用します。

    カスケード レベルを追加するごとにカスケード フィルタの複雑さが増大するように、一意性フィルタの複雑さも増大することにも触れておきます。これについては、この後、一意の値を表示するために [Model] ドロップダウン リストに適用するフィルタで使用する式を見てもわかります。

    [Year] ドロップダウン リストに一意性フィルタを追加する

    1. [Year] ボックスをダブルクリックします。
    2. [Drop-Down List Box Properties] ダイアログ ボックスで、[Entries] ボックスの右にある [Select XPath] ボタンをクリックします。
    3. [Select A Field Or Group] ダイアログ ボックスの [Filter Data] をクリックし、[Add] をクリックします。
    4. [Specify Filter Conditions] ダイアログ ボックスの 1 つ目のボックスの一覧の [The Expression] をクリックし、次の式を入力します (図 6 を参照)。

    not(. = ../preceding-sibling::Vehicle/@year)


    図 6 一意の値だけを表示するためにリスト オプションに適用するフィルタ

    1. [OK] を 4 回クリックして、開いているダイアログ ボックスをすべて閉じます。

    [Make] ドロップダウン リストに一意性フィルタを追加する

    最初のリスト ボックスから続く各カスケードレベルでは、前の各レベルの選択を考慮に入れた一意性フィルタを設定する必要があります。前の選択を考慮に入れない場合、このフィルタの性質上、気づかないうちに有効なオプションをすべてフィルタで除外してしまう可能性があります。

    たとえば、サンプルのセカンダリ データ ソースでは、年式が 1987 年および 1999 年の両方に Honda の車両が含まれています。選択されている年式を考慮しない場合、年式として 1999 年が選択されたときに、メーカー名の Honda はオプションとして表示されません。これは、フィルタが、メーカー名 Honda がセカンダリ データソースで既に出現していると判断するからです。年式が 2003 年および 2004 年の Dodge も、1987 年に Dodge が既に出現しているので、完全にフィルタで除外されます。サンプルのセカンダリ データソースでこの問題が発生するメーカーおよび車種は他にもいくつかあります。

    1. [Make] ボックスをダブルクリックします。
    2. [Drop-Down List Box Properties] ダイアログ ボックスで [Entries] ボックスの右にある [Select XPath] ボタンをクリックします。
    3. [Select A Field Or Group] ダイアログ ボックスの [Filter Data] をクリックし、[Add] をクリックします。
    4. [Specify Filter Conditions] ダイアログ ボックスの 1 つ目のボックスの一覧の [The Expression] をクリックし、次の式を入力します。

    not(. = ../preceding-sibling::Vehicle[@year = current()/my:Year]/@make)

    [Year] ドロップダウン リストに配置した一意性フィルタと比較すると、Vehicle ノードに追加のサブフィルタが指定されています。サブフィルタ [@year = current()/my:Year] は、選択した年式の各メーカーの一意の値を表示しているかどうかを、メイン フィルタに強制的に検証させます。

    1. [OK] を 4 回クリックして、開いているダイアログ ボックスをすべて閉じます。

    [Model] ドロップダウン リストに一意性フィルタを追加する

    1. [Model] ボックスをダブルクリックします。
    2. [Drop-Down List Box Properties] ダイアログ ボックスで [Entries] ボックスの右にある [Select XPath] ボタンをクリックします。
    3. [Select A Field Or Group] ダイアログ ボックスの [Filter Data] をクリックし、[Add] をクリックします。
    4. [Specify Filter Conditions] ダイアログ ボックスの 1 つ目のボックスの一覧の [The Expression] をクリックし、次の式を入力します。

    not(. = ../preceding-sibling::Vehicle[@year = current()/my:Year and @make = current()/my:Make]/@model)

    ここでは、前述の [Make] ドロップダウン リストの一意性フィルタの場合と同様に、選択した年式およびメーカー内の車種のリストからの繰り返しオプションだけを削除していることを保証するサブフィルタを追加しました。

    1. [OK] を 4 回クリックして、開いているダイアログ ボックスをすべて閉じます。

    どのカスケード レベルでも、値が常に一意であり、それが変わることがないことを保証できる場合は、一意性フィルタを追加する必要はありません。しかし、確信がない場合は追加しておく方が賢明です。一意の値を表示するためにリストに適用するフィルタの詳細については、「リストに一意のオプションだけを表示する」を参照してください。
     
    変更後に選択項目をクリアする

    カスケード リストで対応が必要なもう 1 つの問題は、既に選択されていた項目が、その前のレベルで選択項目が変更されたときに無効になる可能性が高いことです。たとえば、年式に 1963 年、車種に Chevrolet を選択し、後で年式に 1973 年を選択した場合、Chevrolet は 1973 年式の車種としてデータソースにリストされていないのに、選択済みの車種としてそのまま残ります。そこで、無効な選択項目の組み合わせが存在できないように、古い値をクリアする必要があります。これは、動作規則を使って簡単に修正できます。

    少し時間をかければ、おそらく後に続く選択済みの値が有効かどうかを判断して、無効な値だけをクリアすることもできるでしょう。しかし、後の選択項目を単純にすべてクリアすることには利点があります。その 1 つは、ドミノ効果のように動作規則もカスケードできることです。1 つの値が変更されると、次の値がクリアされます。その値のクリアによって、さらにそれに続く値が次々にクリアされます。動作規則は自動的に現在の行に適用されるので、動作規則でcurrent関数を使用してフィルタする必要はありません。

    作成する動作規則には条件を指定しないので、選択値が変更されるたびに処理されます。フィールドの選択値をクリアするために、動作規則の [Value] ボックスは空白のままにします。

    [Year] の選択値が変更されたときに [Make] の選択済みの値をクリアする

    1. [Year] ボックスをダブルクリックします。
    2. [Drop-Down List Box Properties] ダイアログ ボックスの [Rules] をクリックし、[Add] をクリックします。
    3. 動作規則に「Clear Make」という名前を付け、[Add Action] をクリックします。
    4. [Action] ダイアログ ボックスの [Action] ボックスの一覧の [Set A Field's Value] をクリックします。
    5. [Field] ボックスの右にある [Select XPath] ボタンをクリックし、メイン データ ソースの [myFields/Vehicles/Vehicle/Make] をクリックします。
    6. [OK] を 5 回クリックして、開いているダイアログ ボックスをすべて閉じます。

     

    [Make] で選択値が変更されたときに [Model] の選択済みの値をクリアする

    1. [Make] ボックスをダブルクリックします。
    2. [Drop-Down List Box Properties] ダイアログ ボックスの [Rules] をクリックし、[Add] をクリックします。
    3. 動作規則に「Clear Model」という名前を付け、[Add Action] をクリックします。
    4. [Action] ダイアログ ボックスの [Action] ボックスの一覧の [Set A Field's Value] をクリックします。
    5. [Field] ボックスの右にある [Select XPath] ボタンをクリックし、メイン データ ソースの [myFields/Vehicles/Vehicle/Model] をクリックします。
    6. [OK] を 5 回クリックして、開いているダイアログ ボックスをすべて閉じます。

    確認

    これで、レベルが 3 つあり、一意の値を表示するためのフィルタを備え、無効な選択項目の組み合わせが表示されない繰り返しカスケード リストを作成できました。フォームをプレビューし、さまざまな選択項目の組み合わせを試してください。

    ©2005 Greg Collins. All rights reserved. Licensed to Autonomy Systems, LLC for display on InfoPathDev.com.

More Posts Next page »
Copyright © 2003-2019 Qdabra Software. All rights reserved.
View our Terms of Use.