2011-01-26 97 views
1

我在Primefaces Datatable中選擇行時遇到問題。我使用動態列,所以標準行選擇機制在這裏不可用,我自己實現複選框選擇。jsf數據錶行選擇問題

幫助,這裏有S的是我有我的XHTML簡化版本:

<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方法效果很好,但問題是setSelectedRows方法永遠不會被調用,所以我不知道用戶選擇了哪個複選框。也許我忽略了一些非常微不足道的東西,但找不到解決方案。

對此的任何想法?如果您幫助過,或者爲動態列提供任何其他行選擇解決方案,我將非常高興。

Thx提前, 列維

回答

1

對我來說,它看起來你是渲染selectBooleanCheckBox錯誤的領域。
您應該使用result變量中的變量或字段。
我的解決辦法:
在你的情況,你從名單上呈現對象爲錶行的形式,所以如果你想做出一些改變,並檢索該行的狀態,那麼你應該使用變量從該對象只要。

我知道你正在提交整個表單,並希望獲取所有更新的行,在這種情況下,你將不得不遍歷整個List,並通過檢查Request Handler中的狀態來查找所有已更新的行) 豆。

希望有所幫助。

1

setter永遠不會被調用嵌套對象。你是負責創建它們的人,而不是JSF。 JSF只是獲取嵌套對象,然後調用setter(在Map的情況下爲put()方法)。您只需確定操作方法中的選定行。操作方法添加到命令:

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

這是definied像如下(猜/假設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仍然沒有按」在函數被調用的時候,新的值將被填充。他們什麼時候應該填寫選定的複選框? – Levi 2011-01-27 14:27:40