PrimeFaces Datatable:如何接收选定的行值?

问题描述 投票:2回答:2

已编辑:未提供完整信息。

我使用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"属性,但似乎他们做了不同的行动。

那么,您能举例说明如何从事件对象中检索此类数据吗?我应该用另一种方法来解决它吗?感谢您提前的答案。

primefaces jsf-2
2个回答
1
投票

我想你在数据表上遗漏了一些东西。

展示: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}集合将自动填充所选行。


0
投票

您使用的是懒惰的dataTable,这不会保留页面更改的选择。

  1. 您需要使用您的集合类型设置selection param
  2. 在你的getRowKey中实施LazyDataModel并删除rowKey="#{ticket.id}"
  3. 选中复选框不需要selectionMode="multiple"。 当按下CTRL单击表格行时,此参数仅用于多个选择
  4. 我的建议是手动控制您选择的数据

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
© www.soinside.com 2019 - 2024. All rights reserved.