我似乎没有在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
个对象(选定的对象)。
但是,总是将空数组传递给Booking
个setBookingsToBill
个对象。这里可能出现什么问题?
更新
空数组仅传递第一个Client
个对象 - 如果已选择预订则无关紧要。调用所有其他Client
个对象的Client
方法,参数值为setBookingsToBill
。
答案 0 :(得分:0)
不是真的,如果你想要复选框的多选,你必须像jfs那样做:
在展示中有一个例子显示了这一点。它将创建一个包含用户可以选择的框的列。您也可以使用p:dataTable的属性执行操作,但是这不会创建框,用户必须控制+单击才能执行多个选择。
答案 1 :(得分:-3)
selectionMode应该是<p:dataTable>
标记的一部分。
以下是展示的链接,其中有一个示例。 http://www.primefaces.org/showcase/ui/datatableRowSelectionMultiple.jsf