function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
masamasa 

データテーブル内の選択リストとテキストボックスについて

お世話になります。

 

今SOQLで取得したデータ(複数列、複数行)をデータテーブルで表示しています。

そのデータテーブル内には、選択リストとテキストボックスがあります。

 

今やりたい事は、選択リスト(OK/NG)から『OK』が選ばれた場合に、その行のテキストボックスに今日の日付を入れるようにしたいのですが、

どのように実装したら良いでしょうか?

 

JavaScriptで、選択リストのOnChangeイベントを使ったりしたのですが、そこからどう実装したら良いのかわからず・・・

 

また逆に、そのテキストボックスに日付が入力されたら、その行の選択リストを『OK』にするようにもしたいです。

(ポストバックを走らせる必要もある?)

 

わかりづらい説明で申し訳ございませんが、どなたかわかる方、または参考になるサイトがあったら教えてください。

KouheiKouhei

いくつかやり方がありそうな気がしますが、actionFunctionを使ったやり方を紹介します。

 

前提:Accountオブジェクトに選択リスト型のOKNG__c項目と、Date型のMyDate__c項目を追加してあるものとします。

 

まずVisualforce側。

<apex:page id="myPage" standardController="Account" recordSetVar="accounts" extensions="changeController">
<apex:form >
<apex:dataTable id="myTable" value="{!accounts}" var="account">
<apex:column value="{!account.Name}"/>
<apex:column >
<apex:inputField value="{!account.OKNG__c}" onchange="selectionChange('{!account.Id}');"/>
</apex:column>
<apex:column >
<apex:inputField value="{!account.MyDate__c}"/>
</apex:column>
</apex:dataTable>
<apex:actionFunction name="selectionChange" action="{!change}" reRender="myTable">
<apex:param name="firstparam" assignTo="{!changedId}" value="" />
</apex:actionFunction>
</apex:form>
</apex:page>

 

上記のように、actionFunctionを定義しています。

こうすることで、JavaScriptからコントローラのアクションを呼び出すことができるようになります。

引数を渡したい場合はparamタグで定義します。

 

その上で、選択リスト項目のonchangeに、actionFunctionで定義したfunction(ここではselectionChange)を呼び出すように記述します。

※引数がシングルクォーテーションで括られているのに注意。

 

 

そして拡張コントローラ↓

public with sharing class changeController {
public String changedId{get;set;}

private ApexPages.StandardSetController controller;

public changeController(ApexPages.StandardSetController controller) {
this.controller = controller;
}

 

//アクションメソッド
public void change(){
Account[] accounts = (Account[])controller.getRecords();
for(Account account:accounts){
if(changedId == account.Id){
if(account.OKNG__c == 'OK'){
account.MyDate__c = Date.today();
}
break;
}
}
}

}

 

actionFunctionからchangeメソッドが呼び出され、値が返られたAccountを探し出して日付をセットします。

(ここはもうちょっとスマートな書き方があるかもしれません)

 

逆のパターンは省略しましたが、同様のやりかたで出来るはずです。

 

 

以上でどうでしょうか?