1 つのボックスの選択肢が別のボックスの値に依存する 2 つ以上のリスト ボックスが必要になることはよくあります。これは、カスケード リストと呼ばれます。カスケードを実行できるのは、最小 2 レベルからで、最大レベル数の制限はありません。以下はカスケード リストを必要とする一般的なシナリオの例です。
- 場所: 州/市
- 車両: メーカー/車種/装備
- 学校: 年度/学期/授業科目/講師
カスケードのレベル数が増えると、それにかかわる処理と作業もより複雑になります。また、カスケード リストが繰り返しテーブルまたは繰り返しセクション内に表示される場合は、別の問題、「データのクロスオーバー」に対処する必要があります。
このタスクでは、リストの設定に使用されるさまざまな値を含む階層的ななセカンダリ データ ソースを作成します。次にドロップダウン リスト ボックスを使用して、レベルが 3 つで繰り返しのないカスケード リストを作成します。カスケード レベルを 3 つ作成するのは、レベルが 3 つ以上になると複雑さが増すことを示すためです。さらに、フラット データ ソースの性質を考えて、各リストをフィルタし、一意の値だけが表示されるようにします。最後に、カスケード内で先に選択されていた項目が変更されたときに選択済みのリストの値をクリアする方法で、選択項目の組み合わせが常に有効になるようにします。
フラットなセカンダリ データ ソース
データベース、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 つのカスケード リストをサポートする単純なスキーマを設計します。次に、ドロップダウン リスト ボックスを使用してレイアウトを設計します。レイアウトができたら、カスケードの作成に集中します。
セカンダリ データ ソースをフォームに追加する
- 新しい空白のフォームをデザインします。
- [Tools] メニューの [Data Connections] をクリックし、[Add] をクリックします。
- Data Connection Wizard (データ接続ウィザード) の [Receive Data] をクリックし、[Next] をクリックします。
- [XML Document] をクリックし、[Next] をクリックします。
- [Browse] をクリックし、Vehicles - Flat Data Source.xml ファイルを探して選択し、[Open] をクリックします。次に、[Next] をクリックします。
- [Finish] をクリックし、[Yes] をクリックしてから、[Close] をクリックします。
スキーマの作成
- [Data Source] 作業ウィンドウを開きます。
- 「Vehicle」という名前のグループを追加します。
- [Vehicle] グループをクリックし、テキスト フィールドを 3 つ追加します。名前はそれぞれ「Year」、「Make」、および「Model」とします。
ビューの設計
- ビューに 3 列のレイアウト用の表を追加します。
- 図 1 のように、左から右の順に、[Year]、[Make]、[Model] の各フィールドをドロップダウン リスト ボックスとしてレイアウト用の表のセルに挿入します。

図 1 カスケード ドロップダウン リスト ボックスのレイアウト
カスケード リスト
フォームのレイアウトができたので、タスクの主目的であるリストを別のリストからカスケードさせる作業に入ります。処理はそれほど難しくありませんが、カスケード レベルの数が増えるごとに複雑さも増します。カスケードの作成にはフィルタの使用が必要です。リスト ボックスに表示されるオプションは、前のリスト ボックスで選択された値に基づいてフィルタされます。用意しているセカンダリ データ ソースを使用して、各ドロップダウン リスト ボックスのオプションを設定し、カスケード フィルタを作成しましょう。
[Year] ドロップダウン リストを設定する
- [Year] ボックスをダブルクリックします。
- [Drop-Down List Box Properties] ダイアログ ボックスで [Look Up Values In A Data Connection] をクリックします。
- [Data Connection] ボックスの一覧の [Vehicles - Flat Data Source] をクリックします。
- [Entries] ボックスの右にある [Select XPath] ボタンをクリックし、[Vehicles/Vehicle/year] をクリックしてから、[OK] を 2 回クリックして、開いているダイアログ ボックスを閉じます。
[Make] ドロップダウン リストを設定する
- [Make] ボックスをダブルクリックします。
- [Drop-Down List Box Properties] ダイアログ ボックスで [Look Up Values In A Data Connection] をクリックします。
- [Data Connection] ボックスの一覧の [Vehicles - Flat Data Source] をクリックします。
- [Entries] ボックスの右にある [Select XPath] ボタンをクリックし、[Vehicles/Vehicle/make] をクリックします。
[Year] の選択値に基づいて [Make] ドロップダウン リストをフィルタする
- [Filter Data] をクリックし、[Add] をクリックします。
- [Specify Filter Conditions] ダイアログ ボックスの 1 つ目のボックスの一覧の [Select A Field Or Group] をクリックします。
- [Select A Field Or Group] ダイアログ ボックスの [Vehicles/Vehicle/year] をクリックし、[OK] をクリックします。
- 2 つ目のボックスの一覧の [Is Equal To] をクリックします。
- 3 つ目のボックスの一覧の [Select A Field Or Group] をクリックします。
- [Select A Field Or Group] ダイアログ ボックスの [Data Source] ボックスの一覧の [Main] をクリックし、[myFields/Vehicle/Year] をクリックしてから、[OK] をクリックします (図 2 を参照)。

図 2 カスケード リストの第 2 レベルのフィルタ
- [OK] を 4 回クリックして、開いているダイアログ ボックスをすべて閉じます。
ここまでで、レベルが 2 つのカスケードができました。[Make] ドロップダウン リストのオプションは、選択済みの [Year] の値に基づいてフィルタされます。これについては、フォームをプレビューしてテストできます。次に、第 3 レベルのカスケードを作成します。ここから、カスケードのレベルを追加作成するたびにどんどん複雑になってくることがわかります。
[Model] ドロップダウン リストを設定する
- [Model] ボックスをダブルクリックします。
- [Drop-Down List Box Properties] ダイアログ ボックスで、[Look Up Values In A Data Connection] をクリックします。
- [Data Connection] ボックスの一覧の [Vehicles - Flat Data Source] をクリックします。
- [Entries] テキスト ボックスの右にある [Select XPath] ボタンをクリックし、[Vehicles/Vehicle/model] をクリックします。
[Year] の選択値に基づいて [Model] ドロップダウン リストをフィルタする
- [Filter Data] をクリックし、[Add] をクリックします。
- [Specify Filter Conditions] ダイアログ ボックスの 1 つ目のボックスの一覧の [Select A Field Or Group] をクリックします。
- [Select A Field Or Group] ダイアログ ボックスの [Vehicles/Vehicle/year] をクリックし、[OK] をクリックします。
- 2 つ目のボックスの一覧の [Is Equal To] をクリックします。
- 3 つ目のボックスの一覧の [Select A Field Or Group] をクリックします。
- [Select A Field Or Group] ダイアログ ボックスの [Data Source] ボックスの一覧の [Main] をクリックし、[myFields/Vehicle/Year] をクリックしてから、[OK] をクリックします。
[Make] の選択値に基づいて [Model] ドロップダウンリストをフィルタする
- [And] をクリックして、2 つ目のフィルタ条件を作成します。
- 2 つ目のフィルタ条件の 1 つ目のボックスの一覧の [Select A Field Or Group] をクリックします。
- [Select A Field Or Group] ダイアログ ボックスの [Vehicles/Vehicle/make] をクリックし、[OK] をクリックします。
- 2 つ目のボックスの一覧の [Is Equal To] をクリックします。
- 3 つ目のボックスの一覧の [Select A Field Or Group] をクリックします。
- [Select A Field Or Group] ダイアログ ボックスの [Data Source] ボックスの一覧の [Main] をクリックし、[myFields/Vehicle/Make] をクリックしてから、[OK] をクリックします (図 3 を参照)。

図 3 カスケード リストの第 3 レベルのフィルタ
- [OK] を 4 回クリックして、開いているダイアログ ボックスをすべて閉じます。
これでレベルが 3 つあるカスケードを作成できました。フォームをプレビューして、ドロップダウンリストボックスの機能をテストしてください。お気づきかもしれませんが、ここでは問題が 2 つあります。1 つは、リストオプションが一意ではないこと、もう 1 つは、無効な選択項目の組み合わせを作成できることです。この 2 つの問題を次の 2 つのセクションで解決します。
一意の値を表示するためにリストをフィルタする
通常、フラットデータソース内の値は繰り返されます。XML の構造を考えるとこれは重要ですが、一方でリスト ボックスのオプションの増大につながります。同じオプションを多数を表示しても、ユーザーは混乱し、いら立つだけです。これを解決するには、リストをフィルタして一意の値だけを表示します。このためには、XPath を使用します。
カスケードレベルを追加するごとにカスケード フィルタの複雑さが増大するように、一意性フィルタの複雑さも増大することにも触れておきます。これについては、この後、一意の値を表示するために [Model] ドロップダウンリストに適用するフィルタで使用する式を見てもわかります。
[Year] ドロップダウン リストに一意性フィルタを追加する
- [Year] ボックスをダブルクリックします。
- [Drop-Down List Box Properties] ダイアログボックスで、[Entries] ボックスの右にある [Select XPath] ボタンをクリックします。
- [Select A Field Or Group] ダイアログ ボックスの [Filter Data] をクリックし、[Add] をクリックします。
- [Specify Filter Conditions] ダイアログ ボックスの 1 つ目のボックスの一覧の [The Expression] をクリックし、次の式を入力します (図 4 を参照)。
not(. = ../preceding-sibling::Vehicle/@year) |

図 4 一意の値だけを表示するためにリスト オプションに適用するフィルタ
- [OK] を 4 回クリックして、開いているダイアログ ボックスをすべて閉じます。
[Make] ドロップダウン リストに一意性フィルタを追加する
最初のリストボックスから続く各カスケードレベルでは、前の各レベルの選択を考慮に入れた一意性フィルタを設定する必要があります。前の選択を考慮に入れない場合、このフィルタの性質上、気づかないうちに有効なオプションをすべてフィルタで除外してしまう可能性があります。
たとえば、サンプルのセカンダリデータソースでは、年式が 1987 年および 1999 年の両方にHonda の車両が含まれています。選択されている年式を考慮しない場合、年式として 1999 年が選択されたときに、メーカー名の Honda はオプションとして表示されません。これは、フィルタが、メーカー名 Honda がセカンダリデータソースで既に出現していると判断するからです。年式が 2003 年および 2004 年の Dodge も、1987 年に Dodge が既に出現しているので、完全にフィルタで除外されます。サンプルのセカンダリデータソースでこの問題が発生するメーカーおよび車種は他にもいくつかあります。
- [Make] ボックスをダブルクリックします。
- [Drop-Down List Box Properties] ダイアログ ボックスで [Entries] ボックスの右にある [Select XPath] ボタンをクリックします。
- [Select A Field Or Group] ダイアログ ボックスの [Filter Data] をクリックし、[Add] をクリックします。
- [Specify Filter Conditions] ダイアログ ボックスの 1 つ目のボックスの一覧の [The Expression] をクリックし、次の式を入力します。
not(. = ../preceding-sibling::Vehicle[@year = current()/my:Vehicle/my:Year]/@make) |
[Year] ドロップダウン リストに配置した一意性フィルタと比較すると、Vehicle ノードに追加のサブフィルタが指定されています。サブフィルタ [@year = current()/my:Vehicle/my:Year] は、選択した年式の各メーカーの一意の値を表示しているかどうかを、メイン フィルタに強制的に検証させます。
- [OK] を 4 回クリックして、開いているダイアログ ボックスをすべて閉じます。
[Model] ドロップダウン リストに一意性フィルタを追加する
- [Model] ボックスをダブルクリックします。
- [Drop-Down List Box Properties] ダイアログ ボックスで [Entries] ボックスの右にある [Select XPath] ボタンをクリックします。
- [Select A Field Or Group] ダイアログ ボックスの [Filter Data] をクリックし、[Add] をクリックします。
- [Specify Filter Conditions] ダイアログ ボックスの 1 つ目のボックスの一覧の [The Expression] をクリックし、次の式を入力します。
not(. = ../preceding-sibling::Vehicle[@year = current()/my:Vehicle/my:Year and @make = current()/my:Vehicle/my:Make]/@model) |
ここでは、前述の [Make] ドロップダウンリストの一意性フィルタの場合と同様に、選択した年式およびメーカー内の車種のリストからの繰り返しオプションだけを削除していることを保証するサブフィルタを追加しました。
- [OK] を 4 回クリックして、開いているダイアログ ボックスをすべて閉じます。
どのカスケードレベルでも、値が常に一意であり、それが変わることがないことを保証できる場合は、一意性フィルタを追加する必要はありません。しかし、確信がない場合は追加しておく方が賢明です。一意の値を表示するためにリストに適用するフィルタの詳細については、「リストに一意のオプションだけを表示する」を参照してください。
変更後に選択項目をクリアする
カスケード リストで対応が必要なもう 1 つの問題は、既に選択されていた項目が、その前のレベルで選択項目が変更されたときに無効になる可能性が高いことです。たとえば、年式に 1963 年、車種に Chevrolet を選択し、後で年式に 1973 年を選択した場合、Chevroletは 1973 年式の車種としてデータソースにリストされていないのに、選択済みの車種としてそのまま残ります。そこで、無効な選択項目の組み合わせが存在できないように、古い値をクリアする必要があります。これは、動作規則を使って簡単に修正できます。
少し時間をかければ、おそらく後に続く選択済みの値が有効かどうかを判断して、無効な値だけをクリアすることもできるでしょう。しかし、後の選択項目を単純にすべてクリアすることには利点があります。その 1 つは、ドミノ効果のように動作規則もカスケードできることです。1 つの値が変更されると、次の値がクリアされます。その値のクリアによって、さらにそれに続く値が次々にクリアされます。
作成する動作規則には条件を指定しないので、選択値が変更されるたびに処理されます。フィールドの選択値をクリアするために、動作規則の [Value] ボックスは空白のままにします。
[Year] の選択値が変更されたときに [Make] の選択済みの値をクリアする
- [Year] ボックスをダブルクリックします。
- [Drop-Down List Box Properties] ダイアログ ボックスの [Rules] をクリックし、[Add] をクリックします。
- 動作規則に「Clear Make」という名前を付け、[Add Action] をクリックします。
- [Action] ダイアログ ボックスの [Action] ボックスの一覧の [Set A Field's Value] をクリックします。
- [Field] ボックスの右にある [Select XPath] ボタンをクリックし、メイン データ ソースの [myFields/Vehicle/Make] をクリックします。
- [OK] を 5 回クリックして、開いているダイアログ ボックスをすべて閉じます。
[Make] の選択値が変更されたときに [Model] の選択済みの値をクリアする
- [Make] ボックスをダブルクリックします。
- [Drop-Down List Box Properties] ダイアログ ボックスの [Rules] をクリックし、[Add] をクリックします。
- 動作規則に「Clear Model」という名前を付け、[Add Action] をクリックします。
- [Action] ダイアログ ボックスの [Action] ボックスの一覧の [Set A Field's Value] をクリックします。
- [Field] ボックスの右にある [Select XPath] ボタンをクリックし、メイン データ ソースの [myFields/Vehicle/Model] をクリックします。
- [OK] を 5 回クリックして、開いているダイアログ ボックスをすべて閉じます。
確認
これで、レベルが 3 つあり、一意の値を表示するためのフィルタを備え、無効な選択項目の組み合わせが表示されないカスケード リストを作成できました。フォームをプレビューし、さまざまな選択項目の組み合わせを試してください。
©2005 Greg Collins. All rights reserved. Licensed to Autonomy Systems, LLC for display on InfoPathDev.com.