場合によっては、単一のリスト ボックスまたはドロップダウン リスト ボックスでユーザーが行った選択の順序を記録することが必要になることがあります。これを実現するは、OnAfterChange イベント ハンドラに独自のコードを記述します。また、動作規則を使用することもできます。
このタスクでは、リスト ボックスを作成し、メインデータソース内の別のフィールドにユーザーの選択順序を記録します。ここでは、前述の 2 つのアプローチの両方を説明します。まず、新しい空白のフォームを作成しておきます。
スキーマの作成
- [データ ソース] 作業ウィンドウを開きます。
- 「SelectionsViaRules」という名前のテキスト フィールドを追加します。
- 「SelectionsViaCode」という名前のテキスト フィールドを追加します。
- 「Choice」という名前のテキスト フィールドを追加します。
ビューの設計
- [マイフィールド] を右クリックし、[コントロール] をクリックします。
- 各テキストボックスの前にキャリッジリターンを追加して、それぞれを新しい行に配置します。
- 「Selections Via Rules」 というラベルのテキスト ボックスをダブルクリックします。
- [テキスト ボックスのプロパティ] ダイアログ ボックスの [表示] タブで、[読み取り専用] チェック ボックスおよび [文字列を折り返して全体を表示する] チェック ボックスをオンにし、[スクロール] ボックスの一覧の [展開してすべての文字列を表示する] をクリックします。
- [サイズ] タブで、幅の値を「651」に設定し (図 1 を参照)、[OK] をクリックします。

図 1 テキスト ボックスのプロパティの調整
- Selections Via Code」というラベルのテキスト ボックスについても、前のテキスト ボックスとすべて同じように設定します。
- 「Choice」というラベルのテキスト ボックスを右クリックし、[変更 | リスト ボックス] をクリックします。 Make all of the same adjustments to the text box labeled Selections
リスト ボックスの設定
- リスト ボックスをダブルクリックします。
- [リスト ボックスのプロパティ] ダイアログ ボックスの [データ] タブで、値を文字「A」、「B」、「C」、「D」、「E」に設定した 5 つのエントリを追加し (図 2 を参照)、[OK] をクリックします。

図 2 リスト ボックスの項目の追加
- Stretch the list box down to reveal all of the entries we just added.
アプローチ 1 – 動作規則を使用して選択を記録する
サンプルフォーム用に選択したデザインで最も便利なアプローチは、動作規則を使用してリスト ボックスの選択を記録する方法です。動作規則を使用すると、既定の空白の選択項目など、記録したくない選択値をフィルタで除外できます。また、選択間の区切り文字を追加するかどうかを判断するために、すでに選択が行われているかどうかを調べることができます。
最初の選択用の動作規則を追加する
- リスト ボックスをダブルクリックします。
- [動作規則] をクリックし、[追加] をクリックし、動作規則に「Set Selection」という名前を付けます。
- [条件の設定] をクリックします。
- 最初の条件として、1 つ目のボックスの一覧の [Choice] をクリックし、2 つ目のボックスの一覧の [が空白でない] をクリックします。
- [AND/OR] をクリックし、そのボックスの一覧で、[OR] ではなく [AND] がクリックされていることを確認します。
- 2 つ目の条件として、1 つ目のボックスの一覧の [SelectionsViaRules] をクリックし、2 つ目のボックスの一覧の [が空白である] をクリックし (図 3 を参照)、[OK] をクリックします。

図 3 Set Selection 動作規則の条件
- [動作の追加] をクリックします。
- [動作] ボックスの一覧の [フィールドの値を設定する] をクリックします。
- [フィールド] テキスト ボックスの右にある [XPath の選択] ボタンをクリックし、[SelectionsViaRules] をクリックし、[OK] をクリックします。
- [値] テキスト ボックスの右にある [数式の挿入] ボタンをクリックし、ピリオドを入力し、[OK] を 2 回クリックします。
ピリオドは、self::node() の場所を示す XPath の省略構文です。このシナリオでは Choice ノードを示します。 - [この動作規則が完了したら規則の処理を停止する] チェック ボックスをオンにし、[OK] をクリックします。
追加の選択の動作規則を追加する
- [動作規則] をクリックし、[追加] をクリックし、動作規則に「Add Selection」という名前を付けます
- [条件の設定] をクリックします。
- 最初の条件として、1 つ目のボックスの一覧の [Choice] をクリックし、2 つ目のボックスの一覧の [が空白でない] をクリックし、[OK] をクリックします。
- [動作の追加] をクリックします。
- [動作] ボックスの一覧の [フィールドの値を設定] をクリックします。
- [Field] テキスト ボックスの右にある [XPath の選択] ボタンをクリックし、[SelectionsViaRules] をクリックし、[OK] をクリックします。
- [値] テキスト ボックスの右にある [数式の挿入] ボタンをクリックし、次の式を入力します (図 4 を参照)。
concat(../my:SelectionsViaRules, ", ", .) |

図 4 追加の選択をテキスト ボックスに追加するための式
- [OK] を 5 回クリックします。
この式は少しわかりにくいかもしれませんが、具体的には、[SelectionsViaRules] テキストボックスの既存の値にカンマおよび空白文字を付けて現在の [Choice] リスト ボックスの選択値と連結します。
アプローチ 2 – コードを使用して選択を記録する
動作規則を使用するのに適していないフォームデザインを選択している場合、またはより複雑な処理機能が必要な場合は、コードを使用してリスト ボックスの選択を記録します。このタスクは、前のアプローチの動作規則の動作をコードに複製するだけです。
選択変更時のコードを追加する
- リスト ボックスをダブルクリックします。
- [リスト ボックスのプロパティ] ダイアログ ボックスの [データ] タブの [データの入力規則] をクリックします。
- [データの入力規則] ダイアログ ボックスの [イベント] ボックスの一覧の [OnAfterChange] をクリックし、[編集] をクリックします。
- 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; |
- [ファイル] メニューの [保存] をクリックしてから 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.