+ Start a Discussion
k_ogawak_ogawa 

選択リストをチェックボックスで表示

お世話になっております。

現在、visualforce、apexを使用し、画面開発中なのですが、
カスタム項目で設定している選択リストの内容をチェックボックスで画面表示して、
チェックされたものを基にデータを作成しようとしています。

ネットで仕様に沿った処理方法を探しながら作成しているのですが、なかなか見つからず
こちらに頼ることにしました。
どなたか、ご教授よろしくお願い致します。
Best Answer chosen by k_ogawa
Shingo YamazakiShingo Yamazaki
k_ogawaさん

山﨑と申します。

以下のようなコードではいかがでしょうか。

<Apex>
public class PicklistController {

	public List<String> selections = new List<String> {};

	public List<String> getSelections() {
		return selections;
	}

	public void setSelections(List<String> values) {
		this.selections = values;
	}

	public List<SelectOption> getOptions() {
		List<SelectOption> options = new list<SelectOption>();

		Schema.DescribeFieldResult fieldResult = MyObj__c.PicklistValues__c.getDescribe();
		List<Schema.PicklistEntry> pickListEntry = fieldResult.getPicklistValues();
		for (Schema.PicklistEntry pick: pickListEntry) {
			options.add(new selectOption(pick.getValue(), pick.getLabel()));
		}
		return options;
	}

	public PageReference save() {
		System.debug(LoggingLevel.INFO, this.selections);
		return null;
	}
}


<Visualforce>
<apex:page controller="PicklistController">
    <apex:form >
        <apex:selectCheckboxes value="{!selections}" >
            <apex:selectOptions value="{!options}"/>
        </apex:selectCheckboxes>
        <apex:commandButton value="button" action="{!save}" />
    </apex:form>
</apex:page>

上記サンプルでは、カスタムオブジェクトMyObj__cにある選択リスト項目PicklistValues__cの値を取得し
チェックボックスを表示してます。


All Answers

Shingo YamazakiShingo Yamazaki
k_ogawaさん

山﨑と申します。

以下のようなコードではいかがでしょうか。

<Apex>
public class PicklistController {

	public List<String> selections = new List<String> {};

	public List<String> getSelections() {
		return selections;
	}

	public void setSelections(List<String> values) {
		this.selections = values;
	}

	public List<SelectOption> getOptions() {
		List<SelectOption> options = new list<SelectOption>();

		Schema.DescribeFieldResult fieldResult = MyObj__c.PicklistValues__c.getDescribe();
		List<Schema.PicklistEntry> pickListEntry = fieldResult.getPicklistValues();
		for (Schema.PicklistEntry pick: pickListEntry) {
			options.add(new selectOption(pick.getValue(), pick.getLabel()));
		}
		return options;
	}

	public PageReference save() {
		System.debug(LoggingLevel.INFO, this.selections);
		return null;
	}
}


<Visualforce>
<apex:page controller="PicklistController">
    <apex:form >
        <apex:selectCheckboxes value="{!selections}" >
            <apex:selectOptions value="{!options}"/>
        </apex:selectCheckboxes>
        <apex:commandButton value="button" action="{!save}" />
    </apex:form>
</apex:page>

上記サンプルでは、カスタムオブジェクトMyObj__cにある選択リスト項目PicklistValues__cの値を取得し
チェックボックスを表示してます。


This was selected as the best answer
k_ogawak_ogawa
山﨑 様

コードサンプルまで頂きありがとうございます。

早速サンプルを基に作りかけのソースにコードを当てはめてみたのですが、
エラーになってしまいました。

Visualforceの方には、

<apex:selectCheckboxes value="{!selections}" >
      <apex:selectOptions value="{!seloptions}"/>
</apex:selectCheckboxes>

上記の部分のみ追記したのですが、
<apex:selectOptions value="{!seloptions}"/>
この部分がエラーになってしまうようです。

エラー内容は『File only saved locally, not to server』のみで何が間違っているのか検討もつきません。
まだほとんどVisualforce、Apexについて理解できていないので、これはダメ!というルールがわからずに
開発を行っています。
apex:selectOptionsは一度しか使えないなどのルールがあるのでしょうか?


※『options』という定義は既に同じコントローラー内で使用している為、『seloptions』に
変更しました。

Shingo YamazakiShingo Yamazaki
開発環境はどのようなツールをお使いでしょうか?(Force.com IDE, Force.com Migration Tool, Eclipseなど)
エラーメッセージで検索した限り、Force.com IDEかと思われますが...

apex:selectOptionsは一度しか使えない、というルールは聞いたことがないのですが、
問題の切り分けのため、以下を試してみてはいかがでしょうか?

1. デプロイしている開発環境にログインし、該当のVisualforceを直接編集する。
書き方におかしな部分があれば、保存時にエラーが出るはずです。

2. (開発環境がForce.com IDEならば)該当のファイルを右クリックし、「Force.com > Save to Server」を実行する。
k_ogawak_ogawa
山﨑 様

開発環境はおっしゃる通り、Force.com IDEを使用しております。

1を試した結果、『Error: 不明なプロパティ「AccountStandardController.seloptions」』と表示されました。
standardControllerには標準オブジェクトの"Account"を指定しています。

2を試した結果、反映されませんでした。(エラーがあると反映してくれないようです。)

1が原因だということはわかったのですが、この変数名は使えないということで怒られているのでしょうか・・・

standardControllerに"Account"を指定しているにもかかわらず、カスタムオブジェクトの選択リストを表示しようとしているから
怒られているのでしょうか?

同じコントローラ内で指定したoptionsは問題なく使えてるようです。

Shingo YamazakiShingo Yamazaki
変数seloptionsはカスタムコントローラ内で定義されておりますでしょうか?

サンプルコードにもありますように、カスタムコントローラ内でgetSelOptions()というメソッドが用意されていること、
かつそれがデプロイされていることを(ローカルではなく開発組織内で)確認いただけますでしょうか。
k_ogawak_ogawa
>>カスタムコントローラ内でgetSelOptions()というメソッドが用意されていること
上記の処理がされていませんでした。
お陰様でチェックボックスを表示することが出来ました。
本当にありがとうございます。

何度も質問してしまい申し訳ありませんが、もうひとつ伺ってもよろしいでしょうか?

選択リストのリスト数が多く、チェックボックス表示にするとすべて横に表示されてしまうのですが、
チェックボックスが5個表示されたら折り返しといったようなことは出来るのでしょうか?

k_ogawak_ogawa
もうひとつ追加で質問させてください。

チェックボックスで選択されたデータは
[a,b,c,d]
のように保持されると思いますが、
これを別々のレコードにしたい場合はどのようにすればよいでしょうか?

よろしくお願い致します。
k_ogawak_ogawa
上記は私の勘違いでした。
無事解決しました。

画面に表示されるチェックボックスの折り返し表示に関してはアドバイス募集中です。

Shingo YamazakiShingo Yamazaki
すみません、返信が遅れてしまいました。

少々調べてみましたが、
一定数おきにチェックボックスを折り返すというのは
簡単には実現ができないように思われます。

次善策として、<apex:selectCheckboxes>のオプションにlayout="pageDirectionを指定すると
チェックボックスが縦に並ぶようになります。

http://www.salesforce.com/us/developer/docs/pages/Content/pages_compref_selectCheckboxes.htm

(1個ずつ折り返すので、期待されている動作とは違いますが...)


後は、
(1) CSSでチェックボックスを表示するコンポーネントの最大幅を指定する
(2) JavascriptでDOMのレイアウトを操作する

などといった方法が考えられますが、こちらは具体的な方法については未確認です。
k_ogawak_ogawa
山﨑 様
お世話になっております。

わざわざお調べ頂き感謝いたします。
次善策として教えて頂きました、"pageDirection"を指定し縦並びとし、<apex:pageBlock>のmode="contact"とすることで
何とか解決できました。

貴重なお時間頂きまして、ありがとうございました。
また、質問することが多々あるかと思うので、そのときは是非よろしくお願いいたします。

Shingo YamazakiShingo Yamazaki
k_ogawaさん

ご丁寧にありがとうございます。
無事に解決したとのことで、何よりです。

よろしければベストアンサーを選択の上、
本件をクローズしていただけますようお願いします。

また別なご質問の際にお力になれれば幸いです。
よろしくお願いします。