You need to sign in to do that
Don't have an account?
kkurahashi
Custom List Contollerを使ったページング表示がうまく機能しない
お世話になります。
PDF版の”Visualforce Developer's Guide"の中でpage 62の最後から掲載されているリストを試しているのですが、
ページングが機能しません。
Custom List ControllerでデータのListを作って、VisualforceではcommandLinkでactionに!previousと!nextを
バインドしています。ページは1画面20行に区切られて表示されますが、Prev/Nextのリンクをクリックしても何も
起こりません。
同じサンプルをお試しになった方はいらっしゃいますか?
問題の解決方法をご存知の方、ご教示いただければ幸いに存じます。
previous、nextはStandardSetControllerのメソッドです。
(StandardSetControllerクラスについてはForce.com Apex Code Developer's Guideを参照してください。)
apex:dataListにバインドされているaccountPaginationに対してprevious、nextする場合は、accountPaginationが参照している
StandardSetController(accountRecords)に対して処理を要求しますので、
action="{!accountRecords.previous}"、action="{!accountRecords.next}"
になります。
All Answers
解決ではないのですが…とりあえずVisualforce上の<APEX:page~からextensionsを削除し、
<APEX:dataList~のvalueをaccountsに変更するとページングは機能するようになります。
もちろん、APEXコードでの検索条件は無効になります…当たり前ですが。
わからないのは、例えば動いている状態でも動いていない状態でもVisualforce上で
actionにバインドした!previousのスペルを変更すると 「不明なメソッド」になります。
なので、このactionが何らかのメソッドと関連付けられているのは間違いないようですが…。
なお、getterでreturnのかわりに代入文に直しても状況は変わりません。
さて次に何を試したものか…。
こんにちわ。
できれば実際に書いたVFPageとControllerのソースをあげてみてください。
なかなか想像しにくいところがありますし、
以前にやった方も、ソースを見れば思い出すかと思います。
ご指摘ありがとうございます。そうですね、おっしゃる通りです。
…で…insert codeで貼ろうとしているのですが…改行が処理されず修正中です。
試行錯誤中のものをご覧になった方、申し訳ございません。
#テキストモードだとemoticonに自動変換されてしまうし…
にkkurahashiにより編集されたメッセージ にkkurahashiにより編集されたメッセージソースを貼ります。
#Salesforce.com, "Visualforce Developer's Guide" page 62-63掲載のソースリスト
<apex:page standardController="Account" recordSetvar="accounts"
extensions="AccountPagination">
<apex:pageBlock title="Viewing Accounts">
<apex:form id="theForm">
<apex:pageBlockSection >
<apex:dataList var="a" value="{!accountPagination}" type="1">
{!a.name}
</apex:dataList>
</apex:pageBlockSection>
<apex:panelGrid columns="2">
<apex:commandLink action="{!previous}">Previous</apex:commandLink>
<apex:commandLink action="{!next}">Next</apex:commandLink>
</apex:panelGrid>
</apex:form>
</apex:pageBlock>
</apex:page>
public class AccountPagination {
private final Account acct;
public AccountPagination(ApexPages.StandardSetController controller) {
this.acct = (Account)controller.getRecord();
}
public ApexPages.StandardSetController accountRecords {
get {
if (accountRecords == null) {
accountRecords = new ApexPages.StandardSetController(
Database.getQueryLocator(
[SELECT name FROM Account WHERE bushoMei__c like '2%']
));
}
return accountRecords;
}
private set;
}
public List<Account> getAccountPagination() {
return (List<Account>)accountRecords.getRecords();
}
}
#Insert codeにそのままコピペすると改行が正しく処理されないので、
#その場合は一度メモ帳などを経由してからペーストすると良です。
なお、一つ上に余計なメッセージを残してしまい申し訳ありません。プレビュー機能に気づきませんでした…。
どうぞよろしくお願い致します。
にkkurahashiにより編集されたメッセージprevious、nextはStandardSetControllerのメソッドです。
(StandardSetControllerクラスについてはForce.com Apex Code Developer's Guideを参照してください。)
apex:dataListにバインドされているaccountPaginationに対してprevious、nextする場合は、accountPaginationが参照している
StandardSetController(accountRecords)に対して処理を要求しますので、
action="{!accountRecords.previous}"、action="{!accountRecords.next}"
になります。
ありがとうございます、解決致しました。
なるほど、extension下のスコープがどうなっているのか気になってはいたのですが、
これですっきりしました。
お手数をおかけしました。今後ともよろしくお願い致します。
#テキストのソースを直しておいてくださいね>Salesforceさん
そういえば、PDF掲載のAPEXソースコードにはもう一箇所誤りがあります。
getter内の初期化コードが
return new ApexPages.StandardSetController(Database.getQueryLocator(
となっていますが、ここはもちろん、
accountRecords = new ApexPages.StandardSetController(Database.getQueryLocator(
でないと、上とは別の理由でページングが実行されません。
蛇足ですが…。