スマートデバイス向けの開発を行う場合、フォーム上の SDT のように、構造化データタイプにロードした情報をレイアウトに表示できます。これは、多くの場合に必要になります。
グリッドに表示したいデータまたはフィールドがすべて関連テーブルにあるわけではなく、それらを結合して表示する方法がないことがあります。外部サービスからデータを収集しなければならないこともあれば、希望するとおりにデータを収集するためにより複雑なナビゲーションが必要になることもあります。つまり、ある順序とフィルタでフィールドをリストするように簡単にはいきません。
このような場合に、グリッドにデータを読み取り専用で表示するために知っておく必要があるのは、コレクション (構造化データタイプ) に基づいたグリッドにして、何らかのソース (Data Provider オブジェクト、Procedure オブジェクト、または Web サービス) からロードするということだけです。
これは、どのように (どの制御情報を使用して) グリッドが表示されるかとは無関係であるため、メカニズムはリスト、マップ、グラフ、その他を表示するのと同じです。これは読み取り専用のシナリオでのみ有効です (グリッドで編集はできません)。
グリッドにカラム BasicA および BasicB を表示する場合に、A と B がデータベースにないか、または関係性を持たないものとします。
1) 次のように、BasicA と BasicB のコレクション BasicListSDT を定義します:

2) グリッドを配置する [ リスト ] または [ 詳細 ] セクションで、BasicSDT データタイプに基づく変数 &BasicListSDT を定義します。
3) ツールボックスからレイアウトに変数をドラッグ アンド ドロップします。GeneXus では、この際グリッドに表示したいコレクションのフィールドを選択でき、その後選択したフィールドでレイアウトにグリッドを作成できます。
4) Refresh イベントでロードします。
Event Refresh
&BasicListSDT = BasicListDP()
EndEvent
BasicListDP は、BasicListSDT に基づいて変数を返す Data Provider オブジェクトです。また、Procedure オブジェクト、外部 Web サービスなども可能です。
行が選択されたときにアクションを実行する必要がある場合、パラメーターとして "現在" の値を使用してそのイベントを定義するだけです: &BasicListDP.CurrentItem.<element>。次に例を示します:
Event 'DetailedView'
SDPanel.call(&BasicListDP.CurrentItem.BasicA)
Endevent
最後に、グリッドの既定のアクションとしてこのイベントを設定します。
必要に応じて、前に作成したグリッドに、テキストブロック、画像、変数などのコントロールを追加できます。GeneXus X Evolution 3 以降は、変数を手動でロードしたり、グリッド内部のコントロールのプロパティを動的に変更したりするために、SDT に基づくグリッドに Load イベントを使用することもできます。次に例を示します:
Event Refresh
&BasicListSDT = BasicListDP()
EndEvent
Event Load
If SatisfiesSomeCondition(&BasicListSDT.CurrentItem.BasicA)
&SomeVariable = GetSomeValue()
Image1.Visible = True
Else
Image1.Visible = False
EndIf
EndEvent
コレクションを表示せずに、SDT のフィールドを表示する場合は、上記の例と同じ方法で行うことができます。唯一の違いは、この場合 GeneXus はグリッドを作成せず、ラベルを持つ別のコントロールとしてフィールドをレイアウトに配置します。
この例の xpz はこちらでダウンロードできます: SDTinSD
|