PrimeFaces:DataTable多选不起作用

时间:2012-05-07 10:21:18

标签: jsf jsf-2 primefaces facelets mojarra

我似乎没有在PrimeFaces dataTables中进行多项选择。

我正在尝试实现一个客户列表(dataList)并在嵌套的dataTables中显示它们各自的预订,并可以选择多个预订进行计费:

<p:dataList value="#{clientController.allClients}" var="client">
<p:column>
    <p:dataTable value='#{client.bookingsDataModel}' var='item' selection="#{client.bookingsToBill}">
        <p:column selectionMode="multiple" />
    </p:dataTable>
</p:column>
</p:dataList>

我的控制器和支持bean类:

public class ClientController {
    public List<Client> getAllClients() {
        return clients;
    }
}

public class Client {

    private List<Booking> bookings;
    private Booking[] bookingsToBill;

    public LeistungDataModel getBookingsDataModel() { 
        return new BookingsDataModel(bookings); 
    }

    public Booking[] getBookingsToBill() { 
        return bookingsToBill; 
    }

    public void setBookingsToBill(Booking[] bookingsToBill) { 
        this.bookingsToBill = bookingsToBill;
    }

}

数据模型类:

public class BookingsDataModel extends ListDataModel<Booking> implements SelectableDataModel<Booking> {    

    public BookingsDataModel(List<Booking> data) {  
        super(data);  
    }  

    @Override  
    public Booking getRowData(String rowKey) { 
        List<Booking> bookings = (List<Booking>) getWrappedData();
        for(Booking booking : bookings) {  
            if(("booking_"+booking.getId().toString()).equals(rowKey)) {
                return booking;
            } 
        }
        return null;  
    }  

    @Override  
    public Object getRowKey(Booking booking) {  
        return "booking_"+booking.getId().toString();  
    }

}

当我使用我的选择提交表单时,浏览器会将以下数据发布到服务器:

j_idt9%3Aj_idt13%3A0%3Aj_idt15_selection:booking_300,booking_301,booking_302
j_idt9%3Aj_idt13%3A1%3Aj_idt15_selection:booking_566,booking_567
j_idt9%3Aj_idt13%3A2%3Aj_idt15_selection:

另外,我在调试期间发现getRowData的{​​{1}}方法返回正确的BookingsDataModel个对象(选定的对象)。

但是,总是将空数组传递给BookingsetBookingsToBill个对象。这里可能出现什么问题?


更新

空数组仅传递第一个Client个对象 - 如果已选择预订则无关紧要。调用所有其他Client个对象的Client方法,参数值为setBookingsToBill

2 个答案:

答案 0 :(得分:0)

不是真的,如果你想要复选框的多选,你必须像jfs那样做:

在展示中有一个例子显示了这一点。它将创建一个包含用户可以选择的框的列。您也可以使用p:dataTable的属性执行操作,但是这不会创建框,用户必须控制+单击才能执行多个选择。

答案 1 :(得分:-3)

selectionMode应该是<p:dataTable>标记的一部分。

以下是展示的链接,其中有一个示例。 http://www.primefaces.org/showcase/ui/datatableRowSelectionMultiple.jsf