この章では、データ・コントロール・パレットを使用して、ADF Facesコンポーネントを使用するデータ・バインドされた表を作成する方法について説明します。
この章の内容は次のとおりです。
フォームと異なり、表を使用すると、コレクションのデータ・オブジェクトを一度に複数表示できます。図14-1に、SRDemoアプリケーションのSRListページを示します。このページでは、参照表を使用して、ログインしたユーザーの最新のサービス・リクエストを表示しています。
コレクションを表としてドロップすると、ユーザーが特定の行を選択できるようにする行選択コンポーネントを追加できます。アクションにバインドされたコマンド・ボタンを追加すると、ユーザーはこれらのボタンをクリックして、なんらかのロジックを選択した行に対して実行できます。詳細は、17.3項「メソッドを実行するためのコマンド・コンポーネントの作成」を参照してください。また、必要に応じてデフォルトのコンポーネントを変更することもできます。
この章では次の内容について説明します。
基本表の作成方法
戻されたオブジェクト・セット間のナビゲーションの追加方法
作成後のデフォルトの表の変更方法
データの表示/非表示をできるようにするコンポーネントの追加方法
表の行を1行のみまたは1行以上を選択できるようにする列の挿入方法
表の現在行を手動で設定する方法
フォームを構成する個々のUIコンポーネントをコレクションの個々の属性にバインドするフォームと異なり、表では、ADF Facesのtable
コンポーネントをコレクション全体にバインドするか、一度にコレクションのN個のレンジのデータ・オブジェクトにバインドします。表内の個々の列は、属性にバインドされます。イテレータ・バインディングによって各オブジェクトの適切なデータが表示され、table
コンポーネントによって各オブジェクトが1行で表示されます。JDeveloperを使用すると、宣言的にこの処理を行うことができるため、コードを記述する必要がありません。
データ・コントロールを使用して表を作成するには、table
コンポーネントをビュー・オブジェクト・コレクションにバインドします。JDeveloperでは、データ・コントロール・パレットからコレクションをドラッグ・アンド・ドロップして、宣言的にこの処理を行うことができます。
データ・バインドされた表を作成する手順:
データ・コントロール・パレットから、コレクションを選択します。
たとえば、SRDemoアプリケーションのSRList表を作成するには、LoggedInUser
コレクションの下にあるServiceRequestsByStatus
コレクションを選択します。図14-2に、データ・コントロール・パレットのServiceRequestsByStatus
コレクションを示します。
ServiceRequests
を拡張するServiceRequestsByStatus
コレクションは、ビュー・リンクServiceRequestsForUser
があるため、LoggedInUser
コレクションの子です。また、ServiceRequestsByStatus
コレクションには、サービス・リクエスト・ステータス・タイプ(未処理または保留中のリクエストなど)を表す、名前付きバインド変数StatusCode
があります。SRListページで、未処理、保留中、処理済またはすべてのサービス・リクエストを表示するメニュー・バーでログインしたユーザーがコマンド・リンクを選択する場合、選択したステータス・タイプに対して、現在ログインしているユーザーによって作成された、またはこのユーザーに割り当てられたリクエストが戻されます。
コレクションをJSFページにドラッグし、ポップアップ・メニューから適切な表を選択します。
コレクションをドラッグする場合は、次の表のタイプから選択できます。
ADF表: 編集可能な表の列に表示する特定の属性と、データの表示に使用するUIコンポーネントを選択できます。デフォルトでは、コレクション・オブジェクトの各属性は、inputText
コンポーネントに表示されるため、表の編集が可能になります。
ADF読取り専用表: 「ADF表」と同じですが、各属性は、outputText
コンポーネントに表示されます。
ADF読取り専用動的表: 戻されて表示される属性が動的に決定されます。このコンポーネントは、対応するオブジェクトの属性が実行時まで不明な場合、あるいはJSFページに列名をハードコーディングしない場合に適しています。たとえば、多相コレクション(哺乳動物のコレクションまたは鳥のコレクションであるビュー・オブジェクト・コレクションなど)がある場合、動的表はそれに応じて異なる属性を表示できます。
ADFマスター表、インライン・ディテール表: 詳細は、15.6項「インライン表を使用したマスター表でのディテール・データの表示」を参照してください。
続いて表示される「表の列の編集」ダイアログから、次の操作ができます。
列の表示ラベルの変更。デフォルトでは、ラベルは表バインディング上の属性のlabels
プロパティにバインドされます。labels
プロパティの詳細は、付録B「ADFバインディング・プロパティのリファレンス」を参照してください。labels
プロパティへのバインディングにより、ビジネス・ドメイン・レイヤーで定義したUIコントロール・ヒントからラベルが継承されるようになります。このため、1箇所でラベル・テキストの値を変更できるようになり、ラベルを表示するすべてのページ上に同じようにその変更を表示させることができます。「表の列の編集」ダイアログでは、かわりにテキストまたはEL式を入力して、ラベルの値を他の何か(リソース・ファイルのキーなど)にバインドできます。
たとえば、SRListページの表のステータス列のヘッダーは、Status
キーを使用して属性を取得するlabels
プロパティにバインドされています。
#{bindings.LoggedInUserServiceRequests.labels.Status}
しかし、次の例のように、かわりにプロパティ・リソース・ファイルのキーにバインドされるようにヘッダーを変更できます。
#{srlist['sr.status']}
この例では、srlist
は、プロパティ・ファイルのロードに使用されるJSFページに定義された変数です。リソース・バンドルの使用方法の詳細は、22.4項「アプリケーションの国際化」を参照してください。
SRDemoページで主に使用されるのは、すべての属性に対して継承されたUIコントロール・ヒント、およびビュー・オブジェクト属性に直接関連しない他の種類のラベルに対するJSFリソース文字列です。
列の属性バインディングの変更。
たとえば、かわりにrequestDate
属性にバインドされるようにステータス列を変更できます。この項の後半で説明されるように、単に列を再配置する場合は、順序ボタンを使用してください。列の属性バインディングを変更する場合は、次の点に注意してください。
バインディングを変更すると、列のラベルも変更されます。
別の列に現在バインドされている属性にバインディングを変更すると、UIコンポーネントはその属性に現在バインドされている列に使用されるのとは異なるコンポーネントに変更されます。
属性の表示に使用されるUIコンポーネントの変更。UIコンポーネントは、inputText
またはoutputText
のいずれかで、コレクションをページにドロップする際に選択した表に基づいて設定されます。ドロップダウン・メニューを使用して別のコンポーネントに変更できます。別のコンポーネント(コマンド・リンク、コマンド・ボタンなど)を使用する場合は、このダイアログを使用してoutputText
コンポーネントを選択した後、構造ウィンドウで必要なUIコンポーネント(コマンド・リンクなど)に置き換える必要があります。
順序ボタンを使用した列の順序の変更。「上」は、列を表の左1列目に移動します。「上へ」は、列を左へ1列移動します。「下へ」は、列を右へ1列移動します。「下」は、列を右端に移動します。
「新規」ボタンを使用した列の追加。追加する行の数に制限はありません。最初に「新規」をクリックすると、JDeveloperではダイアログの下部に新規列の行が追加され、そこにバインドされたコレクションの最初の属性のデフォルト値が移入されます。後続の新規列は順序内の次の属性の値が移入され、その後も同様に続きます。
「削除」ボタンを使用した列の削除。このボタンを使用して列を削除すると、表から列が削除されます。
「選択を有効にする」の選択による表のselection
ファセットへのtableSelectOne
コンポーネントの追加。詳細は、14.6項「表での行選択の有効化」を参照してください。
「ソートの有効化」の選択によるすべての列に対するソートの有効化。
データ・コントロール・パレットから表をドロップすると、テキスト・フィールドまたはフォームをドロップするのと同じ効果があります。詳細は、13.2.2項「データ・コントロール・パレットを使用してテキスト・フィールドを作成した場合の処理」を参照してください。要約すると、JDeveloperにより次の処理が行われます。
表のバインディングが作成され、そのバインディングがページ定義ファイルに追加されます。
UIコンポーネントに必要なコードがJSFページに追加されます。
データ・コントロール・パレットから表をドロップすると、表の値バインディングが作成されます。フォームで使用される属性バインディングと同様に、表の値バインディングによってイテレータ・バインディングが参照され、イテレータ・バインディングによってデータ・コレクションのイテレータが参照されます。これにより、コレクションのデータ・オブジェクト全体の反復が機能します。属性ごとに異なるバインディングが作成されるのではなく、表バインディングのみが作成されます。表バインディングでは、表の各行で表示または参照できるようにする属性ごとの子要素が、AttrNames
要素に含まれています。例14-1に、ServiceRequestsByStatus
コレクションをドロップすると作成される表の値バインディングを示します。
例14-1 ページ定義ファイルにおける表の値バインディング・エントリ
<table id="LoggedInUserServiceRequests" IterBinding="ServiceRequestsByStatusIterator"> <AttrNames> <Item Value="SvrId"/> <Item Value="Status"/> <Item Value="RequestDate"/> <Item Value="ProblemDescription"/> <Item Value="ProdId"/> <Item Value="CreatedBy"/> <Item Value="AssignedTo"/> <Item Value="AssignedDate"/> </AttrNames> </table>
データへアクセスする必要があるのは表のUIコンポーネントのみであるため、表の値バインディングのみが必要です。表の列は、表バインディングからその情報を導出します。
データ・コントロール・パレットを使用してJSFページに表をドロップすると、バインド先のオブジェクトの属性ごとに1列が含まれる表が作成されます。これを実行するために、JDeveloperでADF Facesのtable
コンポーネントが挿入されます。このコンポーネントには、表バインディングの名前の付いた各属性にADF Facesのcolumn
コンポーネントが含まれています。各列には、属性の値にバインドされたinput
またはoutputText
コンポーネントが含まれます。各列のヘッダーは、表バインディングの属性のlabels
プロパティにバインドされます。例14-2に、SRListページの表から抜粋した、簡略化されたコードを示します。
例14-2 ADF Faces表の簡略化されたJSFコード
<af:table value="#{bindings.LoggedInUserServiceRequests.collectionModel}" var="row" ..> ... <af:column headerText="#{bindings.LoggedInUserServiceRequests.labels.Status}" sortProperty="Status" sortable="false"> <af:outputText value="#{row.Status}"/> </af:column> <af:column headerText="#{bindings.LoggedInUserServiceRequests.labels.RequestDate}" sortProperty="RequestDate" sortable="false"> <af:outputText value="#{row.RequestDate}"> <f:convertDateTime pattern="#{bindings.LoggedInUserServiceRequests.formats.RequestDate}"/> </af:outputText> </af:column> ... </af:table>
表バインディングは、イテレータ・バインディングによって公開されたデータ全体を反復します。FacesCtrlRangeBinding
クラスは、ベースJUCtrlRangeBinding
クラスを拡張して、特定のメソッドをベース表バインディング・オブジェクトに追加します。このようなメソッドの1つはgetCollectionModel
メソッドであり、これは、表バインディングのcollectionModel
プロパティを使用してELがアクセスするメソッドです。表は、イテレータ・バインディングからの結果セットをoracle.adf.view.faces.model.CollectionModel
オブジェクト内にラップします。表バインディングが反復処理を実行すると、コレクションの各アイテムは、var
属性を使用してtable
コンポーネント内で使用できるようになります。
例では、表がServiceRequestsByStatusIterator
イテレータ・バインディングの現在レンジの行全体を反復します。イテレータ・バインディングは、現在行の追跡を続行する行セット・イテレータにバインドします。表のvar
属性をrow
に設定すると、次のaf:outputText
タグの値に示すように、各列はrow
変数を使用して、表タグに示される現在行の現在データ・オブジェクトにアクセスします。
<af:outputText value="#{row.Status}"/>
表14-1は、データ・コントロール・パレットを使用して作成されたADF Faces表に対して、デフォルトで定義された他の属性を示します。
属性 | 説明 | デフォルト値 |
---|---|---|
|
一度に表示する行数を決定します。 |
関連付けられたイテレータ・バインディングの |
|
レンジの最初の行の索引(ベース0)。 |
関連付けられたイテレータ・バインディングの |
|
戻す行がない場合に表示するテキスト。 |
イテレータの表示可能なプロパティに評価されるEL式。表が表示できる場合に戻すオブジェクトがないときは、「まだ行がありません」と表示されます。表が表示できない場合(表に対して認可の制限が設定されている場合など)は、「アクセスは制限されました」と表示されます。 |
列の属性 |
||
|
列をソートする対象となるプロパティを決定します。 |
列の対応する属性バインディング値に設定します。 |
|
ソートできる列かどうかを決定します。 |
|
さらに、表の作成時に選択の有効化を選択した場合、表はselection
ファセット、selection
属性およびselectionListener
属性も保持します。詳細は、14.6項「表での行選択の有効化」を参照してください。
組込み操作を使用してフォームと同様のナビゲーションを実行するかわりに、ADF Faces表では、table
コンポーネントに自動的に組み込まれるselectRangeChoiceBar
コンポーネントを使用して組込みナビゲーションを提供します。selectRangeChoiceBar
コンポーネントは、現在のページに表示するレコードのレンジを選択するために、ドロップダウン・メニューと「前へ」および「次へ」のリンクをレンダリングします。図14-3に、表におけるselectRangeChoiceBar
コンポーネントの表示の例を示します。
table
コンポーネント上のrows
属性は、レンジ内に表示する行の最大数を決定します。次のSRList表のrows
属性に対するコードSnippetが示すように、データ・コントロール・パレットを使用して表を作成する場合、デフォルトではJDeveloperでイテレータのrangeSize
値と等しい行のレンジを表示するように表が設定されます。
<af:table rows="#{bindings.LoggedInUserServiceRequests.rangeSize}".../>
rows
属性のEL式は、イテレータのレンジ・サイズに対して評価します。これはページ定義ファイルで定義されます。
<executables> <iterator id="ServiceRequestsByStatusIterator" RangeSize="10" Binds="ServiceRequestsByStatus" DataControl="SRService"/> </executables>
デフォルトでは、RangeSize
値は10です。つまり、現在のページに表示するために一度に10個のレコードが戻されます。
現在のページに表示するために戻すレコード数を変更するには、ページ定義ファイルのRangeSize
値を編集します(table
コンポーネントのrows
属性を直接編集するのではありません)。
イテレータのRangeSize
値を変更するのではなく、table
コンポーネントのrows
属性を直接変更する場合は、必ずrows
の値がイテレータのRangeSize
値以下であることを確認してください。RangeSize
属性の詳細は、13.4.2.2項「イテレータのRangeSize属性」を参照してください。
selectRangeChoiceBar
コンポーネントは、コレクション内のオブジェクトの次のレンジおよび前のレンジを選択できるようにするナビゲーション・リンクを示します。コレクションの合計サイズが認識されている場合は、図14-3に示すように、コレクション内の特定のレンジ・セットに直接ナビゲートできるようにするドロップダウン・メニューを示します。イテレータのRangeSize
属性を変更すると、新規レンジ・セットを表示するようにselectRangeChoiceBar
コンポーネントも自動的に変更されます。
table
コンポーネントのrows
属性は、レンジを設定するためにfirst
属性とともに使用されます。first
属性(レンジ内の行のゼロベースの索引)は、現在のレンジの1行目を決定します。デフォルトでは、rows
属性は、関連付けられたイテレータのrangeSize
属性の値にその値をバインドするEL式を使用します。first
属性はEL式も使用しますが、式はイテレータのrangeStart
属性の値にバインドします。たとえば、SRListページの表のrows
属性とfirst
属性の値は、次のとおりです。
<af:table rows="#{bindings.LoggedInUserServiceRequests.rangeSize}" first="#{bindings.LoggedInUserServiceRequests.rangeStart}"
現在のレンジはそれぞれ、first
によって特定された行で始まり、rows
属性によって指定されるのと同じ行数のみが含まれます。
使用するselectRangeChoiceBar
に対するレンジ・セットを決定するために、ビュー・オブジェクトが最初のRangeSizeの行数を取得してから停止し、表がgetEstimatedRowCount()
メソッドをコールして別個のSELECT COUNT(*) FROM (...)
問合せを作成します。これによって、実際にすべてを取得しなくても、問合せが取得する行の合計数が概算されます。getEstimatedRowCount()
メソッドの詳細は、5.6.2項「行セットにおける行数計算」を参照してください。
アクション・バインディングのロジックに依存してナビゲーションを提供するナビゲーション操作と異なり、selectRangeChoiceBar
コンポーネントは、RangeChangeEvent
イベントを送信します。ユーザーがselectRangeChoiceBar
コンポーネントによって示されるナビゲーション・リンク(「前へ」、「次へ」など)の1つを選択して別のレンジにナビゲートすると、表によってRangeChangeEvent
イベントが生成されます。このイベントには、現時点でレンジの一番上にある必要のあるオブジェクトの索引が含まれます。表は、このイベントに応じてfirst
属性の値をこの新しい索引に変更します。
RangeChangeEvent
イベントには、リスナーが関連付けられています。表のRangeChangeListener
属性は、マネージドBeanのメソッドにバインドできます。このメソッドは、RangeChangeEvent
イベントに応えて、つまり、ユーザーによる表のレンジの変更に応じて表がfirst
属性を変更するたびに起動されます。このバインディングは、たとえば、前のレンジに対して作成されたキャッシュ済データを解放する必要がある場合など、ユーザー・ナビゲーションに応えてなんらかの補足アクションが発生する必要がある場合に適しています。組込み操作の前後へのロジックの追加の詳細は、17.5項「宣言メソッドのオーバーライド」を参照してください。
ブラウザの「戻る」ボタンを使用すると、第13章で説明したものと同じ問題が発生することに注意してください。詳細は、13.4.4項「ブラウザの「戻る」ボタンについての考慮事項」を参照してください。イテレータは現在オブジェクトを追跡するため、ユーザーがページのナビゲーション・ボタンを使用するかわりにブラウザの「戻る」ボタンをクリックすると、イテレータが無視されるので、イテレータと表示されるページとの同期がずれてしまいます。フォームの場合と同様に、表ではブラウザの「戻る」 ボタンを使用する際に示されるページに表示される現在行(またはレンジあるいは複数の行)が、現在行およびレンジのイテレータ・バインディングの概念に対応しないことがあります。
たとえば、図14-1に示したSRListページでは、IDが4
のサービス・リクエストを選択した後、IDのリンク、「表示」ボタンまたは「編集」ボタンのいずれかを使用してページを移動すると、イテレータはサービス・リクエスト4を表すオブジェクトに設定されます。(13.4.4項「ブラウザの「戻る」ボタンについての考慮事項」の手順で説明したように)EnableTokenValidation
をtrue
に設定した場合は、ページのトークンも4に設定されます。ブラウザの「戻る」ボタンを使用すると、何事も問題ないように見え、同じレンジが表示されます。ただし、別のボタンをクリックすると、現在行が同期していないことを示すエラーが表示されます。これは、表示されたページはトークンが0に設定された前のページであるのに、イテレータは4になっているためです。
データ・コントロール・パレットを使用して表を作成したら、属性の削除、表示順序の変更、表示に使用されるコンポーネントの変更、コンポーネントの属性バインディングの変更ができます。また、新規属性を追加することもできます。新規属性を追加する前に、表に表示する属性が表バインディングに含まれていることを確認してください。
データ・コントロール・パレットを使用して作成された表は、次のような変更ができます。
行のラベルに対するバインディングの変更
UIコンポーネントがバインドされている属性の変更
属性にバインドされているUIコンポーネントの変更
表内の列の並替え
表内の列の削除
表への列の追加
表の属性を変更する手順:
構造ウィンドウで、af:tableを右クリックし、「列の編集」を選択します。
列の表示ラベルの変更。デフォルトでは、ラベルは表バインディング上の属性のlabels
プロパティにバインドされます。labels
プロパティの詳細は、付録B「ADFバインディング・プロパティのリファレンス」を参照してください。labels
プロパティへのバインディングにより、ビジネス・ドメイン・レイヤーで定義したUIコントロール・ヒントからラベルが継承されるようになります。このため、1箇所でラベル・テキストの値を変更できるようになり、ラベルを表示するすべてのページ上に同じようにその変更を表示させることができます。このダイアログでは、かわりにテキストまたはEL式を入力して、ラベルの値を他の何か(リソース・ファイルのキーなど)にバインドすることができます。
たとえば、SRListページの表のステータス列のヘッダーは、Status
キーを使用して属性を取得するlabels
プロパティにバインドされています。
#{bindings.LoggedInUserServiceRequests.labels.Status}
しかし、次の例のように、かわりにプロパティ・リソース・ファイルのキーにバインドされるようにヘッダーを変更できます。
#{srlist['sr.status']}
この例では、srlist
は、プロパティ・ファイルのロードに使用されるJSFページに定義された変数です。リソース・バンドルの使用方法の詳細は、22.4項「アプリケーションの国際化」を参照してください。
列の属性バインディングの変更。
たとえば、かわりにRequestDate
属性にバインドされるようにステータス列を変更できます。次のことに注意してください。
バインディングを変更すると、列のラベルも変更されます。
別の列に現在バインドされている属性にバインディングを変更すると、UIコンポーネントはその属性に現在バインドされている列に使用されるのとは異なるコンポーネントに変更されます。
この項の後半で説明されるように、単に列を再配置する場合は、順序ボタンを使用してください。
属性の表示に使用されるUIコンポーネントの変更。UIコンポーネントは、inputText
またはoutputText
のいずれかで、コレクションをページにドロップする際に選択した複合コンポーネントに基づいて設定されます。ドロップダウン・メニューを使用して別のUIコンポーネントに変更できます。まったく別のコンポーネント(コマンド・リンク、コマンド・ボタンなど)を使用する場合は、このダイアログを使用してoutputText
コンポーネントを変更した後、構造ウィンドウでoutputText
コンポーネントを必要なUIコンポーネント(コマンド・リンクなど)に置き換える必要があります。
ヒント: 次のUIコンポーネントを表内で使用する際は、注意事項を考慮してください。
|
順序ボタンを使用した列の順序の変更。「上」は、列を表の左1列目に移動します。「上へ」は、列を左へ1列移動します。「下へ」は、列を右へ1列移動します。「下」は、列を右端に移動します。
「新規」ボタンを使用した列の追加。このボタンを使用して列を追加すると、新しい列がダイアログの下部に追加され、デフォルトでコレクションの次の順の属性から値が移入されます。値は、編集する必要があります。選択できるのは、表がバインドされているオブジェクトに関連付けられた属性のみです。
「削除」ボタンを使用した列の削除。このボタンを使用して列を削除すると、表から列が削除されます。
「選択を有効にする」の選択による表のselection
ファセットへのtableSelectOne
コンポーネントの追加。詳細は、14.6項「表での行選択の有効化」を参照してください。
「ソートの有効化」の選択によるソート機能の追加。
バインディングを変更するかわりに、表がバインドされているオブジェクトを完全に変更することができます。
表をリバインドする手順:
構造ウィンドウで表を右クリックし、「バインディングを編集」を選択して表バインディング・エディタを起動します。
エディタで、表のバインド先とする新しいコレクションを選択します。表のバインディングを変更すると、すべての列のバインディングも変更されます。14.4.1項「表示される属性の変更方法」の手順に従って、これらのバインディングを変更できます。
detailStamp
ファセットを表内で使用すると、表示または非表示にできるデータを挿入できます。コンポーネントをこのファセットに追加すると、表には「詳細」という追加の列がトグルスイッチとともに表示されます。トグルスイッチをクリックすると、ファセットに追加されたコンポーネントが表示されます。トグルスイッチを再度クリックすると、コンポーネントは非表示になります。ファセットの概要は、13.3.2.1項「ファセットの使用方法」を参照してください。図14-4に、outputText
コンポーネントのサービス・リクエストの説明が表内でどのように非表示または表示されるかを示します(この機能は現在SRDemoアプリケーションには存在しません)。
マスター/ディテール関係がある別のオブジェクトの詳細を表示する場合(たとえば、サービス・リクエストが割り当てられているユーザーの詳細を表示する場合など)は、Master Table-Inline Detail
複合コンポーネントを使用できます。マスター/ディテール関係およびマスター/ディテール複合コンポーネントの使用の詳細は、15.6項「インライン表を使用したマスター表でのディテール・データの表示」を参照してください。
detailStamp
ファセットを使用するには、表示または非表示にするデータにバインドされているコンポーネントをファセットに挿入します。また、すべての詳細を一度に表示または非表示にできるようにするリンクを作成する属性を表に設定できます。
detailStampファセットを使用する手順:
データ・コントロール・パレットから、ファセット内に表示する属性をdetailStampファセット・フォルダにドラッグします。図14-5に、構造ウィンドウでのdetailStampファセット・フォルダの表示方法を示します。
次に、ポップアップ・メニューから、属性を表示するUIコンポーネントを選択します。
すべての詳細を一度に非表示または表示できるようにするリンクが必要な場合は、構造ウィンドウで表を選択します。次に、プロパティ・インスペクタでallDetailsEnabled
属性をtrue
に設定します。
表示する属性が現在レコードに固有である場合は、表の変数を使用して現在レコードのデータを表示するように、コンポーネントを属性に単にバインドするJSFコードを置き換える必要があります。
たとえば、属性をドラッグすると、次のコードが挿入されます。
<f:facet name="detailStamp"> <af:outputText value="#{bindings.<attributename>.inputValue}"/> </f:facet>
このコードを次のように変更する必要があります。
<f:facet name="detailStamp"> <af:outputText value="#{row.<attributename>}"/> </f:facet>
detailStamp
ファセット・フォルダに属性をドラッグすると、属性値バインディングがページ定義ファイルに存在しない場合は追加されます。また、ファセットのコードがJSFページに追加されます。
たとえば、SRListページで、必要に応じてサービス・リクエストの説明を非表示にできるようにするとします。表はServiceRequestsByStatus
コレクションを使用して作成されているため、構造ウィンドウでProblemDescription
属性をドラッグしてdetailStampファセット・フォルダ内にドロップできます。
例14-3に、JSFページに追加されるコードを示します。
例14-3 detailStampファセットのJSFコード
<f:facet name="detailStamp"> <af:outputText value="#{bindings.ServiceRequestsByStatusProblemDescription.inputValue}"/> </f:facet>
次に、コンポーネントが表の変数を使用して各行の正しい問題の説明にアクセスするように、このコードを変更する必要があります。例14-4に、row
変数を使用した後のコードを示します。
ユーザーが行の詳細を非表示または表示にすると、表によってDisclosureEvent
イベント(あるいは、表のallDetailsEnabled
属性がtrue
に設定されている場合はDisclosureAllEvent
イベント)が生成されます。このイベントは、詳細を切り替える(開くまたは閉じる)ように表に指示します。
DisclosureEvent
イベントには、リスナーが関連付けられています。表のDisclosureListener
属性は、マネージドBeanのメソッドにバインドできます。このメソッドは、DisclosureEvent
イベントに応えて起動され、必要な後処理を実行します。
tableSelectOne
コンポーネントまたはtableSelectMany
コンポーネントが表のselection
ファセットに追加されると、表に「選択」列が表示されます。この列により、ユーザーは、1行のみまたは1行以上を選択し、コマンド・ボタンを通じてなんらかのアクションをそれらの行に実行できます。
tableSelectOne
コンポーネントを使用すると、1行のみ選択できます。図14-6のように、このコンポーネントにより、「Select」列の各行に対してラジオ・ボタンが提供されます。たとえば、SRListページの表には、1行を選択できるtableSelectOne
コンポーネントがあり、「View」または「Edit」コマンド・ボタンのいずれかをクリックして、選択されたサービス・リクエストの詳細を表示または編集できます。
tableSelectMany
コンポーネントは、「Select」列の各行に対するチェック・ボックスを示し、ユーザーは1行以上を選択できます。tableSelectMany
コンポーネントを使用すると、図14-7のように、行のすべてを選択または選択解除できるテキスト・リンクも追加されます。たとえば、SRMainページの表には、ユーザーが複数レコードを選択できるtableSelectMany
コンポーネントがあり、「Delete Service History Record」コマンド・ボタンをクリックすると選択されたレコードを削除できます。
表の行を選択するどちらのコンポーネントにも、ユーザーへの指示となる値を保持するtext
属性があります。表の行選択コンポーネントも、通常、選択された行に対してなんらかのアクションを実行するために使用されるコマンド・ボタンまたはコマンド・リンクを子として保持します。たとえば、SRListページの表にはコマンド・ボタンがあり、選択されたサービス・リクエストを表示または編集できます。
tableSelectOne
とtableSelectMany
の両コンポーネントのrequired
属性は、true
に設定できます。この値に設定すると、行が選択されていない場合はエラーがスローされます。しかし、required
属性を設定する場合は、必須入力エラー・メッセージを正しく表示するために、summary
属性も表に設定する必要があります。required
属性の詳細は、20.3.1.1.1項「検証属性の使用」を参照してください。
autoSubmit
属性をtableSelectOne
およびtableSelectMany
コンポーネントに設定することもできます。autoSubmit
属性をtrue
に設定すると、選択が行われたときに、表を保持するフォームが自動的に送信されます。詳細は、11.6項「ADF Facesのベスト・プラクティス」を参照してください。
tableSelectOne
とtableSelectMany
を使用するための手順はまったく異なります。ADFアプリケーションでは、操作(メソッドなど)は、イテレータが追跡している現在のデータ・オブジェクトに対して作用します。tableSelectOne
コンポーネントは、現在のデータ・オブジェクトを選択中として表示できます。また、新たに選択された行をイテレータの現在オブジェクトに設定できます。同じイテレータが後続のページで使用される場合(たとえば、行の選択後にコマンド・ボタンをクリックしてオブジェクトを編集できるページにナビゲートする場合など)は、選択されたオブジェクトが表示されます。このように動作するのは、イテレータとコンポーネントが単一のオブジェクトを処理するためです。異なるバインディング・コンテナの異なるイテレータ・バインディングが同じ行セット・イテレータにバインドされるため、現在行の概念は同じです。
しかし、tableSelectMany
コンポーネントでは、選択されたオブジェクトが複数存在します。ADFモデル・レイヤーには、「現在」とは対照的な「選択」という概念はありません。操作をオブジェクトに対して実行できるように、選択された各オブジェクトをループして、順に現在オブジェクトにするロジックをモデル・レイヤーに追加する必要があります。
コレクションを表としてデータ・コントロール・パレットからドロップする際に、selection
ファセットの挿入を選択できます。「選択を有効にする」を選択すると、tableSelectOne
コンポーネントがtableSelectOne
の子である「発行」 commandButton
コンポーネントとともにselection
ファセットに挿入されます。
注意: データ・コントロール・パレットを使用して表を作成する場合、tableSelectMany コンポーネントは挿入できません。このコンポーネントは、表の作成後に手動で追加する必要があります。ただし、ADFアプリケーションで複数選択処理を使用するには、追加コードを作成する必要があります。詳細は、14.6.5項「selectionファセットにおけるtableSelectManyコンポーネントの使用方法」を参照してください。 |
「発行」ボタンをメソッドにバインドする場合は、選択したメソッドまたは操作にcommandButton
コンポーネントをリバインドする必要があります。リバインドの手順は、21.6項「アクションへのADFバインディングの追加」を参照してください。
また、tableSelectOne
コンポーネントをselection
ファセットに手動で追加できます。
selectionファセットを手動で使用する手順:
構造ウィンドウで、af:tableを選択し、ポップアップ・メニューから「列の編集」を選択します。
「表の列の編集」ダイアログで、「選択を有効にする」を選択し、「OK」をクリックします。
tableSelectOne
コンポーネントが(必要なリスナーとtable
コンポーネントでの選択と連携して機能する属性とともに)selectionファセット・フォルダに追加されます。
構造ウィンドウで、表のselectionファセット・フォルダを開き、af:tableSelectOneを選択します。
新しいコンポーネントのプロパティ・インスペクタで、選択の処理に使用されるコマンド・ボタンまたはコマンド・リンクの使用に関する指示を示すtext
属性の値を入力します。
(オプション): 「発行」コマンド・ボタンをデータ・コントロール・パレットから選択したメソッドまたは操作にリバインドします。リバインドの手順は、21.6項「アクションへのADFバインディングの追加」を参照してください。メソッドを使用したコマンド・ボタンの作成の詳細は、17.3項「メソッドを実行するためのコマンド・コンポーネントの作成」を参照してください。
注意: コマンド・コンポーネントをファセットに追加しないかぎり、text 属性の値は表示されません。 |
例14-5に示すように、表の初回作成時または後からの表の編集時に選択の有効化を選択すると、text
属性の値としてSelect and
が設定されたtableSelectOne
コンポーネントがselection
ファセットに挿入されます。「発行」コマンド・ボタンも子として挿入されます。
例14-5 selectionファセットのコード
<f:facet name="selection"> <af:tableSelectOne text="Select and"> <af:commandButton text="Submit"/> </af:tableSelectOne>
例14-6に示すように、表のselectionState
属性の値は、イテレータから作成されたコレクション・モデルの選択された行に評価されるEL式です。selectionListener
属性の値は、コレクション・モデルのmakeCurrent
メソッドに評価されます。この値は、選択ファセットが選択された行を現在オブジェクトとしてイテレータに設定できるようにするものです。
ユーザーが選択を行い、関連付けられたコマンド・ボタンをクリックすると、tableSelectOne
コンポーネントにより、表のgetSelectionState()
メソッドをコールして取得されたRowKeySet
が更新されます。選択の状態はコレクション・モデルの選択された行に評価されるため、その行は選択済としてマークされます。この選択は、コマンド・ボタンに関連付けられたActionListener
をコールする前に実行されます。
tableSelectOne
コンポーネントの場合、ActionListener
の起動前に現在行が選択されるため、コマンド・ボタンのActionListener
を、行のデータに対して該当する処理を実行するマネージドBeanのメソッドにバインドできます。あるいは、単にロジックを宣言メソッドに追加できます。詳細は、17.5項「宣言メソッドのオーバーライド」を参照してください。
tableSelectOne
コンポーネントは、表の選択の状態が変更されると、SelectionEvent
イベントをトリガーします。SelectionEvent
は、選択された行と選択解除された行をレポートします。SelectionListener
属性はコレクション・モデルのmakeCurrent
メソッドにバインドされているため、イベントが発生するとこのメソッドが起動し、イテレータに新しい現在行を設定します。
14.6.1項「selectionファセットにおけるtableSelectOneコンポーネントの使用方法」で説明したように、コレクションを表としてドロップして同時に「選択を有効にする」を選択する場合、または「表の列の編集」ダイアログを使用して後から選択を有効化する場合に、commandButton
コンポーネントはtableSelectOne
コンポーネントの子として自動的に追加されます。tableSelectOne
コンポーネントは、table
コンポーネントのselection
ファセットに挿入されます。
表で選択を行う場合、tableSelectOne
コンポーネントは選択された行をイテレータの現在オブジェクトとして設定します。次に、ユーザーは選択された行にコマンド・ボタンを使用してなんらかのアクションを実行できます。
selection
ファセットのコンポーネントを使用して現在オブジェクトを設定し、次のページへ移動するためのcommandButton
を提供するかわりに、リンクをクリックして選択に対して操作を実行し、かつ別のページに移動できるようにするcommandLink
コンポーネントを使用できます。図14-6のように、表の2番目の列を使用すると、最初に行を選択し、次にコマンド・ボタンをクリックしてアクションを実行して移動する必要がある手順が省略されます。列リンクを追加する場合、現在オブジェクトをイテレータ・バインディングに手動で設定する必要があります。現在オブジェクトの手動設定の詳細は、14.7項「コマンド・コンポーネントを使用した現在オブジェクトの設定」を参照してください。
ヒント: 後続のページで同じイテレータを使用しない場合は、通常、選択された行を表すパラメータを後続のページ用に手動で設定する必要があります。たとえば、SRListページから、ユーザーがサービス・リクエストを選択してから「Edit」コマンド・ボタンをクリックする場合、アプリケーションはSREditページに移動します。ここで、選択されたサービス・リクエストの正しいデータが表示されます。「Edit」コマンド・ボタンは、setCurrentRowWithKey アクション・バインディングを使用しており、移動の前にprocessScope に適切な値を設定するためのaf:setActionListener タグが含まれます。SREditページには、setCurrentRowWithKey 操作を起動するinvokeAction オブジェクトがあります。rowKey NamedData 要素にバインドされる値は、パラメータとして渡され、それによって表示する現在行が決定されます。詳細は、17.4項「コマンド・コンポーネントを使用したパラメータ値の設定」を参照してください。 |
データ・コントロール・パレットを使用して表を作成する場合、tableSelectMany
コンポーネントは挿入できません。このコンポーネントは、表の作成後に手動で追加する必要があります。
tableSelectOne
コンポーネントとは異なり、tableSelectMany
コンポーネントでは、選択されたオブジェクトが複数存在します。
ADF表バインディングを使用する表にtableSelectMany
コンポーネントを追加する場合、それぞれを順番に処理するメソッドに、選択されたキーのセットを渡す必要があります。
ADFアプリケーションでtableSelectManyコンポーネントを使用する手順:
14.2.1項「基本表の作成方法」に示すように表を作成します。ただし、「選択を有効にする」は選択しないでください。
構造ウィンドウで、Table facetsフォルダを開き、selectionファセット・フォルダを右クリックして、「selectionの中に挿入」→「TableSelectMany」の順に選択します。
構造ウィンドウでaf:tableノードを選択し、必要に応じて、プロパティ・インスペクタでSelectionState属性およびSelectionListener属性の値を削除します。そうすることで、コンポーネントが選択された行の1つを現在オブジェクトに設定することを防ぎます。このロジックは、作成するコードによって処理する必要があるためです。
データ・コントロール・パレットから、選択されたオブジェクトに対して作用するメソッドをaf:tableSelectManyノードの上にドラッグします。次に、ポップアップ・メニューから「作成」 →「ADFコマンド・ボタン」を選択します。そうすることで、メソッドがcommandButton
コンポーネントとしてドロップされます。メソッドがパラメータを受け入れる場合は、メソッドに対してパラメータ値を設定する必要があります。
たとえば、SRMainページを作成して、サービス・リクエストに関連付けられる複数のサービス履歴レコードをユーザーが削除できるようにするには、カスタムdeleteServiceHistoryNotes(Set)
操作をaf:tableSelectManyノード上にドラッグします。
アクション・バインディング・エディタの「値」フィールドの省略記号(...)ボタンをクリックしてEL式ビルダーを開き、各パラメータの値を入力します。パラメータの値を表すノードを選択します。
たとえば、SRMainページの表が、backing_SRMain
という名前のマネージドBeanのhistoryTable
プロパティにバインドされます。表内の選択された行セットにアクセスするには、パラメータの値として次のように使用します。
#{backing_SRMain.historyTable.selectionState.keySet}
詳細は、17.3.1項「サービス・メソッドにバインドされたコマンド・コンポーネントの作成方法」を参照してください。
ロジックを追加して、宣言メソッドが選択された行セットに対して操作できるようにします。ロジックを追加するには、コマンド・ボタンのドロップ時に作成される宣言メソッドをオーバーライドします。手順は、17.5項「宣言メソッドのオーバーライド」を参照してください。要約すると、コマンド・ボタンのaction
属性を、追加されたロジックを持つバッキングBeanメソッドにバインドすることにより、宣言メソッドをオーバーライドします。例14-11は、SRMainページのために作成されたバッキングBeanメソッドonDeleteHistoryRows()
を示します。
tableSelectMany
コンポーネントを表に挿入して、サービス・メソッドにバインドされたコマンド・ボタンを追加すると、次の処理が実行されます。
tableSelectMany
およびcommandButton
コンポーネントがtable
コンポーネントのselection
ファセットに追加されます。
ページ定義ファイルでバインドされたメソッドに対してメソッド・バインディングが作成され、メソッドをボタンとしてドロップしたときに決定される、メソッドに必要なパラメータ(存在する場合)の値を保持するNamedData
要素が挿入されます。
例14-7は、table
、tableSelectMany
、およびcommandButton
コンポーネントのコードを示します。
例14-7 tableSelectManyコンポーネントを使用する表のJSFコード
<af:table value="#{bindings.ServiceHistories.collectionModel}" var="row" rows="#{bindings.ServiceHistories.rangeSize}" first="#{bindings.ServiceHistories.rangeStart}"... binding="#{backing_SRMain.historyTable}"> <af:column headerText="#{bindings.ServiceHistories.labels.SvhDate}" sortable="false"> <af:outputText value="#{row.SvhDate}"> <f:convertDateTime pattern="#{bindings.ServiceHistories.formats.SvhDate}"/> </af:outputText> </af:column> <af:column headerText="#{bindings.ServiceHistories.labels.SvhType}" sortable="false"> <af:outputText value="#{row.SvhType}"/> </af:column> <af:column headerText="#{bindings.ServiceHistories.labels.Notes}" sortable="false"> <af:outputText value="#{row.Notes}"/> </af:column> <f:facet name="selection"> <af:tableSelectMany text="Select items and ..."> <af:commandButton text="..." actionListener="#{bindings.deleteServiceHistoryNotes.execute}" .../> </af:tableSelectMany> </f:facet> </af:table>
カスタム・サービス・メソッドを使用してコマンド・ボタンを作成する場合、actionListener
属性を使用して、そのボタンがメソッドにバインドされます。ボタンは、指定されたメソッドのアクション・バインディングのexecute
プロパティにバインドされます。例14-8は、コマンド・ボタン上のバインドされたメソッドに対するメソッド・アクション・バインディングが含まれる、ページ定義コードを示します。
例14-8 deleteServiceHistoryNotesメソッド・アクション・バインディング
<methodAction id="deleteServiceHistoryNotes" InstanceName="SRService.dataProvider" DataControl="SRService" MethodName="deleteServiceHistoryNotes" RequiresUpdateModel="true" Action="999"> <NamedData NDName="keySet" NDValue="${backing_SRMain.historyTable.selectionState.keySet}" NDType="java.util.Set"/> </methodAction>
メソッド・アクション・バインディングによって、関連付けられているメソッドがビジネス・サービスで起動し、NamedData
要素にバインドされている値がパラメータとして渡されます。
アクション・バインディングのexecute
メソッドにコマンド・ボタンをバインドするかわりに、宣言メソッドをオーバーライドするバッキングBean内のメソッドにボタンをバインドできます。そうすることで、元のメソッドの実行前か実行後に、ロジックを追加できるようになります。宣言メソッドをオーバーライドすると、例14-9のように、(actionListener
属性のかわりに)action
属性を使用して、コマンド・コンポーネントが新規メソッドに自動的にリバインドされます。
例14-9 宣言メソッドをオーバーライドした後のコマンド・ボタン・コード
<af:commandButton text="..." action="#{backing_SRMain.onDeleteHistoryRows}"/>
例14-10は、宣言メソッドをオーバーライドする場合に、バッキングBeanに挿入されるバインディング・コンテナ・コードを示します。コードによってバインディング・コンテナにアクセスし、関連付けられるメソッドに対するバインディングが検索されます。
例14-10 バッキングBeanでJDeveloperにより追加されたバインディング・コンテナ・コード
private BindingContainer bindings; public BindingContainer getBindings() { return this.bindings; } public void setBindings(BindingContainer bindings) { this.bindings = bindings; } public String onDeleteHistoryRows() { BindingContainer bindings = getBindings(); OperationBinding operationBinding = bindings.getOperationBinding("deleteServiceHistoryNotes"); Object result = operationBinding.execute(); if (!operationBinding.getErrors().isEmpty()) { return null; } return null; }
メソッド・バインディングへのexecute()
コールの前または後にロジックを追加することにより、宣言メソッドの前または後に必要なロジックを実行できます。
tableSelectOne
コンポーネントと同様に、ユーザーがtableSelectMany
コンポーネントを使用して複数選択を行ってから、関連付けられたコマンド・ボタンをクリックする場合、ユーザーが選択したすべての行をRowKeySet
に配置すると、tableSelectMany
コンポーネントによって表の選択の状態が更新されます。
例14-11は、deleteServiceHistoryNotes(Set)
操作がコマンド・ボタンとしてドロップされる場合に作成される宣言メソッドをオーバーライドするSRMainページのバッキングBeanメソッドを示します。
例14-11 サービス履歴レコードの削除に関するバッキングBeanメソッド
public String onDeleteHistoryRows() { BindingContainer bindings = getBindings(); Set keySet = getHistoryTable().getSelectionState().getKeySet(); if (!keySet.isEmpty()) { getBindings().getOperationBinding("deleteServiceHistoryNotes").execute(); keySet.clear(); } return null; }
例14-12は、サービス履歴表の使用に関して追加する必要があるバッキングBeanのコードを示します。
例14-12 サービス履歴表の使用に関するバッキングBeanコード
private CoreTable historyTable; public void setHistoryTable(CoreTable historyTable) { this.historyTable = historyTable; } public CoreTable getHistoryTable() { return historyTable; }
ユーザーがサービス履歴表で複数行を選択して、「Delete Service History Record」ボタンをクリックする場合、選択されたすべての行をRowKeySet
に配置すると、tableSelectMany
コンポーネントによって表の選択の状態が更新されます。バッキングBeanメソッドonDeleteHistoryRows()
はバインディング・コンテナにアクセスし、履歴表でgetSelectionState.getKeySet()
をコールすることにより、選択されたキーを取得します。バッキングBeanメソッドは、次にバインディングでexecute()
メソッドをコールすることにより、deleteServiceHistoryNotes
メソッド・アクション・バインディングを実行します(これは、アプリケーション・モジュールのクライアント・インタフェースでdeleteServiceHistoryNotes()
メソッドにバインドされます)。サービス・メソッドは、各キーによって検索された行を削除しながら、keySet
をループします。最後に、サービス・メソッドによって選択された行がすべて削除された後、バッキングBeanメソッドがkeySet
でclear()
メソッドをコールして、キーを削除します。
オブジェクトの現在行をプログラムでイテレータに設定する必要がある場合があります。たとえば、SRDemoアプリケーションのSRListページでは、図14-8に示すように2番目の列にコマンド・リンクを使用しています。ユーザーはこのリンクをクリックすると、先に行を選択しなくても、サービス・リクエストを直接編集できます。
コマンド・リンクを使用するとユーザーの手順を省略できますが、コマンド・リンクはselection
ファセットと同じ機能を提供するわけではなく、現在行を特定したり、イテレータに現在行を設定することができません。そのため、手動で現在行を設定する必要があります。
組込み操作のsetCurrentRowWithKey
またはsetCurrentRowWithKeyValue
を使用して現在行を設定します。これらの操作は、コレクションに対するイテレータの組込みメソッドです。setCurrentRowWithKey
操作を使用すると、文字列化されたキーを指定して現在行を設定できます。setCurrentRowWithKeyValue
操作を使用すると、主キーの値を指定して現在行を設定できます。現在行の操作の詳細は、10.5.6項「setCurrentRowWithKeyとsetCurrentRowWithKeyValueの違いの理解」を参照してください。
これらの操作は任意のタイプのコマンド・コンポーネントとしてドロップできますが、このような状況では通常、commandLink
コンポーネントが使用されます。次の手順では、このコンポーネントをsetCurrentRowWithKey
操作およびsetCurrentRowWithKeyValue
操作とともに使用する方法について説明します。
データ・コントロール・パレットから、setCurrentRowWithKey
操作またはsetCurrentRowWithKeyValue
操作をドラッグします。
ポップアップ・メニューから、「操作」→「ADFコマンド・リンク」の順に選択します。
ページ上にコマンド・リンク・コンポーネントが作成され、アクション・バインディングがページ定義ファイルに追加されます。アクション・バインディング・エディタで、rowKey
パラメータの値を変更する必要があります。
構造ウィンドウでコマンド・リンク・コンポーネントを選択して、ポップアップ・メニューから「バインディングを編集」を選択します。
アクション・バインディング・エディタでは、デフォルトで、rowKey
パラメータの値が${bindings.setCurrentRowWithKey_rowKey}
に設定されます。実際の値は、現在行の特定に使用できるものにする必要があります。
たとえば、図14-8のコマンド・リンクには、現在行をクリックされるリンクと同じ行に設定する必要があります。setCurrentRowWithKey
操作の場合、行の文字列化されたキーにアクセスするために、バインディングのrowKeyStr
プロパティまたは#{row.rowKeyStr}
を使用できます。
あるいは、setCurrentRowWithKeyValue
操作を使用する場合は、rowKey
を現在行の値または#{row.svrId}
に設定できます。
表の現在行の設定に使用される変数(この場合はrow
)の詳細は、14.2.2.2項「ADF Faces表のJSFページのコード」を参照してください。
setCurrentRowWithKey
操作をコマンド・コンポーネントとして使用すると、その操作に対してアクション・バインディングが作成されます。この操作は、現在行を特定するパラメータ(rowKey
)をとるため、その値の設定に使用されるNamedData
要素を保持します(パラメータおよびNamedData
要素の詳細は、17.3項「メソッドを実行するためのコマンド・コンポーネントの作成」を参照してください)。
例14-13に、setCurrentRowWithKey
操作をドロップして#{row.rowKeyStr}
をrowKey
パラメータの値として設定したときにページ定義ファイルに作成されるコードを示します。
例14-13 setCurrentRowWithKey操作のページ定義コード
<action id="setCurrentRowWithKey" IterBinding="ServiceRequestsByStatusIterator" InstanceName="SRService.ServiceRequestsByStatus" DataControl="SRService" RequiresUpdateModel="false" Action="96"> <NamedData NDName="rowKey" NDValue="${row.rowKeyStr}" NDType="java.lang.String"/> </action>
ユーザーがコマンド・リンクをクリックすると、現在行を特定するrowKey
パラメータを使用して、setCurrentRowWithKey
操作がイテレータで実行されます。tableSelectOne
コンポーネントと同様に、同じイテレータを使用して現在レコードを表示すると、正しいデータが表示されます。
ヒント: SRDemoアプリケーションのものと同様の機能の場合、現在行を表すパラメータ値を渡すコマンド・リンクが必要になることがあります。この値は、次のフォームの作成に使用されるメソッドで使用されます。詳細および手順は、17.4項「コマンド・コンポーネントを使用したパラメータ値の設定」を参照してください。 |