🌤️
【Salesforce】selectListだと動くのにselectCheckBoxesにすると動かない
Q. selectListでうまく動いていたものをselectCheckBoxesに変えたところ動かなくなった
UIの都合上チェックボックス化したかったが、単にVisualforceを変更しただけでは動くようにならなかった。
エラーが出力されたりはしなかったため、手がかりがなく困った。
変更前
<apex:selectList value="{!selectedItems}" multiselect="true">
<apex:selectOptions value="{!options}" />
</apex:selectList>
変更後
<apex:selectCheckboxes value="{!selectedItems}" id="checkBoxes">
<apex:selectOptions value="{!options}"/>
</apex:selectCheckboxes>
apex:commanButtonをクリックしてもなんの反応もない。
A. valueに指定した変数を初期化すると動いた
selectCheckboxesのvalueに指定した変数を初期化すると動くようになった。
this.selectedItems = new List<String>();
selectListは選択された値を入れる変数が初期化されていなくても動く
が、
selectCheckBoxesは初期化しないと動かない
らしい。
修正前のコードは変数の初期化がされていなかったが、正常に動作していたためなかなか気づけなかった...
コード例
selectCheckBoxesで動く書き方

SelectCheckBox.vfp
<apex:page controller="SelectCheckBoxController" >
<apex:form>
<!-- チェックボックス -->
<apex:selectCheckboxes value="{!selectedItems}" id="checkBoxes">
<apex:selectOptions value="{!options}"/>
</apex:selectCheckboxes>
<!-- 選択結果を表示 -->
<apex:outputPanel id="result">
<apex:repeat var="selectedItem" value="{!selectedItems}">
<p>
{!selectedItem}
</p>
</apex:repeat>
</apex:outputPanel>
<!-- 送信 -->
<apex:commandButton value="Submit" action="{!submit}" reRender="result" />
</apex:form>
</apex:page>
SelectCheckBoxController.apxc
public with sharing class SelectCheckBoxController {
public List<String> selectedItems {get; set;}
public List<SelectOption> options {get; set;}
public SelectCheckBoxController() {
this.options = getOptions();
// ↓ selectCheckboxesでは初期化しないとうまく動かない
this.selectedItems = new List<String>();
}
public List<SelectOption> getOptions() {
List<SelectOption> options = new List<SelectOption>();
options.add(new SelectOption('option1','option1'));
options.add(new SelectOption('option2','option2'));
options.add(new SelectOption('option3','option3'));
return options;
}
public void submit() {
System.debug('Submitted!');
}
}
selectListで動く書き方

SelectCheckBox.vfp
<apex:selectList value="{!selectedItems}" multiselect="true">
<apex:selectOptions value="{!options}" />
</apex:selectList>
SelectCheckBoxController.apxc
public SelectCheckBoxController() {
this.options = getOptions();
// ↓ selectListでは初期化しなくても正常に動く!
// this.selectedItems = new List<String>();
}
Discussion