オブジェクトのリストを反復処理する 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の外にデータグリッドを配置した場合にのみ機能します。