2011-09-01 40 views
2

選擇多行 我使用 <h:dataTable>來列出數據庫中的數據。我們在頁面中有很多記錄,現在我想用每行中的複選框選擇多個記錄。我怎樣才能做到這一點? 如何使用<h:selectBooleanCheckbox>

+0

的可能的複製[如何使用JSF的H:selectBooleanCheckbox與H: dataTable創建一個對象每行?](http://stackoverflow.com/questions/2524514/how-to-use-jsfs-hselectbooleancheckbox-with-hdatatable-to-create-one-object-p) – BalusC

回答

5

我假設你的實體是精心設計的,它具有唯一的技術標識符,例如數據庫中的自動增量序列。

public class Entity { 

    private Long id; 
    // ... 
} 

如果不是,則需要添加它。

然後,將Map<Long, Boolean>屬性添加到綁定到該表的Bean。

private Map<Long, Boolean> checked = new HashMap<Long, Boolean>(); 

(preinitialization也有可能發生在(後)構造函數,隨你挑,至少JSF你不會做它,哦,給它一個getter和,二傳手是沒有必要的)

然後,添加一個帶有複選框的列,該複選框通過實體ID作爲關鍵字映射到布爾值。現在

<h:dataTable value="#{bean.entities}" var="entity"> 
    <h:column> 
     <h:selectBooleanCheckbox value="#{bean.checked[entity.id]}" /> 
    </h:column> 
    ... 
</h:dataTable> 
<h:commandButton value="Delete" action="#{bean.delete}" /> 

,與刪除按鈕相關的操作方法,你可以收集並刪除選中的項目如下:

public void delete() { 
    List<Entity> entitiesToDelete = new ArrayList<Entity>(); 

    for (Entity entity : entities) { 
     if (checked.get(entity.getId())) { 
      entitiesToDelete.add(entity); 
     } 
    } 

    entityService.delete(entitiesToDelete); 
    checked.clear(); 
    loadEntities(); 
} 
+0

我明白了, 非常感謝您的回答 ! – xuanhung2401

+0

我有完全相同的代碼,但我在這一行得到一個NullPointerException'if(checked.get(entity.getId())){' – unleashed