🌤️

【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