0

オブジェクトのリストを反復処理する dataGrid があります。各グリッドには、バッキング Bean で選択されたオブジェクトの Id を配置しようとする commandButton とタグがありますが、アクションが実行され、プロパティのセッター メソッドでも、値は 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>

バッキング Bean で:

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;
}

ありがとう。

編集: Bean のコード (無関係なメソッドを削除しました)。

/* 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);
}
}

更新しました

dataGrid は、datatable 内の rowExpansion タグ内にあります。dataGrid を datatable にネストするのではなく、外側に配置すると機能することに気付きました。しかし、私はrowExpansionでそれをしたい.

含まれているtabViewの外にデータグリッドを配置した場合にのみ機能します。

4

1 に答える 1

2

CatalogoCentros に関するいくつかの質問:

  1. idフィールドは BigDecimal ですか?
  2. hashCode と equals をオーバーライドしましたか?

質問 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;
}

equalsメソッドにブレークポイントを設定し、dataGrid で何かを選択したときにそれがトリップするかどうかを確認します。

于 2013-08-30T14:02:05.967 に答える