2013-08-29 2 views
0

개체 목록을 반복하는 dataGrid가 있습니다. 각 그리드에는 commandButton과 backing 빈에서 선택된 객체의 ID를 넣으려고하는 태그가 있지만 액션이 실행될 때와 속성의 setter 메소드에서도 값이 null입니다. 백킹 빈에서Primefaces : setPropertyActionListener. 매개 변수가 null 값을 가져옵니다.

<p:dataGrid var="element" value="#{CentroController.profiles}" columns="3" 
rows="10" paginator="true" paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" > 
    <p:panel header="#{CentroController.getDescripcionRoot(element)}" style="text-align:center"> 
    <h:panelGrid columns="2" style="width:100%"> 

     <p:panel> 
      <p:commandButton value="Borrar perfil" icon="ui-icon-trash" update=":form:tabView:profileButtonPanel" action="#{CentroController.deletePerfil}"> 
       <f:setPropertyActionListener value="#{element.id}" target="#{CentroController.selectedItemId}" /> 
      </p:commandButton> 
      </p:panel> 
     </h:panelGrid> 
    </p:panel> 
</p:dataGrid> 

:

세터가 호출
public void deletePerfil() 
{ 
    System.out.println("SELECTED ITEM ID: " + this.selectedItemId); 
    // selectedItemID is always null 
} 

, 값도 null입니다 :

public void setSelectedItemId(BigDecimal selectedItemId) { 

    System.out.println(selectedItemId); // Value is null 
    this.selectedItemId = selectedItemId; 
} 

감사

여기 내 코드입니다.

편집 : 콩 코드 (관련없는 메소드를 삭제했습니다).

/* imports */ 

@Named("CentroController") 
@SessionScoped 

public class CentroController implements Serializable{ 

private @Inject CentrosDAO dao; 
private @Inject CentrosCanalesDAO daoServicios; 
private @Inject CatalogoCentrosLaboratorioDAO habitualLabDAO; 
private @Inject CatalogoCentrosRadiologiaDAO habitualRadDAO; 

private List<Centros> centros; 
private Centros selectedCentro; 
private List<CentrosCanales> selectedCanales=new ArrayList<CentrosCanales>(); 

private List<CentrosCanales> listado; 
private CentrosCanales selected; 
private CatalogoCentros selectedItem; 
private BigDecimal selectedItemId; 
private TreeNode root; 
private DualListModel<Catalogo> listCatalogo; 
private DualListModel <Catalogo> listCatalogoLabHabitual; 
private DualListModel <Catalogo> listCatalogoRadHabitual; 

private CatalogoCentros perfilNuevo=new CatalogoCentros(); 
private @Inject CentrosCanalesDAO consulta; 
private @Inject CatalogoCentrosDAO consulta1; 
private @Inject CatalogoDAO consulta2; 

private boolean servicioIsSelected; //, perfilIsSelected, pruebaIsSelected; 

private List<CatalogoCentros> profiles; 

public CentroController() { 
} 

@PostConstruct 
public void init(){ 
    this.centros=dao.obtenListaCentros(); 
    servicioIsSelected = false; 
    //perfilIsSelected = false; 
} 

public BigDecimal getSelectedItemId() { 
    return selectedItemId; 
} 

public void setSelectedItemId(BigDecimal selectedItemId) { 

    System.out.println(selectedItemId); 
    this.selectedItemId = selectedItemId; 
} 

public void deletePerfil() 
{ 
    System.out.println("SELECTED ITEM ID: " + this.selectedItemId); 
} 
} 

UPDATED

데이터 격자는 데이터 테이블 내의 rowExpansion 태그 안에있다. DataGrid를 데이터 테이블에 중첩 대신 외부에 배치하면 작동한다는 것을 알았습니다. 하지만 나는 그것을 확장에서 원한다. 확장.

오직 작동합니다 내가 포함되어있는 tabView 외부에있는 DataGrid를 넣으면. CatalogoCentros에 대한

+0

값이 실제로 'null'인지 확인하려면''를 사용하십시오. – user1983983

+0

나는 이미 그 값을 예상했다. 감사합니다 – dhalfageme

+0

코멘트 : Bean은 SessionScoped입니다. – dhalfageme

답변

2

몇 가지 질문 :

  1. ID 필드를 BigDecimal인가?
  2. hashCode를 대체하고 같습니까?

이 "아니오"같은 것을 할 2 질문 :

@Override 
public int hashCode() { 
    return (id != null) ? id.intValue() : 0; 
} 

@Override 
public boolean equals(final Object obj) { 
    if (obj instanceof CatalogoCentros) { 
     CatalogoCentros item = (CatalogoCentros) obj; 
     return item.getId().equals(getId()); 
    } 

    return false; 
} 

방법과 동일하고 데이터 그리드에서 무언가를 선택할 때가 트립됩니다 있는지 당신에 중단 점을 설정합니다.

+0

안녕하세요. 1. 예, id는 BigDecimal입니다. 2. 아니요. 지금 무시했습니다. 명령 단추를 클릭하면 equals 메서드가 작동하지 않습니다 (DataGrid를 선택할 수 없음). id 및 전체 개체를 메서드의 매개 변수로 사용하려고 시도했지만 작동하지 않았습니다. 감사. – dhalfageme

관련 문제