2011-01-26 63 views
1

Primefaces Datatableで行を選択する際に問題があります。私は動的な列を使用するので、標準の行選択メカニズムはここでは使用できません。自分でチェックボックスの選択を実装します。jsfデータテーブル行の選択問題

<h:form> 
    <p:dataTable id="table" 
       var="result" 
       value="#{tableBean.results}"> 

    <p:columns value="#{tableBean.columnNames}" var="column" columnIndexVar="colIndex"> 
     <f:facet name="header"> 
     #{column} 
     </f:facet> 

     <h:panelGroup rendered="#{colIndex==0}"> 
     <h:outputLabel>#{rowIndex}</h:outputLabel> 
     <h:selectBooleanCheckbox value="#{tableBean.selectedRows[result[0]]}"/> 
     </h:panelGroup> 
    </p:columns> 
    </p:dataTable> 
    <h:commandButton value="Submit"></h:commandButton> 
</h:form> 

そして、ここでは、私がチェックボックスを選択し、マネージドBeanに持っているものです::

package testpackage; 

import java.util.*; 
import javax.faces.bean.*; 

@ManagedBean 
@SessionScoped 
public class TableBean 
{ 

    private Map<String, Boolean> selectedRows = new HashMap<String, Boolean>(); 
    List<List<String>> results = new LinkedList<List<String>>(); 

    public TableBean() 
    { 
    List<String> row1 = new LinkedList<String>(); 
    List<String> row2 = new LinkedList<String>(); 
    row1.add("row1.ref"); 
    row1.add("row1.id"); 
    row1.add("row1.status"); 
    row2.add("row2.ref"); 
    row2.add("row2.id"); 
    row2.add("row2.status"); 
    results.add(row1); 
    results.add(row2); 

    //selectedRows.put("row2.ref", true); 
    } 

    public Map<String, Boolean> getSelectedRows() 
    { 
    return selectedRows; 
    } 

    public String submit() 
    { 
    List<List<String>> selectedResults = new ArrayList<List<String>>(); 
    for (List<String> result : results) 
    { 
     if (selectedRows.get(result.get(0)) != null) 
     { 
     selectedResults.add(result); 
     selectedRows.remove(result.get(0)); 
     } 
    } 

    return null; 
    } 

    public List<List<String>> getResults() 
    { 
    return results; 
    } 

    public List<String> getColumnNames() 
    { 
    List<String> columnNames = new LinkedList<String>(); 
    columnNames.add(""); 
    columnNames.add("REF"); 
    columnNames.add("ID"); 
    columnNames.add("STATUS"); 
    return columnNames; 
    } 
} 

getSelectedRows方法支援するため

、ここで私は私のXHTMLで持っているものの簡易版がsです素晴らしいですが、問題は、setSelectedRowsメソッドが呼び出されないため、ユーザーが選択したチェックボックスがわからないことです。おそらく私は何か非常に些細なことを見落としているかもしれませんが、解決策を見つけることはできません。

これに関するご意見はありますか?私が助けてくださった場合、あるいは動的列のための他の行選択ソリューションを提供していただければ幸いです。事前に

Thxを、 レヴィ

答えて

1

私にはあなたがselectBooleanCheckBoxに間違ったフィールドをレンダリングしているに見えます。
result変数の変数またはフィールドを使用する必要があります。
マイソリューション:あなたには、いくつかの変更を行い、その行のステータスを取得する場合、あなたはそのオブジェクトからの変数を使用する必要がありますので、あなたがテーブルの行の形式として一覧からオブジェクトをレンダリングしている状況で
のみ。

フォーム全体を送信していて、すべての更新された行を取得したいと思います。この場合、リスト全体をループして、要求ハンドラのステータスを確認して更新されたすべての行を見つけなければなりません) 豆。

希望に役立ちます。

1

セッターはネストされたオブジェクトに対しては決して呼び出されません。あなたはJSFではなく、それらを作成する責任があります。 JSFはネストされたオブジェクトを取得し、その上でセッターを呼び出します(Mapの場合はput()メソッド)。アクションメソッドで選択した行を決定するだけで済みます。コマンドボタンにアクションメソッドを追加しますようにdefiniedさ

<h:commandButton value="Submit" action="#{bean.submit}"></h:commandButton> 

は(var="result"は、本質的にObject[]あると仮定/推測)は以下:

public String submit() { 
    List<Object[]> selectedResults = new ArrayList<Object[]>(); 
    for (Object[] result : results) { 
     if (selectedRows.get((String) result[0])) { 
      selectedResults.add(result); 
      selectedRows.remove(result[0]); // Reset. 
     } 
    } 

    // Now selectedResults contains all selected results. 
} 
+0

「私はあなたのソリューションを試してみましたが、selectedRowsはまだdoesnの関数が呼び出されるまでに新しい値でいっぱいになります。選択したチェックボックスにはいつ時間がかかりますか? – Levi

+0

更新中のモデル値フェーズです。あなたは 'getSelectedRows()'がうまくいくとあなたは言った。確実にするには、アクションメソッドの前に*呼び出されていますか? ( 'submit()'メソッド)。 – BalusC

+0

はい、getSelectedRows()は呼び出されますが、setSelectedRows()は呼び出されないため、selectedRows Mapは塗りつぶされません。 – Levi