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
kthirokthiro 

リストボックスの選択項目をAPEX側で取得する方法

VisualforceページとAPEXにてアンケートサイトを作成しています。
作成途中でつまづいておりご助言頂ければ幸いです。

 

<想定している動作>
[1]はDB内のオブジェクトから項目を取得し、ユーザにはリストボックスで表示させます。

[2]
ユーザがリストボックス内から選択後に、登録ボタンを押し「アンケート回答結果オブジェクト」へ回答結果を
挿入するといった動作を想定しています。


<疑問点>
上記[2]でVisualforceページ上でユーザが選択した項目を
APEX側で取得する方法がわからない状態です。

拙いですがソースも記載させて頂きます。
何か取得するメソッドがあるのか、あるいは根本的に間違っているのか、
もしくは参考URLなどをご存じの方がいたらご指摘頂ければ大変助かります。


<Visualforceページのソース>
<apex:page controller="SelectOptionsTest" >
<apex:form >
  <!-- リストボックスを表示  -->
        <apex:selectList>
            <apex:selectOptions value="{!ListItems}"/>
        </apex:selectList><p/>

    <apex:commandButton action="{!doEntry}" value="登録" />
</apex:form>
</apex:page>


<Apexのソース>
doEntry部分が未解決です。
当初は、optionListListのgetValueメソッドで取得できるかと思いましたが、
ユーザが選択している項目を取得できなかったため、壁に当たっています。

public class SelectOptionsTest {
    private List<EnquetAnswerTable__c> ansList;
    private List<Selectoption> optionListList = new List<Selectoption>();
   
    private List<DebugMsg__c> DebugMsgList = new List<DebugMsg__c>(); //デバックメッセージ格納用
           
    /* ページ読み込み時に呼ばれる */
    public SelectOptionsTest (){
        this.ansList = [Select ID,NAME,e_sec__c , a_Answer__c
             From EnquetAnswerTable__c
                     ];
    }

    /* リストボックスに表示させる項目 回答候補の作成 */
    public List<SelectOption> getListItems() {
        //回答欄リストをSelectOptionのインスタンスに登録
        for(EnquetAnswerTable__c value : this.ansList){
            optionListList.add(new Selectoption(value.a_Answer__c, value.a_Answer__c));
        }      
        return optionListList; 
    }

    /* リスト・ラジオ・チェックボックスに表示させる項目 回答候補の作成 */
    /* 作成中です */
    public void doEntry() {
        String str = optionListList[0].getValue();  /* これでは選択された項目は取得できない */
       
        DebugMsgList.add(new DebugMsg__c(StrText__c = str));
        insert DebugMsgList;
    }


}

<アンケートの設問項目オブジェクトの内容 (EnquetAnswerTable__c)>
1 よい
2 かなりより
3 悪い
4 かなり悪い

 

ikouikou

この辺が参考になるのではないでしょうか。

 

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

 

サンプルではselectListが複数選択リストなので、"countries"が配列になっている点に注意してください。

 

kthirokthiro

ご返信ありがとうございました。
こちらの環境でリンク先のソースを実行してみたところ疑問がわきました。
もしご存じでしたらアドバイス頂ければと思います。

リンク先のソースでは、以下のsetメソッドとgetメソッドが定義されています。

public String[] getCountries() {
    return countries;
}
   
public void setCountries(String[] countries) {
    this.countries = countries;
}

VisualForceページの以下の個所からgetメソッド部分が呼ばれ、
リストボックス内の選択項目を取得していると理解しています。
<apex:selectOptions value="{!items}"/>

しかし、setメソッドが呼ばれるタイミングとしてはいつなのでしょうか?

 

PS:
マニュアルとしては以下3点を参考にしています。
setメソッドについて調べた限り特に記述が見当たらず困っています。
もし、私が見落としている個所等あったならご指摘頂ければ幸いです。
「Apex_language_reference_JP_v18_Beta」
「Visualforce Developer's Guide」
「Force.com Apex Code Developer's Guide」

ikouikou

んーと

 

<apex:selectList value="{!countries}" multiselect="true">
  <apex:selectOptions value="{!items}"/>
</apex:selectList>

selectOptionsの{!items}が画面作成時に呼んでいるのはこれで

        public List<SelectOption> getItems() {
            List<SelectOption> options = new List<SelectOption>();
            options.add(new SelectOption('US','US'));
            options.add(new SelectOption('CANADA','Canada'));
            options.add(new SelectOption('MEXICO','Mexico'));
            return options;
        }

 

selectListの{!countries}が画面作成時に呼んでいるのはこれで

        public String[] getCountries() {
            return countries;
        }

 値をセットする時に呼ぶのがこれです

        public void setCountries(String[] countries) {
            this.countries = countries;
        }

 

そこの紐付けの認識が間違っているのではないでしょうか。

細かいタイミングの話は私には分かりませんが、Controllerが動作する時にセットされるのだと思います。

ue123ue123
kthirokthiro

サンプルソースを色々いじってみましたが、
setメソッドは画面からユーザが選択する度に呼び出されているような動作に見えますね。

参考情報・ご助言等ありがとうございました。

勉強になりました。