已编辑:未提供完整信息。
我使用Prime Faces 6.2制作带有选中列的数据表。
<p:dataTable id="#{prefix}List"
value="#{tickets}"
lazy="true"
paginator="true"
paginatorTemplate="{FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
currentPageReportTemplate="{startRecord}-{endRecord} из {totalRecords}"
rows="20"
rowKey="#{ticket.id}"
var="ticket"
emptyMessage="Записи в данной категории отсутствуют">
<p:ajax event="toggleSelect" listener="#{ticketForm.onAllSelect}" process="@this" partialSubmit="true" />
<p:ajax event="rowSelectCheckbox" listener="#{ticketForm.onSelect}" update=":protocolForm" />
<p:ajax event="rowUnselectCheckbox" listener="#{ticketForm.onUnselect}" update=":protocolForm" />
<p:ajax event="rowSelect" listener="#{ticketForm.onSelect}" update=":protocolForm" />
<p:ajax event="rowUnselect" listener="#{ticketForm.onUnselect}" update=":protocolForm" />
<p:column selectionMode="multiple" style="width:40px; text-align:center" />
更具体地说,当选择标题复选框时,我希望在服务器端接收所有选定的行数据并使用每行的ID。此外,当选择至少一个复选框时,有一些逻辑有助于解决隐藏/呈现页面按钮的目标。为此,我需要手动拦截行/复选框选择事件,并在按下按钮时从中记录ID,因此我不能使用这样的逻辑使用dataTable的selection
属性。在服务器端,我有几个事件监听器。 :
private Set<AbstractMTSBUExportTicket> abstractMTSBUExportTickets = new HashSet<>();
public Set<AbstractMTSBUExportTicket> getAbstractMTSBUExportTickets() {
return abstractMTSBUExportTickets;
}
public void onSelect(SelectEvent event) {
abstractMTSBUExportTickets.add((AbstractMTSBUExportTicket) event.getObject());
}
public void onUnselect(UnselectEvent event) {
abstractMTSBUExportTickets.remove(event.getObject());
}
public void onAllSelect(ToggleSelectEvent event) {
// do smth
}
不幸的是,ToggleSelectEvent只包含有关数据表本身的信息。没有关于我找不到的行的信息。此外,我试图添加process="@this" partialSubmit="true"
属性,但似乎他们做了不同的行动。
那么,您能举例说明如何从事件对象中检索此类数据吗?我应该用另一种方法来解决它吗?感谢您提前的答案。
我想你在数据表上遗漏了一些东西。
展示:https://www.primefaces.org/showcase/ui/data/datatable/selection.xhtml
您需要添加selectionMode = multiple和selection = collection来收集所选行,如...
<p:dataTable id="multipleDT"
var="car"
value="#{dtSelectionView.cars4}"
selectionMode="multiple"
selection="#{dtSelectionView.selectedCars}"
rowKey="#{car.id}">
每当您选择一行或多行时,#{dtSelectionView.selectedCars}集合将自动填充所选行。
您使用的是懒惰的dataTable,这不会保留页面更改的选择。
selection
paramgetRowKey
中实施LazyDataModel
并删除rowKey="#{ticket.id}"
selectionMode="multiple"
。
当按下CTRL单击表格行时,此参数仅用于多个选择XHTML文件:
<p:dataTable id="#{prefix}List"
value="#{tickets}"
lazy="true"
paginator="true"
var="ticket"
selection="#{ticketForm.selectedTickets}"
emptyMessage="Записи в данной категории отсутствуют">
<p:ajax event="toggleSelect"
listener="#{ticketForm.onAllSelect}" partialSubmit="true"/>
<p:ajax event="rowSelectCheckbox"
listener="#{ticketForm.onSelect}" update=":protocolForm"/>
<p:ajax event="rowUnselectCheckbox"
listener="#{ticketForm.onUnselect}" update=":protocolForm"/>
<p:ajax event="rowSelect"
listener="#{ticketForm.onSelect}" update=":protocolForm"/>
<p:ajax event="rowUnselect"
listener="#{ticketForm.onUnselect}" update=":protocolForm"/>
<p:column selectionMode="multiple" style="width:40px; text-align:center" />
<!--other p:columns-->
</p:dataTable>
管理豆:
public void onRowSelect(SelectEvent event) {
if (event != null && event.getObject() != null &&
event.getObject() instanceof Ticket) {
if (selectedTickets== null) {
selectedTickets= new ArrayList<Ticket>();
}
if (!selectedTickets.contains((Ticket) event.getObject())) {
selectedTickets.add((Ticket) event.getObject());
}
}
}
public void onRowUnselect(UnselectEvent event) {
if (event != null && event.getObject() != null &&
event.getObject() instanceof Ticket &&
selectedTickets != null && selectedTickets.contains((Ticket) event.getObject())) {
selectedTickets.remove((Ticket) event.getObject());
}
}
public void onAllRowsSelect(ToggleSelectEvent event) {
//This is the trick, you don't need receive a collection
if (event.isSelected()) {
selectedTickets = ticketService.getAllTickets();
} else {
selectedTickets = new ArrayList<Ticket>();
}
}
qazxsw poi执行qazxsw poi方法:
LazyDataModel
建议您的服务。延迟dataTables的通用方法:
getRowKey