+ Start a Discussion
yuuki_u_wafuyuuki_u_wafu 

pageBlockTable内でチェックしたレコード情報の取得について

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

 

pageBlockTable内に、チェックボックスの項目があります。

 

デフォルトではチェックはついておらず、チェックをしたレコードのみに

ある特定の処理を行いたいと考えています。

 

チェックをしたレコードを取得する方法はあるのでしょうか。

 

宜しくお願いします。

MFuruMFuru

下記のブログが参考になると思います。:smileywink:

 

http://blog.totalsoft.co.jp/archives/3017384.html

yuuki_u_wafuyuuki_u_wafu

ご回答ありがとうございます。

 

すいませんが、あまりapexが詳しくなく、教えて頂いたサイトを

確認しましたが理解できません。

 

単純にチェックボックスにチェックしたレコードのIDを取得するような

方法はありませんでしょうか。

 

申し訳ありませんが、宜しくお願いいたします。

MFuruMFuru

コントローラでチェックされたかどうか判定するためには、コントローラ側の変数とVisualforceの入力項目を紐付ける必要があります。

参考のサイトでは、チェックボックスは画面の処理でのみ必要で、値としてオブジェクトで保持する必要がないために、ラッパークラスを作成して、チェックボックスの値を取得しています。

 

もし途中まで作成されてるなら、ソースを上げて頂ければもう少しアドバイスできるかもしれません。

yuuki_uyuuki_u

ご回答ありがとうございます。

 

コードを乗せたかったのですが、他の代替案を使用したため

コードが残っておりません。(申し訳ありません・・・。)

 

代替案といたしましては、ボタンを使用してJavaScriptでそのレコードのIDを

テキストボックスなどに表示させて、最後にコントローラに渡すといったものです。

 

ちょっと面倒ですが自分がわかりやすい方法をとらせて頂きました。

 

色々とご教授頂き、ありがとうございました。

hiroji1020hiroji1020

すみません。このURLを参照しようと思ったのですが、今は使えないみたいです。この件の参考になる文献がありましたらShareいただけると助かります。

hiroji1020hiroji1020

Shareいただきありがとうございます。先週からShare頂いた資料を読みながらやっているのですが、どうしてもCheckした行を捕まえることができません。

アドバイスいただけると大変助かります。

 

ラッパークラス(?)の定義

global with sharing class StayLedgerDailyElement {
    // 選択
    public Boolean selected {get;set;}

 

VFORCEでの入力項目および入力制御

(コマンドボタン)

                  <apex:commandButton id="billrequest" action="{!billing}"  value="請求印刷" onClick="wopen('選択された行の請求処理を開始します。');" />

(Checkbox)

            <apex:repeat value="{!viewelements}" var="elem">
                <tr>
                    <th class="dailyTable rowheadfirst cell" style="vertical-align : right;">
                        <apex:inputCheckbox value="{!elem.selected}" id="selected1"

(Checkboxの制御)

        // EVENT: 請求チェック
        function onSeikyuCheck(thisObj) {
            var seikyuTable = document.getElementById('daicho');
            for (var i = 0; i < seikyuTable.rows.length; i++ ) {
                var row = seikyuTable.rows[i];
                var cell = row.cells[0];
                var chkObj = cell.childNodes[0];
        
                if (chkObj.id != thisObj.id) {
                    chkObj.checked = false;
                }
            }
        
            return true;
        }
        </script> 
    

 

 

APEXでの処理

    /**
     * 請求処理
     */

    public pagereference billing() { 
    
        string idSet = getSelectedSeikyuId();
            
        string pageurl = '/apex/apex/BillEdit?_lkid='+idSet;
        PageReference pageRef = new PageReference(pageurl);
        pageRef.setRedirect(false);
        return pageRef;
   }


    // 選択された入金レコードIDを取得する
    private string getSelectedSeikyuId() {
        string tmpid;
        for (StayLedgerDailyElement elem : viewelements ) {
            if (elem.selected == true) {
                tmpid = elem.oppoid;
                break;
            }
        }
        return tmpid;
    }

}

 

 

ここでSelectedの項目にチェックを立てた行はTrueになってくると思ったのですが、どうしてもFalseなので行を捕まえられないのです。

どこかおかしいんですよね・・・・ アドバイスお願いできないでしょうか?(スミマセン)

 

 

 

 

Taiki YoshikawaTaiki Yoshikawa

こんな感じの書き方で対応できないでしょうか。

 

Page

<apex:page controller="WrapperDemoController" title="WrapperDemoPage" showHeader="true" sidebar="false" id="page">
    <apex:form id="form">
        <apex:pageBlock id="block">
            <apex:pageMessages id="msg"/>
            <apex:pageBlockButtons >
<apex:commandButton value="Click!!" title="Click!!" action="{!doClick}" reRender="form" /> </apex:pageBlockButtons> <apex:pageBlockTable value="{!wrappers}" var="item"> <apex:column style="width:30px;"> <apex:inputCheckBox value="{!item.checked}" /> </apex:column> <apex:column headerValue="{!$ObjectType.Account.Fields.Name.Label}"> <apex:outputText value="{!item.account.Name}" /> </apex:column> </apex:pageBlockTable> </apex:pageBlock> </apex:form> </apex:page>

 

Controller

public with sharing class WrapperDemoController {
	
    public List<Wrapper> wrappers {get; set;}
    private List<Account> accounts;
	
    /*
* コンストラクタ * @param : なし * @return : なし */ public WrapperDemoController() { this.accounts = [select id,Name from Account limit 200]; this.wrappers = getWrappers(this.accounts); } /* * Wrapperリスト取得 * @param : 取引先リスト [prmAccounts] * @return : Wrapperリスト */ private List<Wrapper> getWrappers(List<Account> prmAccounts) { List<Wrapper> wrappers = new List<Wrapper>(); for (Account account : prmAccounts) { wrappers.add(new Wrapper(account)); } return wrappers; } /* * Click!!ボタン処理 * @param : なし * @return : なし */ public void doClick() { for (Wrapper wrapper : this.wrappers) { if (wrapper.checked == true) { ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.INFO, wrapper.account.Name)); } } } /* * Wrapper Class */ public class Wrapper { public Boolean checked {get; set;} public Account account {get; set;} public Wrapper(Account prmAccount) { this.account = prmAccount; } } }

 

hiroji1020hiroji1020

ありがとうございます。参考いただいた資料を使って作成することができました。本当にご協力ありがとうございました。