2011-09-01 7 views
2

나는 <h:dataTable>을 사용하여 데이터베이스의 데이터를 나열합니다. 우리는 페이지에 많은 레코드를 가지고 있습니다. 이제 각 행에있는 체크 박스로 여러 레코드를 선택하고 싶습니다. 이것을 어떻게 할 수 있습니까?<h : selectBooleanCheckbox>를 사용하여 <h:dataTable>의 여러 행을 선택하는 방법

+0

가능한 복제 [JSF의 시간 사용 방법 : 시간과 selectBooleanCheckbox를 : dataTable 행당 하나의 개체를 만들 수 있습니까?] (http://stackoverflow.com/questions/2524514/how-to-use-jsfs-hselectbooleancheckbox-with-hdatatable-to-create-one-object-p) – BalusC

답변

5

귀하의 엔티티는 고유 한 기술 식별자 (예 : DB의 자동 증가 순서)가 잘 구성되어 있다고 가정합니다.

public class Entity { 

    private Long id; 
    // ... 
} 

그렇지 않은 경우 추가해야합니다.

그런 다음 표에 연결된 빈에 Map<Long, Boolean> 특성을 추가하십시오.

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

(preinitialization도 (게시물) 생성자, 당신을 위해 그것을 할 수 없습니다, 적어도 JSF를 한 곳에서 일어날 수 있으며, 세터가 필요, 오뿐만 아니라 그것을 게터를 제공하지 않습니다)

그런 다음 엔티티 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

관련 문제