0

データテーブル内の単一の行を選択しようとすると問題が発生します(私のコードは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>

バッキングビーン:

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

1 に答える 1

1

これは、属性が単一の要素ではなくのをselection指しているためです。属性でdatatableを使用しているため、バッキングBean内の単一の要素を指す必要があります。ArrayListProductoselectionMode="single"selected

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}" .../>

一般に、適切なゲッター/セッターは、次のようget<NameOfTheObject>になります。

public List<Producto> getObtenerProductos()
于 2012-12-03T06:00:13.850 に答える