Greg Collins
in

InfoPath Dev

This Blog

Syndication

Archives

Greg Collins

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

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

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

    カスケードのレベル数が増えると、それにかかわる処理と作業もより複雑になります。また、カスケード リストが繰り返しテーブルまたは繰り返しセクション内に表示される場合は、別の問題、「データのクロスオーバー」に対処する必要があります。

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

    階層的なセカンダリ データ ソース

    階層的なデータソースは、一般に 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. 「Vehicle」という名前のグループを追加します。
    3. [Vehicle] グループをクリックし、テキスト フィールドを 3 つ追加します。名前はそれぞれ「Year」、「Make」、および「Model」とします。

    ビューの設計

    1. ビューに 3 列のレイアウト用の表を追加します。
    2. 図 1 のように、左から右の順に、[Year]、[Make]、[Model] の各フィールドをドロップダウン リスト ボックスとしてレイアウト用の表のセルに挿入します。


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


    カスケード リスト

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

    [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 つ目のボックスの一覧の [Select A Field Or Group] をクリックします。
    6. [Select A Field Or Group] ダイアログ ボックスの [Data Source] ボックスの一覧の [Main] をクリックし、[myFields/Vehicle/Year] をクリックしてから、[OK] をクリックします (図 2 を参照)。


    図 2 カスケード リストの第 2 レベルのフィルタ

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

    ここまでで、レベルが 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 つ目のボックスの一覧の [Select A Field Or Group] をクリックします。
    6. [Select A Field Or Group] ダイアログ ボックスの [Data Source] ボックスの一覧の [Main] をクリックし、[myFields/Vehicle/Year] をクリックしてから、[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 つ目のボックスの一覧の [Select A Field Or Group] をクリックします。
    6. [Select A Field Or Group] ダイアログ ボックスの [Data Source] ボックスの一覧の [Main] をクリックし、[myFields/Vehicle/Make] をクリックしてから、[OK] をクリックします (図 3 を参照)。


    図 3 カスケード リストの第 3 レベルのフィルタ

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

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


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

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

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

    作成する動作規則には条件を指定しないので、選択値が変更されるたびに処理されます。フィールドの選択値をクリアするために、動作規則の [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/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/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 つ以上になると複雑さが増すことを示すためです。さらに、フラット データ ソースの性質を考えて、各リストをフィルタし、一意の値だけが表示されるようにします。最後に、カスケード内で先に選択されていた項目が変更されたときに選択済みのリストの値をクリアする方法で、選択項目の組み合わせが常に有効になるようにします。


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

    データベース、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. 「Vehicle」という名前のグループを追加します。
    3. [Vehicle] グループをクリックし、テキスト フィールドを 3 つ追加します。名前はそれぞれ「Year」、「Make」、および「Model」とします。

    ビューの設計

    1. ビューに 3 列のレイアウト用の表を追加します。
    2. 図 1 のように、左から右の順に、[Year]、[Make]、[Model] の各フィールドをドロップダウン リスト ボックスとしてレイアウト用の表のセルに挿入します。


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


    カスケード リスト

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

    [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 つ目のボックスの一覧の [Select A Field Or Group] をクリックします。
    6. [Select A Field Or Group] ダイアログ ボックスの [Data Source] ボックスの一覧の [Main] をクリックし、[myFields/Vehicle/Year] をクリックしてから、[OK] をクリックします (図 2 を参照)。


    図 2 カスケード リストの第 2 レベルのフィルタ

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

    ここまでで、レベルが 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 つ目のボックスの一覧の [Select A Field Or Group] をクリックします。
    6. [Select A Field Or Group] ダイアログ ボックスの [Data Source] ボックスの一覧の [Main] をクリックし、[myFields/Vehicle/Year] をクリックしてから、[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 つ目のボックスの一覧の [Select A Field Or Group] をクリックします。
    6. [Select A Field Or Group] ダイアログ ボックスの [Data Source] ボックスの一覧の [Main] をクリックし、[myFields/Vehicle/Make] をクリックしてから、[OK] をクリックします (図 3 を参照)。


    図 3 カスケード リストの第 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] をクリックし、次の式を入力します (図 4 を参照)。

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


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

    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:Vehicle/my:Year]/@make)

    [Year] ドロップダウン リストに配置した一意性フィルタと比較すると、Vehicle ノードに追加のサブフィルタが指定されています。サブフィルタ [@year = current()/my:Vehicle/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:Vehicle/my:Year and @make = current()/my:Vehicle/my:Make]/@model)

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

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

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

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

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

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

    作成する動作規則には条件を指定しないので、選択値が変更されるたびに処理されます。フィールドの選択値をクリアするために、動作規則の [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/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/Vehicle/Model] をクリックします。
    6. [OK] を 5 回クリックして、開いているダイアログ ボックスをすべて閉じます。

    確認

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

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

  • リッチ テキスト フィールドのインライン ピクチャを Web ページに表示する

    InfoPath フォームのデータを Web ページに表示するには、XSL を記述してフォームを HTML に変換できます。XSL について少し知識があれば、この作業は簡単です。リッチ テキスト フィールドの内容を表示するには、xsl:value-of の代わりに xsl:copy-of を使用する必要があります。

    しかし、リッチ テキスト フィールド内のピクチャだけは、この方法ではうまくいかないことがすぐにわかります。InfoPath は、ピクチャを base64 エンコーディングを使用して保存し、その結果の文字列を直接 XML コンテンツ (具体的には img  要素の xd:inline 属性) に埋め込みます。リッチ テキスト フィールド内のピクチャの XHTML は次のようになります。

    <img style='WIDTH: 100px; HEIGHT: 122px' tabIndex='-1' src='msoinline/a0d1eb893d744127' xmlns:xd='http://schemas.microsoft.com/office/infopath/2003' xd:inline='/9j/4AAQSkZJRgABAQEASABIAAD...'/>

    src 属性は、InfoPath に対して、エンコードされたピクチャが xd:inline 属性のインラインに保存されていることを通知します。しかし、Internet Explorer は src 属性のコンテンツを理解せず、xd:inline 属性を無視するので、ピクチャの表示に失敗します。xsl:copy-of は、ノードのコンテンツのコピー操作を 1 回実行するので、ピクチャを単独で処理する方法がありません。このため、独自の "copy-of" コードを記述する必要があります。Web ページにインライン ピクチャを表示するには追加の作業が必要ですが、その労力に値する成果が得られます。

    このタスクでは、インライン ピクチャを含むリッチ テキスト フィールドを持つシンプルな InfoPath フォームを作成し、デコードされたピクチャを Web ページに表示します。XML フォームから HTML への変換には XSL を使用し、base64 エンコードされたピクチャを Web ページで表示可能にするためには ASPX ページを使用します。あらかじめインターネット インフォメーション サービス (IIS) 6.0 以降をインストールして利用可能にしておく必要があります。また、それをローカルマシンにインストールしていることが前提です。まず、新しい空白のフォームを作成しておきます。この後、タスクに必要なサポートファイルを複数作成します。

    フォーム テンプレート

    テスト フォーム テンプレートの作成

    1. [Controls] 作業ウィンドウを開きます。
    2. ビューにリッチ テキスト ボックスを挿入します。
    3. リッチ テキスト フィールドをダブルクリックします。
    4. [Rich Text Box Properties] ダイアログ ボックスで、フィールド名を「RichTextField」に変更し、[OK] をクリックします。
    5. フォーム テンプレートを「InlinePictures2Html.xsn」という名前で保存し、InfoPath を終了します。


    MYFORM.XML ファイル

    テスト フォームの作成

    1. InlinePictures2Html.xsn フォームを開きます。
    2. リッチ テキスト フィールドに複数のピクチャを挿入します。
    3. フォームを「C:\Inetpub\wwwroot\form\myForm.xml」という名前で保存し、InfoPath を終了します。


    DEFAULT.ASPX ファイル

    default.aspx ファイルは Web ユーザに最初に表示されるページです。このページで、InfoPath フォームから HTML Web ページへの XSL 変換が開始されます。これは、リッチ テキスト フィールドのインライン ピクチャを Web ページに表示するために必要な 3 つの主要ファイルの 1 つ目です。次のコードをテキスト エディタにコピーし、「C:\Inetpub\wwwroot\form\default.aspx」という名前でファイルを保存します。これは、myForm.xml ファイルの保存先と同じフォルダです。

    <%@ Page Language="C#" %>
    <%@ Import Namespace="System.Xml" %>
    <%@ Import Namespace="System.Xml.Xsl" %>

    <!-- ソース コード作成 Greg Collins -->

    <script language="C#" runat="server">
    void Page_Load(Object sender, EventArgs e)
    {
        // 変換対象の XML ファイルに絶対 URL を提供するための XSL 引数を作成
        // この引数は URL という名前の xsl:param として利用可能
        XsltArgumentList oArgs = new XsltArgumentList();
        string sPath = Request.Path.ToString();
        sPath = sPath.Substring(0, sPath.LastIndexOf("/")+1) + "myForm.xml";
        oArgs.AddParam("URL", "", sPath);
        xmlFile.TransformArgumentList = oArgs;
    }
    </script>

    <asp:Xml id="xmlFile" runat="server" DocumentSource="myForm.xml" TransformSource="/transform.xsl" />

    default.aspx ファイルの実際の動作を調べてみましょう。リッチ テキスト フィールドのインラインピクチャをデコードしない場合は、スクリプト ブロック全体が不要になります。スクリプト ブロックの目的は、ルート フォルダから変換対象の XML ファイルまでのパスを取得し、それをパラメータとして XSL に渡すことです。このパスの識別にはコードを使用しますが、単にハードコードすることもできます。

    Request.Path は実際は default.aspx ファイルへのパスを返すので、パスのファイル名の部分を削除し、変換対象のXML ファイルの名前と置き換える必要があります。ここで Server.MapPath("myForm.xml") を使用することもできますが、この場合は物理ディレクトリ構造を明らかにすることになるのでセキュリティ上の問題が発生する可能性があります。そこで、代わりにそれを decodePicture.aspx ファイルとして保存します。修正したパスは、URL という名前のパラメータの値になります。これが渡されて transform.xsl ファイルで使用されます。

    asp:Xml 要素の 2 つの属性 (id 属性および DocumentSource 属性) の値は、スクリプトブロックで参照される必要があります。id 属性の値は、オブジェクトの名前であり、その TransformArgumentList プロパティがスクリプト ブロックの最後で設定されます。これらの 2 つが一致しない場合、エラーが発生します。DocumentSource 属性の値は、変換対象の XML ファイルの名前であり、この ASPX ファイルの名前を削除した後、パスの最後に追加されます。これらの 2 つが一致しない場合、Web ページで望ましくない結果になることがあります。
     
    TRANSFORM.XSL ファイル

    transform.xsl ファイルは、InfoPath フォームを、Web ページに表示される HTML に変換するファイルです。これは、Web ページにリッチ テキスト フィールドのインライン ピクチャを表示するために必要な 3 つの主要ファイルの 2 つ目です。このファイルは、カスタムの "copy-of" 機能を使用して、リッチ テキスト フィールド内の他の XHTML 要素とは別に img 要素を処理します。この分離は、ピクチャのソースが ASPX ページによって提供されることを指定するために重要です。

    フォームで使用される任意の名前空間が xsl:stylesheet 要素の名前空間宣言にも含まれていることを確認する必要があります。名前空間を含めていない場合、XSL は処理されません。

    次のコードをテキスト エディタにコピーし、「C:\Inetpub\wwwroot\transform.xsl」という名前でファイルを保存します。このファイルは、Web サイト内のどこからでも簡単にアクセスできるように、ルート フォルダに保存されます。

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:cs="C#" xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2004-11-03T18:01:22">
    <xsl:strip-space elements="*" />
    <xsl:output method="html" indent="no" />

    <!-- ソース コード作成 Greg Collins (InfoPathDev.com) -->>

    <!-- 変換対象の XML ファイルの絶対 URL を指定するパラメータ -->
    <xsl:param name="URL"/>

    <msxsl:script language="C#" implements-prefix="cs">
    <![CDATA[
    int nCount = 0;
    int getCount()
    {
        // XML 内のピクチャの順序番号を返す。
        // この番号はピクチャをデコードする .xml ファイルへのインデックスとして使用される。
        return nCount++;
    }
    ]]>
    </msxsl:script>

    <xsl:template match="/">
        <h1>Rich Text Pictures Displayed in a Web Page:</h1>
        <xsl:apply-templates />
    </xsl:template>

    <xsl:template match="my:RichTextField">
        <xsl:apply-templates />
    </xsl:template>

    <!-- ピクチャ以外の要素用のテンプレート -->
    <xsl:template match="my:RichTextField//*[name(.) != 'img']">
        <xsl:element name="{name(.)}">
            <xsl:for-each select="attribute::*">
                <xsl:attribute name="{name(.)}"><xsl:value-of select="."/></xsl:attribute>
            </xsl:for-each>
            <xsl:apply-templates />
        </xsl:element>
    </xsl:template>

    <!-- ピクチャ専用のテンプレート -->
    <xsl:template match="my:RichTextField//*[name(.) = 'img']">
        <xsl:element name="img">

            <!-- 'src' および 'xd:inline' 以外のすべての属性をコピー -->
            <xsl:for-each select="attribute::*[name(.) != 'src' and name(.) != 'xd:inline']">
                <xsl:attribute name="{name(.)}"><xsl:value-of select="."/></xsl:attribute>
            </xsl:for-each>

           <!-- 'src' 属性を生成して base64 ピクチャをデコード -->

            <xsl:attribute name="src">/decodePicture.aspx?u=<xsl:value-of select="$URL"/>&amp;n=<xsl:value-of select="count(preceding::*[name(.) = 'img'])"/></xsl:attribute>
            <xsl:apply-templates />
        </xsl:element>
    </xsl:template>

    </xsl:stylesheet>

    transform.xsl ファイルの実際の動作について調べてみましょう。xsl:param 要素は、その値を、変換を開始した default.aspx ページによって設定されたパラメータから受け取ります。この値は、ルート フォルダから変換対象の XML ファイルへのパスです。このパラメータを使用して、decodePicture.aspx 内のコードが、XML ファイルを読み込んで、その base64 エンコードされた各ピクチャをデコードできるようになるので、このパラメータは必須です。

    スクリプト ブロックは、インライン ピクチャのインデックスの作成に使用されます。各ピクチャには 0 から始まり増加する番号が割り当てられます。decodePicture.aspx 内のコードはこの番号を使用して、要求されているピクチャがどれかを判断します。

    作成したサンプル フォームは非常に単純なので、メイン テンプレートはページのヘッダーを配置するだけです。実際の処理は、リッチ テキストフィールドのテンプレートが処理されるときに行われます。ピクチャをインラインに保存していない場合は、ここで単純に xsl:copy-of 要素を使用すれば済みますが、このサンプルではインライン ピクチャを扱うので、カスタムの "copy-of" 機能を記述する必要があります。これには、img 要素用とそれ以外の要素用の 2 つのテンプレートが必要です。

    1 つ目のカスタム "copy-of" テンプレートは、XPath my:RichTextField//*[name(.) != 'img'] (リッチ テキスト フィールド内で img と指定されていないすべての要素) と一致する必要があります。このテンプレートでは、要素名を同じ名前でコピーし、その各属性をコピーし、テンプレートの適用を続けます。

    2 つ目のカスタム  "copy-of" テンプレートは、XPath my:RichTextField//*[name(.) = 'img'] (リッチ テキスト フィールド内の img という名前のすべての要素) と一致する必要があります。このテンプレートは、最初のテンプレートと非常によく似ており、同じ名前の要素を作成し、その属性をコピーします。しかし、今回は src および xd:inline の 2 つの属性はコピーしません。src 属性は後で構築されます。また、xd:inline 属性は、decodePicture.aspx ページで処理されるので残します。base64 でエンコードされたピクチャを実際に含むのはこの後者の属性です。

    カスタムの "copy-of" 機能を記述したのは、decodePicture.aspx ページを呼び出してデコード済みのピクチャを要求するように img 要素の src 属性を設定するためでした。このために、変換中の XML ファイルへの URL、および処理対象のピクチャへのインデックスを表す 2 つのパラメータを提供します。HTML Web ページ用に変換された img 要素は次のようになります。

    <img style='WIDTH: 100px; HEIGHT: 122px' tabIndex='-1' src='/decodePicture.aspx?u=/myForm.xml&amp;n=0'>

    この transform.xsl ファイルのコンテンツは、リッチ テキスト ピクチャを確実に表示するための最低要件です。これ以上の内容については、XSL を記述して、InfoPath フォームの残りの部分を Web ページ用の HTML に変換します。
     
    DECODEPICTURE.ASPX ファイル

    decodePicture.aspx ファイルは、base64 でエンコードされたインラインピクチャをデコードする場所です。これは、Web ページにリッチ テキスト フィールドのインライン ピクチャを表示するために必要な 3 つの主要ファイルの 3 つ目です。XSL 変換の一環として作成した img 要素の src 属性が Web ブラウザによって検出されたときに、ブラウザからこのファイルが呼び出されます。

    次のコードをテキスト エディタにコピーし、「C:\Inetpub\wwwroot\decodePicture.aspx」という名前でファイルを保存します。このファイルは、Web サイト内のどこからでも簡単にアクセスできるように、ルート フォルダに保存されます。

    <%@ Page Language="C#" Debug="true" %>
    <%@ Import Namespace="System.IO" %>
    <%@ Import Namespace="System.Xml" %>
    <%@ Import Namespace="System.Collections" %>

    <!-- ソース コード作成 Greg Collins (InfoPathDev.com) -->

    <script language="C#" runat="server">
    void Page_Load(Object sender, EventArgs e)   
    {
        try
        {
            // パラメータを取得する
            string sXmlFile = Request.QueryString["u"];
            int nPictureNumber = Convert.ToInt32(Request.QueryString["n"]) * 2;
            if(null == sXmlFile || 0 > nPictureNumber)
                return;
       
            // XML ファイルへのサーバー パスを取得する
            sXmlFile = Server.MapPath(sXmlFile);
       
            // デコードされたピクチャのキャッシュからの取得を試みる
            ArrayList arrPicture = (ArrayList)Cache[sXmlFile];
            System.Drawing.Image oPicture;
       
            // キャッシュ内にない場合はピクチャをデコードし、それをキャッシュに追加する
            if(null == arrPicture)
            {
                // 変換された XML ファイルを読み込む
                XmlDocument oXml = new XmlDocument();
                oXml.Load(sXmlFile);
           
                // セクションが機能するように適切な名前空間を追加する
                XmlNamespaceManager oNsm = new XmlNamespaceManager(oXml.NameTable);
                oNsm.AddNamespace("rt", "http://www.w3.org/1999/xhtml");
                oNsm.AddNamespace("xd", "http://schemas.microsoft.com/office/infopath/2003");
           
                // img 要素の xd:inline 属性全体のリストを取得する
                XmlNodeList oPictures = oXml.SelectNodes("//rt:img/@xd:inline", oNsm);
                arrPicture = new ArrayList();
                for(int i = 0; i < oPictures.Count; i++)
                {
                    // base64 でエンコードされた各文字列を実際のピクチャに変換する
                    string sBase64Picture = oPictures.Item(i).Value;
                    byte[] bPicture = Convert.FromBase64String(sBase64Picture);
                    MemoryStream oMemStr = new MemoryStream();
                    oMemStr.Write(bPicture, 0, bPicture.Length);
                    oPicture = System.Drawing.Image.FromStream(oMemStr);
                   
                    // デコードされた各ピクチャとその形式を配列に追加する
                    arrPicture.Add(oPicture);
                    arrPicture.Add(sBase64Picture.Substring(0,4));
                }
           
                // ピクチャ配列をアプリケーション キャッシュに格納する
                Cache.Insert(sXmlFile, arrPicture, new CacheDependency(sXmlFile));
            }
       
            // ピクチャ番号が配列内の番号より大きい場合は要求を無視する
            if(arrPicture.Count <= nPictureNumber)
                return;
       
            // 指定されたピクチャおよび形式を取得する
            oPicture = (System.Drawing.Image)arrPicture[nPictureNumber];
            string sPictureFormat = (string)arrPicture[nPictureNumber+1];
       
            // デコードされたピクチャを表示先の Web ページに戻す
            // R0lG = 大文字の R + 数字のゼロ + 小文字の L + 大文字の G
            if("R0lG" == sPictureFormat)
                oPicture.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif);
            else
                oPicture.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
        }
        catch(Exception ex)
        {
            // 問題が発生した場合はエラーを表示せず、ピクチャなしで戻る
            return;
        }
    }
    </script>

    decodePicture.aspx ファイルの実際の動作について調べてみましょう。2 つのクエリ文字列パラメータ (ルートフォルダからインライン ピクチャを含む XML ファイルへのパス、およびデコード対象のピクチャのインデックス) が、カスタムの XSL 変換によって作成された img 要素の src 属性から取得されます。ここで取得したインデックスを 2 倍にします。これは、デコード済みのピクチャを格納する配列には、ピクチャ形式を識別する兄弟情報も格納されているからです。いずれかのパラメータが存在しない場合は、そのまま戻って Web ページに壊れたピクチャのアイコンを表示します。

    sXmlFile 変数は、Server.MapPath(sXmlFile) を使用してすぐに絶対サーバー パスに変換されます。この変数は、XML ファイルの読み込みに使用されます。また、キャッシュに格納しているオブジェクトの名前としても使用されます。

    最初に行うことは、この特定の XML ファイルが既に解析されキャッシュに格納されているかどうかの検出です。格納されている場合は、キャッシュ内にあるバージョンを使用します。ピクチャをキャッシュすると、デコードされたピクチャが要求されるたびに XML ファイルを読み込む必要がなくなるので、パフォーマンスが大きく向上します。キャッシュ内にない場合は、ピクチャをデコードし、キャッシュに追加する必要があります。

    このためには、XML ファイルを読み込み、リッチ テキストフィールド内のピクチャに到達するために要求される名前空間を追加する必要があります。特に追加が必要なのは、リッチ テキストフィールド用と img 要素の xd:inline 属性用の 2 つの名前空間です。名前空間を追加した後、base64 でエンコードされたピクチャのリストを取得し、1 つずつデコードします。

    デコードされた各ピクチャは、base64 でエンコードされたピクチャの最初の 4 文字とともに配列に格納されます。これらの 4 文字は、ピクチャの形式が GIF か JPEG かを識別します。JPEG ピクチャは GIF 形式ではあまりきれいに表示されず、また GIF ピクチャの JPEG 形式での表示は動画では許可されないので、ピクチャ形式の識別が必要になります。GIF ピクチャを表す 4 文字は R0lG です。一方、JPEG ピクチャを表す 4 文字は /9j/ です。

    InfoPath では GIF と JPEG 以外のピクチャ形式もサポートされていますが、このタスクの目的で使用されるのはこの 2 つの形式だけです。他のすべてのピクチャ形式は、この 2 つの形式のいずれかで正しく表示されるからです。

    以上のファイルをすべて用意できたら、Web ページにリッチ テキスト フィールドのインライン ピクチャを正しく表示できます。テストのために、Web ブラウザを起動し、http://localhost/form/default.aspx に移動します。

    ここで 1 つ注意しておきたいことがあります。デコードされたインライン ピクチャの表示は、サーバーに保存されている実際のピクチャファイルから読み込まれる場合ほど高速ではありません。しかし、これはリッチ テキスト フィールドの完全なコンテンツをインライン ピクチャも含めて Web ページに表示できる便利さに比べれば些細な問題です。

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

  • 対話式ハイパーリンクを作成する

    InfoPath のデザインモードでは、ハイパーリンクの色の変更だけが許可されています。文字飾りの下線を削除したり、ハイパーリンク上にマウスポインタを移動したときやタブ移動したときに表示する個別の色を設定したりすることはできません。これらのデザイン モードの制限には、ビューの view .xsl ファイルを手動で変更することで対処できます。

    このタスクでは、カスタムの内部スタイルシートをビューの .xsl ファイルに追加する方法で、対話式ハイパーリンクを作成します。まず、新しい空白のフォームを作成しておきます。

    ビューにハイパーリンク コントロールを追加する

    1. [Controls] 作業ウィンドウを開きます。
    2. ビューにハイパーリンクを挿入します。
    3. [Insert Hyperlink] ダイアログ ボックスの [Link To Address] ボックスに、「http://jp.infopathdev.com」と入力し、[OK] をクリックします。

    確認

    1. フォームをプレビューします。
    2. ハイパーリンク上にマウス ポインタを移動したり、タブ移動したり、ハイパーリンクをクリックしたりして、リンクの変化を確認します。
    3. プレビューを閉じます。

    確認したように、InfoPath では、どのようなマウス操作およびキーボード操作に対してもハイパーリンクの表示に違いはありません。この動作を拡張します。

    ビューにカスタムの内部スタイルシートを手動で追加する

    1. [File] メニューの [Extract Form Files] をクリックします。
    2. 取り出したフォーム構成ファイルの保存先を選択し、[OK] をクリックします。
    3. InfoPath を終了して、フォーム構成ファイルに対するロックを解除します。
    4. テキスト エディタを使用して、ビューの .xsl ファイルを開きます。
    5. 最後の style 要素のすぐ下に次のコードを追加します。

    <style title="myCustomHyperlinks" type="text/css">
        A { COLOR: orange; TEXT-DECORATION: none }
        A:visited { COLOR: red; } <!-- This pseudo class has no effect in the editor -->
        A:active { COLOR: blue; TEXT-DECORATION: underline }
        A:hover { COLOR: green; TEXT-DECORATION: underline }
    </style>

    既にデザイン モードでハイパーリンクの色を変更している場合は、ハイパーリンク テキストのすぐ近くにあるフォント要素を手動で削除して、新しいスタイルを有効にする必要があります。

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

    確認

    1. manifest.xsf ファイルを右クリックし、[Design] をクリックして、フォーム テンプレートを再度開きます。
    2. フォームをプレビューします。
    3. ハイパーリンク上にマウス ポインタを移動したり、タブ移動したり、ハイパーリンクをクリックしたりして、変化を確認します。

    active 擬似クラスで指定されたスタイルは、ユーザーがハイパーリンクにタブ移動したときに表示されます。一方、hover 擬似クラスで指定されたスタイルは、ユーザーがマウスポインタをハイパーリンク上に移動したときに表示されます。擬似クラスの順序は重要です。リスト内で active を hover の後にすると、ユーザーがアクティブなハイパーリンク上にマウスを移動しても反応しません。ただし、このような動作を望んでいる場合は、順序を適切に変更します。

    visited 擬似クラスは、デザイン モード上では機能するように見えますが、InfoPath エディタでは訪問したリンクが記録されないので、このスタイルが適用された動作をユーザーが確認することはできません。

    カスタム スタイルシートの詳細については、「Add a Custom Style Sheet to a View.(カスタム スタイルシートをビューに追加する)」を参照してください。

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

  • 式ボックスにリッチ コンテンツを表示する

    式ボックスをリッチ テキスト フィールドにバインドしたときに、書式設定およびリッチ コンテンツがすべて失われ、1 行のプレーンテキスト文字列だけになって驚いたことがあるかもしれません。リッチ コンテンツは、ビューの .xsl ファイルを手動で少し変更するだけで表示できるようになります。

    このタスクでは、リッチ テキスト フィールドにバインドした式ボックスに、リッチ コンテンツを表示できるようにします。また、この変更の結果として発生する可能性がある問題とその対応についても説明します。まず、新しい空白のフォームを作成しておきます。

    リッチ テキスト ボックスを作成し、式ボックスをバインドする

    1. [Controls] 作業ウィンドウを開きます。
    2. ビューにリッチ テキスト ボックスを挿入します。
    3. [Data Source] 作業ウィンドウで、[field1] を右クリックし、[Expression Box] をクリックします。
    4. 式ボックスの幅を変更して、その上にあるリッチ テキスト ボックスと同じにします。

    確認

    1. フォームをプレビューします。
    2. リッチ テキスト フィールドに任意のリッチ コンテンツを追加し、フィールドの外をクリックして、コンテンツをバインドします。


    図 1 リッチ テキスト ボックスにバインドされた式ボックスにはリッチ コンテンツは表示されません。

    図 1 でわかるように、式ボックスにはリッチ コンテンツは表示されません。これは、InfoPath では、式ボックスの作成時に、バインドされるフィールドのデータ型が考慮されず、代わりに XSL で常に xsl:value-of 要素が使用されるからです。xsl:value-of 要素は、その選択結果を string() 関数を呼び出すことによって文字列に変換します。リッチ コンテンツの使用を可能にするには、xsl:copy-of 要素を使用するように変更する必要があります。

    式ボックスにリッチ コンテンツを表示するようにビューの .xsl ファイルを変更する

    1. [File] メニューの [Extract Form Files] をクリックします。
    2. 取り出したフォーム構成ファイルの保存先を選択し、[OK] をクリックします。
    3. InfoPath を終了して、フォーム構成ファイルに対するロックを解除します。
    4. テキスト エディタを使用して、ビューの .xsl ファイルを開きます。
    5. テキスト「ExpressionBox」を検索して、式ボックス コントロールを表す span 要素を探します。
    6. 次のような行があります (日本語環境では "my:field1" は "my:フィールド1" です)。

    <xsl:value-of select="my:field1"/>

    これを次のように変更します (日本語環境では "my:field1" は "my:フィールド1" です)。

    <xsl:copy-of select="my:field1/node()"/>

    1. ビューの .xsl ファイルを保存し、テキスト エディタを閉じます。
    2. manifest.xsf ファイルを右クリックし、[Design] をクリックして、フォーム テンプレートを再度開きます。

    確認

    1. フォームをプレビューします。
    2. リッチ テキスト フィールドに任意のリッチ コンテンツを追加し、フィールドの外をクリックして、コンテンツをバインドします。


    図 2 変更された XSL では式ボックスにリッチ コンテンツを表示できます。

    図 2 に示すように、XSL に対する変更により、式ボックスにリッチコンテンツを表示できるようになりました。お気づきかもしれませんが、式ボックスのコンテンツ上にマウスを移動すると、ボックスの周囲に青い罫線が表示されます。式ボックスには、このような特性はないので、これは通常は望ましくない効果です。

    InfoPath には問題があり、式ボックスとリッチ テキスト ボックスが同じビューの同じフィールドにバインドされている場合に、リッチコンテンツを表示するように変更された式ボックス上にマウスを移動すると、この青い罫線が表示されます。マウスを移動してもこの罫線が表示されないようにするには、式ボックスをリッチ テキスト ボックスと同じビューに表示しないようにします。2 つのコントロールが別々のビューにある場合、このホバー効果は発生しません。

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

  • ユーザーが操作しなくてもフィルタが自動的にフィルタを機能させる

    繰り返しテーブルなどのコントロールにフィルタを追加したときに、フィルタは (ユーザーが操作しなくても) 自動的に機能するはずです。機能しない場合は、次の手順を試してください。

    1. フォーム テンプレートのバックアップを作成します。
    2. フォーム構成ファイルをフォルダに取り出します。
    3. テキスト エディタで manifest.xsf ファイルを編集します。
    4. xsf:editWith 要素の useFilter="yes" 属性を検索してすべて削除します。削除するのは属性だけです。要素は削除しないでください。
    5. action="xCollection::refreshFilter" 属性を持つ xsf:button 要素を検索し、すべて削除します。
    6. manifest.xsf ファイルを保存し、テキスト エディタを閉じます。
    7. manifest.xsf ファイルを右クリックし、[Design] をクリックします。
    8. 変更による効果をテストします。
    ©2004 Greg Collins. All rights reserved. Licensed to Autonomy Systems, LLC for display on InfoPathDev.com.
  • コードを使用して動作規則の条件を指定する

    InfoPath SP1 の非常に強力な機能の 1 つに xdExtension があります。この機能を使用すると、フォーム内の条件付き書式などの領域からコードを呼び出すことができます。これによって、データの妥当性の検証条件を指定するときに、InfoPath UI だけで指定するよりもずっと柔軟な条件指定ができます。

    ただし、ここで問題にぶつかることがあります。xdExtension は条件付き書式の条件では機能しますが、動作規則の条件では機能しません。これが非常に残念なところです。問題の原因は、xdExtension の名前空間が manifest.xsf ファイルで定義されないことです。このため、動作規則は xdExtension を使用しようとすると失敗します。しかし、ありがたいことに、これは manifest.xsf ファイルを手動で更新するだけで簡単に修正できます。

    このタスクでは、動作規則の条件で xdExtension を使用する方法を説明します。

    manifest.xsf ファイルの修正

    1. デザイン モードで [File] メニューの [Extract Form Files] をクリックし、ファイルを一時フォルダに保存します。
    2. InfoPath を終了して、フォーム構成ファイルに対するロックを解除します。
    3. テキスト エディタを使用して、一時フォルダから manifest.xsf ファイルを開きます。
    4. xsf:xDocumentClass のルート要素の最後に、xdExtension で使用される次の名前空間を追加します。

    xmlns:xdExtension="http://schemas.microsoft.com/office/infopath/2003/xslt/extension"

    1. manifest.xsf ファイルを保存し、テキスト エディタを終了します。

    動作規則の条件の作成

    1. manifest.xsf ファイルを右クリックし、[Design] をクリックして、フォーム テンプレートを開きます。
    2. ボタンをビューに挿入します。
    3. ボタンをダブルクリックします。
    4. [Button Properties] ダイアログ ボックスでラベルを「Test xdExtension」に変更します。
    5. [Rules] をクリックし、[Add] をクリックします。
    6. 動作規則の名前を「Test xdExtension」とし、[Set Condition] をクリックします。
    7. [Condition] ダイアログ ボックスの 1 つ目のボックスの一覧の [The Expression] をクリックします。
    8. 式のボックスに「xdExtension:TestXdExtension()」と入力します。

      必要に応じてパラメータを受け付けるための関数を設定し、それを条件の式から渡すことができます。
    9. [Add Action] をクリックします。
    10. [Action] ボックスの一覧の [Show A Dialog Box Message] をクリックします。
    11. メッセージとして「Test Succeeded」と入力します。
    12. [OK] を 4 回クリックして、開かれているダイアログ ボックスをすべて閉じます。

    動作規則の条件を評価する関数の作成

    1. Alt + Shift + F11 キーを押して、Microsoft Script Editor を開きます。
    2. 次の関数をコードに追加します (JScript の場合)。

    function TestXdExtension()
    {
        return true; // Quick test to make sure xdExtension is working
    }

    1. Microsoft Script Editor を終了します。

    この関数は、ブール値を返します。true が返された場合、動作規則の動作が処理されます。

    確認

    1. フォームをプレビューします。
    2. ビューに挿入したボタンをクリックします。

    ここで、動作規則が TestXdExtension 関数を呼び出し、true が返されます。引き続き、テストの成功を通知するメッセージを含むダイアログ ボックスが表示されます。

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

  • "Same As" チェック ボックスの作成

    注文書を作成するときは、ユーザーの請求先および発送先の情報を収集する必要があります。ユーザーが請求先の住所に商品を発送するように希望する場合は、発送先と請求先の住所は同じになります。それ以外に、商品を別の住所に発送するように希望する場合もあります。他の人へのプレゼントを購入するときなどがこれにあたります。

    このタスクでは、注文書フォームの発送先/請求先セクションを作成し、ユーザーが請求先情報を発送先情報として使用するかどうかを確実に指定できるようにします。まず、新しい空白のフォームを作成しておきます。

    スキーマの作成

    1. [Data source] 作業ウィンドウを開きます。
    2. [MyFields] をダブルクリックし、名前を「Order」に変更します。
    3. 「Billing」という名前のグループを追加します。
    4. 「Shipping」という名前のグループを追加します。
    5. [Billing] グループをクリックし、テキスト フィールドを 8 つ追加します。名前はそれぞれ「Name」、「Street1」、「Street2」、「City」、「State」、「PostalCode」、「Phone」、「Email」とします。
    6. [Name] テキスト フィールドを右クリックし、[Reference] をクリックし、[Shipping] グループをクリックしてから、[OK] をクリックします。
    7. 同じ操作を、[Billing] グループの残りの 7 つのフィールドに対しても行います。このとき、フィールドの順序は変更しないでください。
    8. [Shipping] グループをクリックし、「sameAsBilling」という名前で、既定値が「False」 (いいえ) のはい/いいえ (boolean) 属性フィールドを追加します。

    これで、注文書の請求先および発送先の情報を収集できるスキーマを作成できました。図 1 は、作成済みのスキーマが表示された [Data Source] 作業ウィンドウです。発送先情報には、請求先情報と同じフィールドが含まれており、さらに商品を請求先住所とそれ以外の住所のどちらに発送するかをユーザーが指定できるようにするブール値が追加されています。次に、ビューの作成を行います。


    図 1 注文書のデータ ソース

    ビューのレイアウトのデザイン

    1. [Format] メニューの [Font] をクリックします。
    2. [Font] 作業ウィンドウで、[Heading 2] をクリックします。
    3. ビューの一番上に、「PURCHASE ORDER」と入力し、Enter キーを押します。
    4. レイアウト用の 2 列の表をビューに挿入します。
    5. レイアウトの左のセルに「Billing Information:」と入力し、Enter キーを押します。
    6. [Data Source] 作業ウィンドウの [Billing] グループを右クリックし、[Controls In Layout Table] をクリックします。挿入された請求先のレイアウト用の表の右端をドラッグして、外側のレイアウト用の表のセルの大きさに合わせます。
    7. レイアウトの右のセルに「Shipping Information ():」と入力し、Enter キーを押します。
    8. [Data Source] 作業ウィンドウの [Shipping] グループを右クリックし、[Controls In Layout Table] をクリックします。挿入された発送先のレイアウト用の表の右端をドラッグして、外側のレイアウト用の表のセルの大きさに合わせます。
    9. テキスト「Same As Billing」とそれに関連付けられているチェック ボックスを選択してドラッグし、その上の行のかっこの間にドロップします。次に、ドロップ時に挿入された余計な改行を削除します。
    10. テキストおよびチェック ボックスを移動した後に残った 2 つの空のセルを選択し、Del キーを押します。
    これでビューのレイアウトができました。これを 図 2 に示します。この時点では、ユーザーは請求先および発送先の情報を入力することはできますが、[Same As Billing] チェック ボックスは機能しません。そこで、チェック ボックスがオンのときに請求先のフィールドが発送先のフィールドにコピーされ、オフのときに発送先のフィールドがクリアされるという 2 つの動作規則を追加します。


    図 2 完成した注文書のレイアウト

    請求先のフィールドをコピーするための動作規則をチェック ボックスに追加する

    1. [Same As Billing] チェック ボックスをダブルクリックします。
    2. [Check Box Properties] ダイアログ ボックスの [Rules] をクリックし、[Add] をクリックします。
    3. 動作規則の名前を「Copy Billing Fields」とし、[Set Condition] をクリックします。
    4. 図 3 のように [Condition] ダイアログ ボックスの 3 つ目のボックスの一覧の [True] をクリックし、[OK] をクリックします。
    5. [Add Action] をクリックします。
    6. [Action] ダイアログ ボックスの [Action] ボックスの一覧の [Set A Field's Value] をクリックします。
    7. [Field] ボックスの右にある [Select XPath] ボタンをクリックし、[Shipping/Name] をクリックし、[OK] をクリックします。
    8. [Value] ボックスの右にある [Insert Formula] ボタンをクリックし、[Insert Field Or Group] をクリックし、[Billing/Name] をクリックします。次に、[OK] を 3 回クリックします。
    9. この動作規則に、さらに 7 つの動作を追加して、Billing グループの残りのフィールドを Shipping グループにコピーします。
    10. [OK] をクリックして、この動作規則の作成を終了します。 .


    図 3 動作規則の条件の設定

    発送先のフィールドをクリアするための動作規則をチェック ボックスに追加する

    1. [Rules] ダイアログ ボックスの [Add] をクリックします。
    2. 動作規則の名前を「Clear Shipping Fields」とし、[Set Condition] をクリックします。
    3. [Condition] ダイアログ ボックスの 3 つ目のボックスの一覧の [False] をクリックし、[OK] をクリックします。
    4. [Add Action] をクリックします。
    5. [Action] ダイアログ ボックスの [Action] のボックスの一覧の [Set A Field's Value] をクリックします。
    6. [Field] ボックスの右にある [Select XPath] ボタンをクリックし、[Shipping/Name] をクリックし、[OK] を 2 回クリックします。[Value] ボックスは空のままです。
    7. Shipping グループ内の残りのフィールドをクリアするために、この動作規則にさらに 7 つの動作を追加します。
    8. [OK] を 3 回クリックして、開いているダイアログ ボックスをすべて閉じます。

     

    この時点でフォームをプレビューし、[Same As Billing] チェック ボックスをオンにすると、請求先のフィールドに入力されている値がすべて発送先のフィールドにコピーされます。また、チェック ボックスをオフにすると、発送先のフィールドがすべてクリアされます。しかし、解決が必要な問題が 2 つあります。

    1 つ目は、[Same As Billing] チェックボックスをオンにした状態でも発送先のフィールドを変更できるので、実質的にチェック ボックスが正しくなくなる問題です。2 つ目は、チェックボックスをオンにした状態で請求先のフィールドを変更しても、発送先のフィールドに反映されない問題です。これを解決するためには、次の変更が必要です。

    ユーザーが発送先のフィールドを変更できないようにする

    1. 発送先カラムの [Name] フィールドをダブルクリックします。
    2. [Text Box Properties] ダイアログ ボックスの [Display] タブで、[Conditional Formatting] をクリックし、 [Add] をクリックします。
    3. 1 つ目のボックスの一覧の [sameAsBilling] をクリックし、3 つ目のボックスの一覧の [True] をクリックします。
    4. [Read-Only formatting] チェック ボックスをオンにし、[OK] を 3 回クリックして開いているダイアログ ボックスをすべて閉じます。
    5. これと同じ条件付き書式を、ビュー内の発送先の残りの 7 つのフィールドに追加します。

    請求先フィールドの変更を発送先フィールドに反映する

    1. 請求先カラムの [Name] フィールドをダブルクリックします。
    2. [Text Box Properties] ダイアログ ボックスの [Data] タブで、[Rules] をクリックし、 [Add] をクリックします。
    3. 動作規則の名前を「Copy Changes to Shipping Name」とし、[Set Condition] をクリックします。
    4. 1 つ目の条件ボックスの一覧の [Select A Field Or Group] をクリックします。
    5. [Select A Field Or Group] ダイアログ ボックスの [Shipping/sameAsBilling] フィールドをクリックし、[OK] をクリックします。
    6. 3 つ目の条件ボックスの一覧の [True] をクリックし、[OK] をクリックします。
    7. [Add Action] をクリックします。
    8. [Action] ダイアログ ボックスの [Action] ボックスの一覧の [Set A Field's Value] をクリックします。
    9. [Field] ボックスの右にある [Select XPath] ボタンをクリックし、[Shipping/Name] をクリックし、[OK] をクリックします。
    10. [Value] ボックスの右にある [Insert Formula] ボタンをクリックし、[Insert Field Or Group] をクリックし、[Billing/Name] フィールドをクリックします。[OK] を 6 回クリックして開いているダイアログ ボックスをすべて閉じます。
    11. ビュー内の請求先の残りの 7 つのフィールドに、同様の規則を適切な名前を付けて追加します。

    この最後の 2 つの変更により、請求先/発送先セクションが完成します。ユーザーは、請求先および発送先情報を個別に入力するか、[Same As Billing] チェックボックスをオンにして発送先情報を請求先情報と同じにすることを選択できます。ユーザーが後者のオプションを選択した場合、発送先データは、請求先情報が変更された場合でも常に最新の請求先情報を正確に反映します。

    確認

    フォームをプレビューし、新しい請求先/発送先セクションを [Same As Billing] チェック ボックスをオンまたはオフにしてテストします。完成したフォームを図 4 に示します。


    図 4 完成した注文書の請求先/発送先セクション

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

  • チェック ボックスがオンおよびオフのときの値を変更する

    メイン データ ソースのフィールドにバインドされているチェック ボックスのオンおよびオフのときの値は、[Check Box Properties] ダイアログ ボックスの [Data] タブにある組み込みの UI を使用して簡単に変更できます。しかし、セカンダリ データ ソースのフィールドにバインドされているチェック ボックスのオンおよびオフのときの値を変更するには、ビューの .xsl ファイルを手動で変更する必要があります。
     
    .xml ファイルにデータ接続を追加する場合、InfoPath では、各フィールドおよび属性のデータ型の検出は行われず、すべてに対して単純にテキスト (string) データ型が割り当てられます。これは場合によっては不便ですが、修正できます。
     
    テキスト (string) データ型のフィールドのチェック ボックスをビューに挿入する場合、それがメイン データ ソースとセカンダリ データ ソースのどちらにバインドされているかに関係なく、InfoPath では、常にオンのときの値が yes (オン)、オフのときの値が no (オフ) になります (図 1 を参照)。


    図 1 テキスト (string) データ型フィールドの場合、オンのときの値に yes (オン)、オフのときの値に no (オフ) が使用されます。

    ブール値データ型のフィールドのチェック ボックスをビューに挿入する場合、それがメイン データ ソースかセカンダリ データ ソースかに関係なく、InfoPath では、常にオンのときの値が true (はい)、オフのときの値が false (いいえ) になります (図 2 を参照)。


    図 2 ブール値データ型フィールドの場合、オンのときの値に true (はい)、オフのときの値に false (いいえ) が使用されます。

    図 1 および 2 では、セカンダリ データ ソースにあるフィールドにバインドされているチェック ボックスのオプションが淡色表示になっており、オンおよびオフのときの値を変更する機能がないことを示しています。フォームでこれらの値を yes/no (オン/オフ) または true/false (はい/いいえ) 以外の値にする場合は、ビューの .xsl ファイルを編集してこれらの値を変更する必要があります。

    このタスクでは、ブール値を保持する 2 つのフィールドを持ち、セカンダリ データ ソースを含むフォームを作成します。これに対して、InfoPath では、テキスト データ型を使用するスキーマが作成されます。そこで、ビューの .xsl ファイルを編集して、1 つ目のチェック ボックスのオンおよびオフのときの値としてそれぞれ 1 および 0 を使用し、2 つ目のチェック ボックスのオンおよびオフのときの値としてそれぞれ Present および Absent を使用するように変更します。まず、セカンダリ データ ソースの作成から始めます。

    セカンダリ データ ソースの作成

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

    <?xml version="1.0" encoding="UTF-8"?>
    <Booleans>
        <ItemAvailable/>
        <StudentAttendance/>
    </Booleans>

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

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

    ビューに 2 つのチェック ボックスを追加する

    1. [Data Source] 作業ウィンドウを開きます。
    2. [Booleans] セカンダリ データ ソースをクリックします。
    3. [ItemsAvailable] を右クリックし、[Check Box] をクリックし、Enter キーを押します。
    4. [StudentAttendance] を右クリックし、[Check Box] をクリックします。

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

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

     1 つ目のチェック ボックスのオンおよびオフのときの値を変更する

    1. テキスト「xd:offValue="no"」を検索し、1 つ目のチェック ボックス コントロールを表す input 要素を探します (日本語環境では「xd:offValue="オフ"」で検索してください)。
    2. 1 つ目の input 要素は次のようになっています (日本語環境では "no" および "yes" は "オフ" および "オン" になります)。

    xd:offValue="no" xd:onValue="yes"

    これを次のように変更します。

    xd:offValue="0" xd:onValue="1"

    1. テキスト「&quot;yes」を検索して、次の行を探します (日本語環境では "yes" は "オン" になります)。

     

    ItemAvailable=&quot;yes&quot;

    これを次のように変更します。

    ItemAvailable=&quot;1&quot;

    2 つ目のチェック ボックスのオンおよびオフのときの値を変更する

    1. テキスト「xd:offValue="no"」を検索し、2 つ目のチェック ボックス コントロールを表す input 要素を探します (日本語環境では「xd:offValue="オフ"」で検索してください)。
    2. 2 つ目の input 要素は次のようになっています (日本語環境では "no" および "yes" は "オフ" および "オン" になります)。

    xd:offValue="no" xd:onValue="yes"

    これを次のように変更します

    xd:offValue="Absent" xd:onValue="Present"

    1. テキスト「&quot;yes」を検索して、次の行を探します (日本語環境では "yes" は "オン" になります)

     

    StudentAttendance=&quot;yes&quot;

    これを次のように変更します。

    StudentAttendance=&quot;Present&quot;

    変更のレビュー

    1. ビューの .xsl ファイルを保存し、テキスト エディタを閉じます。
    2. manifest.xsf ファイルを右クリックし、[Design] をクリックして、フォーム テンプレートを再度開きます。 

    2 つのチェック ボックスの [Check Box Properties] ダイアログ ボックスを表示すると、図 3 のように、オンおよびオフのときの値に対する変更が反映されているはずです。更されたチェック ボックスを削除しないで新しいチェック ボックスを挿入すると、再バインドした場合でも更新された値が維持されます。


    図 3. オンおよびオフのときの値が手動で変更されています。

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

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

    フォーム テンプレートは、初めて開かれたときに、InfoPath によってフォーム テンプレート キャッシュに配置されます。それ以降、そのテンプレートが開かれるたびに、InfoPath は、まずそのテンプレートがキャッシュに既に存在するかどうかをチェックします。これは、オンライン上に公開されたフォームの場合に非常に便利です。オンライン フォームで作業している場合に、オフラインになっても、キャッシュされたフォーム テンプレートを引き続き利用できるからです。

    フォーム テンプレートの設計中に、行った作業についてテストすることがあります。デザイン モードからフォーム テンプレートをプレビューすると、最新の変更がすべて反映されます。しかし、プレビューがいつもフォームのテストに適した方法とは限りません。フォーム テンプレートを保存し、それを別の方法で開いたときに、そのフォーム テンプレートが既にキャッシュ内にある場合、最新の変更が反映されない可能性があります。これを解決するには、キャッシュからフォーム テンプレートを削除する必要があります。

    フォーム テンプレートをキャッシュから削除する方法は、それが .msi ファイルからインストールされたかどうかによって異なります。インストールされたフォーム テンプレートは、通常のフォーム テンプレートと同じ方法では削除できません。この場合はテンプレートをアンインストールする必要があります。

    このタスクでは、通常のフォーム テンプレートおよびインストールされているフォーム テンプレートを InfoPath キャッシュから削除します。この結果、フォーム テンプレートは、次に開かれるときに強制的にソースから再読み込されるので、最新の変更がすべて反映されます。

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

    1. 削除するフォーム テンプレートのインスタンスを開いている場合はすべて閉じます。
    2. InfoPath を起動します。InfoPath を既に開いている場合は、[File] メニューの [Fill Out A Form] をクリックします。
    3. [Fill Out A Form] ダイアログ ボックスで、キャッシュから削除するフォームを選択します。
      一覧でフォームが見つからない場合は、[All Forms] カテゴリを選択して、再度探します。
    4.  [Form Tasks] の [Remove This Form] をクリックします。

    インストールされているフォーム テンプレートを InfoPath キャッシュから削除する

    1. InfoPath を終了します。
    2. Windows のコントロール パネルを開きます。
    3. [プログラムの追加と削除] をクリックします。
    4. インストールされているフォーム テンプレートを探して選択し、[削除] をクリックします。
    5. コンピュータからフォーム テンプレートを削除するかどうかの確認を求められた場合は、[はい] をクリックします。

    これで、フォームがキャッシュから削除されました。通常のフォーム テンプレートの場合は、再度開くと最新の更新とともにキャッシュに追加されます。インストールされていたフォーム テンプレートの場合は、更新された .msi ファイルから再インストールする必要があります。

  • 必須フィールドの入力が済むまでボタンを無効にする

    フォーム上に配置したボタンを、すべての必須のフォーム フィールドの入力が済むまでクリックできないようにすることができます。このためには、条件付き書式を使用します。条件付き書式の複雑さはフォームによって異なります。

    このタスクでは、送信ボタンがあるシンプルなフォームを作成します。次に条件付き書式を追加して、すべての必須フォーム フィールドの入力が済むまでボタンを無効にします。まず、新しい空白のフォームを作成しておきます。

    スキーマの作成:

     [Data Source] 作業ウィンドウを開きます。

      1. <!--[if !supportLists]-->「Name」という名前のテキスト フィールドを追加します。このフィールドは必須です。
      2. <!--[if !supportLists]--><!--[endif]-->「Address」および「Phone」という名前の 2 つのテキスト フィールドを追加します。
      3. <!--[if !supportLists]-->「Email」という名前のテキスト フィールドを追加します。このフィールドは必須です。
      4. 「Comments」という名前のリッチテキストフィールドを追加します

         リッチ テキスト フィールドが必須であることを要求するカスタムのデータ検証を追加する

        リッチ テキスト フィールドが必須であることをデータ ソースで指定することはできないので、カスタムのデータ検証によって手動で指定する必要があります。リッチ テキスト フィールドは、通常のテキスト フィールドとは動作が異なり、空白かどうかを単純にチェックすることはできません。これは、“is blank” (が空白である) の結果が常に正確であるとは限らないからです。

        1. <!--[if !supportLists]--> <!--[endif]-->[Data Source] 作業ウィンドウの [Comments] をダブルクリックします。
        2. <!--[if !supportLists]--> <!--[endif]-->[Field Or Group Properties] ダイアログ ボックスの [Validation And Event Handlers] タブで [Add] をクリックします。
        3. <!--[if !supportLists]--> <!--[endif]-->1 つ目のボックスの一覧の [Expression] をクリックし、次の式を入力します。

        not(.//node())

        1. [ScreenTip] ボックスに「Cannot be blank 」と入力し (図 1 を参照)、[OK] を 2 回クリックします。


        図 1 リッチ テキスト フィールドが必須であることを要求するカスタム検証

        ビューの設計

        1. <!--[if !supportLists]--> <!--[endif]-->[myFields] を右クリックし、[Controls In Layout Table] をクリックします。
        2. <!--[if !supportLists]--> <!--[endif]-->[Controls] 作業ウィンドウから、ボタンをビューに挿入します。
        3. <!--[if !supportLists]--><!--[endif]-->ボタンをダブルクリックします。
        4. <!--[if !supportLists]--> <!--[endif]-->[Button Properties] ダイアログ ボックスの [General] タブで、ラベルを「Submit」に変更し、ID を「btnSubmit」に変更します。
        5. <!--[if !supportLists]--> <!--[endif]-->[Rules] をクリックし、[Add] をクリックします。
        6. <!--[if !supportLists]--> <!--[endif]-->動作規則に「Submit」という名前を付け、[Add Action] をクリックします。
        7. <!--[if !supportLists]--> <!--[endif]-->[Action] ボックスの一覧の [Show A Dialog Box Message] をクリックします。 
        8. <!--[if !supportLists]--> <!--[endif]-->メッセージとして「Form Submitted」と入力し、[OK] を 3 回クリックします。

        ボタンを無効にするための条件付き書式を追加する

        1. <!--[endif]-->[Button Properties] ダイアログ ボックスの [Display] タブで、[Conditional Formatting] をクリックし、[Add] をクリックします。
        2. <!--[if !supportLists]--> <!--[endif]-->1 つ目のボックスの一覧の [Name] をクリックし、2 つ目のボックスの一覧の [Is Blank] をクリックします。次に、[And] をクリックし、[And] の代わりに [Or] をクリックします。
        3. <!--[if !supportLists]-->3.     <!--[endif]-->1 つ目のボックスの一覧の [Email] をクリックし、2 つ目のボックスの一覧の [Is Blank] をクリックします。次に、[And] をクリックし、[And] の代わりに [Or] をクリックします。
        4. <!--[if !supportLists]--> <!--[endif]-->1 つ目のボックスの一覧の [The Expression] をクリックし、次の式を入力します。

        not(my:Comments//node())

        1. [Disable This Control] チェック ボックスをオンにし (図 2 を参照)、[OK] を 3 回クリックします。


        図 2 ボタンを無効にするために必要な条件

        確認

        フォームを初めてプレビューすると、[Name]、[Email]、[Comments] の各フィールドは、必須フィールドであることを示す赤いアスタリスク付きで表示されます。また、[Submit] ボタンが無効になっています。必須フィールドに入力すると、[Submit] ボタンが有効になるので、その後フォームを送信できます。図 3 は、必須フィールドに入力する前と入力した後のフォームを示しています。


        図 3 すべての必須フィールドの入力が済むまで送信ボタンは無効です

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

      1. 中央に矢印が表示された小型ナビゲーション ボタンを作成する

        設計の都合で、既定のサイズよりも小さいナビゲーション ボタンが必要になった場合、デザイン モードでボタンとフォントのサイズを変更しようとしても、イライラするだけでうまくいかないことがあります。また、矢印を正確に中央に配置するなどとても無理だと思えるかもしれません。InfoPath では、小型ナビゲーション ボタンを作成することはできますが、さらにビューの .xsl ファイルにボタンのインライン スタイルを手動で簡単に追加する必要があります。

        このタスクでは、矢印 (9、3、4、および :) が表示された小型ナビゲーション ボタンのセットを作成します。ボタンはそれぞれ先頭、前、次、最後に移動するボタンです。まず、新しい空白のフォームを作成しておきます。

         

        4 つの小型ナビゲーション ボタンを作成する

          1. [Controls] 作業ウィンドウを開きます。
          2. ビューにボタンを挿入します。
          3. ボタンを選択し、そのフォント サイズおよびフォントをそれぞれ「8pt」および「Webdings」に設定します。
          4. ボタンをダブルクリックします。
          5. [Button Properties] ダイアログ ボックスの [General] タブをクリックし、図 1 のように、ラベルとして「9」、ID として「btnFirst」を入力します。

            図 1 ナビゲーション ボタンのプロパティの設定

            Webdings フォントでは、テキストの '9' は 9、'3' は 3、'4' は4、および ':' は : の矢印になります。

            1. [Size] タブで、高さと幅の両方の値を「16px」に設定し、[OK] をクリックします。
            2. ボタンのコピーを 3 つ作成して、ビューのボタンを全部で 4 つにします。
            3. 新しい 3 つのボタンのラベルと ID をそれぞれ「3」と「btnPrevious」、「4」と「btnNext」、「:」と「btnLast」に変更します。

             

            この時点で 4 種類のナビゲーションの矢印がビューに表示されています。しかし、図 2 に示すように、16x16 のボタン内で矢印の表示が切れています。これを、XSL を手動で編集して修正します。

            図 2 小型ナビゲーション ボタン内で矢印の表示が切れています。

            個々の小型ナビゲーション ボタンのインライン スタイルを変更する

            1. [File] メニューの [Extract Form Files] をクリックします。
            2. 取り出したフォーム構成ファイルの保存先を選択し、[OK] をクリックします。
            3. InfoPath を終了して、フォーム構成ファイルに対するロックを解除します。
            4. テキスト エディタを使用して、ビューの .xsl ファイルを開きます。
            5. テキスト「btnFirst」を検索し、同じ input 要素の style 属性を探します。
            6. インライン スタイルの最後に、次のプロパティおよび値を追加します。

            ; LINE-HEIGHT: 5px.

            1. 同じプロパティおよび値を他の 3 つの小型ナビゲーション ボタンのインライン スタイルの最後にも追加します。それぞれの要素は、テキスト「btnPrevious」、「btnNext」、および「btnLast」で検索できます。
            2. ビューの .xsl ファイルを保存し、テキスト エディタを閉じます。
            3. manifest.xsf ファイルを右クリックし、[Design] をクリックして、フォーム テンプレートを再度開きます。

             

            それぞれの小型ナビゲーション ボタンのインライン スタイルに line-height プロパティを追加したことによって、図 3 のように、矢印が切れずにボタンの中央に適切に配置されるようになりました。

             

             

            図 3 修正した小型ナビゲーション ボタン内の矢印は切れていません。

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

          1. ピクチャ ボタンの作成

            ピクチャを表示したボタンは、テキスト ラベルがあるものもないものも、Web ページでよく使用され、特定のシナリオではたいへん便利です。一般に、ピクチャ ボタンは、テキスト ボタンよりも小さいスペースで多くの情報をユーザーに伝えることができます。しかし、InfoPath にはこのタイプのボタンを作成する機能がありません。実は本当の意味でのピクチャ ボタンでは、button 要素の使用が求められますが、この要素は InfoPath ではサポートされていません。このため、ビューに表示されても機能しません。InfoPath では、ボタンの作成に type="button" 属性を指定した input 要素が使用されます。このタイプのボタンは、テキスト ラベルだけをサポートします。

            とはいえ、InfoPath でも、背景ピクチャを使用してピクチャ ボタンを作成することはできます。ただし、ボタンをクリックしても、罫線およびテキスト ラベルと一緒にピクチャが押されたような表示になることはありません。このため、ボタンの罫線を削除し、テキスト ラベルも設定していない場合は、ユーザーが実際にピクチャ ボタンをクリックしても視覚的なフィードバックが得られないので、特にもどかしいかもしれません。

            このタスクでは、2 つのピクチャ ボタンを作成します。1 つはピクチャだけのボタン、もう 1 つはピクチャとテキスト ラベルが表示されるボタンです。手順としては、ピクチャをリソース ファイルとして追加し、そのビューの .xsl ファイルを手動で変更して、ボタンにピクチャを表示させます。まず、新しい空白のフォームを作成しておきます。


            ボタンのピクチャをリソース ファイルとして追加する

            1. [Tools] メニューの [Resource Files] をクリックし、[Add] をクリックします。
            2. 1 つ目のピクチャを検索して選択し、[OK] をクリックします。
            3. 2 つ目のピクチャを検索して選択し、[OK] を 2 回クリックして、[Resource Files] ダイアログ ボックスを閉じます。

            1 つ目のボタンを挿入して設定する

            1.  [Controls] 作業ウィンドウを開きます。
            2. ビューにボタンを挿入します。
            3. ボタンをダブルクリックします。
            4. [Button Properties] ダイアログ ボックスの [General] タブの [Label] ボックスで、Space キーを押して、表示されている内容をクリアします。
              InfoPath ではボタンにラベルを付けることが要求されるので、ラベルを実質的に削除するためにテキストとして空白文字を使用します。単にラベルを削除しようとすると、警告ダイアログ ボックスが表示されます。
            5. [Size] タブにピクチャの高さと幅 (この場合はそれぞれ「126px」および「101px」) を入力し、[OK] をクリックします。
            6. ボタンを右クリックし、[Borders And Shading] をクリックします。
            7. [Borders And Shading] ダイアログ ボックスの [Borders] タブで、[None] をクリックして既存の罫線を削除し、[OK] をクリックします。


            InfoPath で Windows XP スタイルのボタンにピクチャを表示するには、罫線か背景色、またはその両方を削除する必要があります。

            2 つ目のボタンを挿入して設定する

            1. [Controls] 作業ウィンドウから 2 つ目のボタンをビューに挿入します。
            2. ボタンをダブルクリックします。
            3. [Button Properties] ダイアログ ボックスの [General] タブにある [Label] ボックスに「Publish」と入力し、[OK] をクリックします。
              InfoPath では、ボタンのテキスト ラベルは既定で中央に配置されますが、それを変更する方法は用意されていないので、ビューの .xsl ファイルを編集するときにテキスト ラベルを左寄せします。
            4. ボタンを右クリックし、[Borders And Shading] をクリックします。
            5. [Borders And Shading] ダイアログ ボックスの [Shading] タブをクリックし、[No Color] をクリックして、[OK] をクリックします。

            ビューの .xsl ファイルを変更してボタンのピクチャを表示す

            1. [File] メニューの [Extract Form Files] をクリックします。
            2. 取り出したフォーム構成ファイルの保存先を選択し、[OK] をクリックします。
            3. InfoPath を終了して、フォーム構成ファイルに対するロックを解除します。
            4. テキスト エディタを使用して、ビューの .xsl ファイルを開きます。
            5. 1 つ目の input 要素を探し、インライン スタイルの最後に、次のプロパティおよび値を追加します。ピクチャ名は適宜置き換えてください。

            ; BACKGROUND-IMAGE: url(Calculator.jpg); BACKGROUND-REPEAT: no-repeat

             

            1. 2 つ目の input 要素を探し、インライン スタイルの最後に、次のプロパティおよび値を追加します。ピクチャ名は適宜置き換えてください。

             

            BACKGROUND-IMAGE: url(Publish.gif); BACKGROUND-REPEAT: no-repeat; TEXT-ALIGN: left; PADDING-LEFT: 20px

            1. ビューの .xsl ファイルを保存し、テキスト エディタを閉じます。
            2. manifest.xsf ファイルを右クリックし、[Design] をクリックして、フォーム テンプレートを再度開きます。
             

             

            図 1 背景ピクチャを表示するように変更されたボタン

            確認

            ボタンには、図 1 のようにピクチャが表示されているはずです。フォームをプレビューして、両方のボタンの反応をテストします。このように背景ピクチャを使用することによって、InfoPath でピクチャ ボタンを作成するタスクを実行できます。制限により使用できない場合もありますが、シナリオによってはこのボタンが非常に役立ちます。
          More Posts « Previous page
          Copyright © 2003-2019 Qdabra Software. All rights reserved.
          View our Terms of Use.