我在尝试选择数据表中的单行时遇到了一些麻烦(我无法弄清楚发生了什么,因为我的代码是基于primefaces展示的。)
首先使用结果匹配填充表,然后我尝试选择一行,最后尝试执行某个过程。当我尝试处理那一行时,问题出现了,没有一个实际的方法被调用。
<h:form id="form2">
<p:dialog header="Agregar Producto" widgetVar="dlgAgregarProducto" modal="true" width="800" height="300">
<h:outputText value="Código"/>
<h:inputText value="#{promocionController.strIdProducto}"/>
<h:outputText value="Nombre"/>
<h:inputText value="#{promocionController.strNombre}"/>
<p:commandButton id="btnBuscarProducto" value="Buscar" action="#{promocionController.buscarProductosIdNombre}" update="tableBusqueda"/>
<p:commandButton id="btnAgregarProducto" value="Agregar" action="#{promocionController.agregarProductos}" />
<p:dataTable id="tableBusqueda" var="prod" value="#{promocionController.obtenerProductos()}"
rowKey="#{prod.idProducto}" selection="#{promocionController.arrProductosSeleccionados}" selectionMode="single">
<p:column style="width:24%">
<f:facet name="header">
<h:outputText value="Código"/>
</f:facet>
<h:outputText value="#{prod.idProducto}"/>
</p:column>
<p:column style="width:24%">
<f:facet name="header">
<h:outputText value="Foto"/>
</f:facet>
<h:outputText value="foto"/>
</p:column>
<p:column style="width:24%">
<f:facet name="header">
<h:outputText value="Descripción"/>
</f:facet>
<h:outputText value="#{prod.descripcion}"/>
</p:column>
<p:column style="width:24%">
<f:facet name="header">
<h:outputText value="Marca"/>
</f:facet>
<h:outputText value=""/>
</p:column>
<p:column style="width:24%">
<f:facet name="header">
<h:outputText value="Modelo"/>
</f:facet>
<h:outputText value="#{prod.modelo}"/>
</p:column>
<p:column style="width:24%">
<f:facet name="header">
<h:outputText value="Precio"/>
</f:facet>
<h:outputText value="#{prod.precio}"/>
</p:column>
</p:dataTable>
</p:dialog>
</h:form>
支持bean:
@ManagedBean(name = "promocionController")
@SessionScoped
public class PromocionCO {
arrProductosPromocion = new ArrayList<Producto>();
arrProductosSeleccionados = new ArrayList<Producto>();
}
public void buscarProductosIdNombre() {
productoDAO = new ProductoDAO();
arrProductosBusqueda = new ArrayList<Producto>();
arrProductosSeleccionados = new ArrayList<Producto>();
// si la búsqueda es por nombre
if (strIdProducto.compareTo("") == 0) {
arrProductosBusqueda = productoDAO.obtenerProductosPorNombre(strNombre);
} // si la búsqueda es por id
else {
producto = productoDAO.obtenerProductoPorId(strIdProducto);
if (producto != null) {
arrProductosBusqueda.add(producto);
} else {
arrProductosBusqueda = null;
}
}
}
public void agregarProductos() {
for (int i = 0; i < arrProductosSeleccionados.size(); i++) {
arrProductosPromocion.add(arrProductosSeleccionados.get(i));
}
}
public ArrayList<Producto> obtenerProductos() {
return arrProductosBusqueda;
}
public ArrayList<Producto> getArrProductosSeleccionados() {
return arrProductosSeleccionados;
}
public void setArrProductosSeleccionados(ArrayList<Producto> arrProductosSeleccionados) {
if (arrProductosSeleccionados != null) {
this.arrProductosSeleccionados = arrProductosSeleccionados;
}
}
答案 0 :(得分:1)
这是因为您的selection
属性指向ArrayList
Producto
而不是单个元素。由于您使用的数据表为selectionMode="single"
,因此selected
属性应指向您的支持bean中的单个元素:
Producto selectedProducto;
public Producto getSelectedProducto() {
return selectedProducto;
}
public void setSelectedProducto(Producto producto) {
selectedProducto = producto;
}
最后,在dataTable selection
中指定此元素:
<p:dataTable id="tableBusqueda" var="prod" selectionMode="single"
value="#{promocionController.obtenerProductos}"
selection="#{promocionController.selectedProducto}">
现在选择一行后,将调用public void setSelectedProducto(Producto producto)
方法。
与具体问题无关,在指向支持bean中的值时,最好使用getter / setter方法:
<p:dataTable id="tableBusqueda" var="prod"
value="#{promocionController.obtenerProductos}" .../>
通常,在您的情况下,适当的getter / setter应该看起来像get<NameOfTheObject>
:
public List<Producto> getObtenerProductos()