p:带分页器的dataTable:如何使用p:printer打印没有paginator的所有行

Bud*_*tne 1 printing datatable jsf paginator primefaces

<p:dataTable>with paginator中,我需要打印所有页面.当我使用<p:printer>并将数据表作为目标时,它只打印带有分页控件的第一页.如何打印表格的所有行<p:printer>

Ale*_*hin 6

好吧,我实际上能够以一种非常不愉快的方式实现所期望的行为.

首先,似乎p:printer只需从xhtml页面获取一个id元素并将其传递给打印机.因此,为了能够打印完整的表,首先应该重新渲染它.

我的想法是重新渲染没有分页器的表,刷新它并传递给打印机,之后恢复表的状态.为了能够这样做,我创建了两个按钮:一个触发表重新呈现,另一个将该表传递给打印机并恢复它的状态.

第一个按钮是可见的,是用户按下以打印的按钮.它调用deactivatePaginator()方法来禁用分页并准备打印表视图.第二个按钮是隐藏的,是包含p:printer组件的实际按钮.它调用该activatePaginator()方法来恢复表视图.

这是生成的xhtml页面:

<p:dataTable id="table" value="#{someBean.list}" var="str" paginator="#{someBean.paginatorActive}" rows="#{someBean.paginatorActive ? 10 : 0}">
    <p:column headerText="Header">
        <h:outputLabel value="#{str}"/>
    </p:column>
</p:dataTable>
<h:form id='frm'>
    <p:commandButton value="Print" actionListener="#{someBean.deactivatePaginator()}" 
                             oncomplete="$('#frm\\:print').click()"
                             update=":table"/>
     <p:commandButton id="print" value="Actual print" style="display: none">
         <p:ajax event="click" listener="#{someBean.activatePaginator()}" update=":table"/>
         <p:printer target=":table" />
     </p:commandButton>
</h:form>
Run Code Online (Sandbox Code Playgroud)

方法的实现非常简单.所有需要做的就是相应地设置paginatorActive标志.

@ViewScoped
@ManagedBean
public class SomeBean {

    private boolean paginatorActive = true;

    public void activatePaginator() {
        paginatorActive = true;
    }

    public void deactivatePaginator() {
        paginatorActive = false;
    }

    public boolean isPaginatorActive() {
        return paginatorActive;
    }
}
Run Code Online (Sandbox Code Playgroud)

所有这些疯狂都可以通过p:blockUI多表更新导致快速故障来解决.

建议使用此解决方案作为解决方法,我认为这不是一种正确的方法.但我也不认为还有另一种方法可以做到需要使用p:printer.

  • 对于您和所有未来的读者:所有Java代码都是不必要的.只需使用`paginator ="#{...}"rows ="#{...}"`而不是硬编码的值,那么你实际上根本不需要任何额外的bean逻辑(10k用户可以看到一个例子那). (5认同)
  • 我已经编辑了我的答案,以实现BalusC提出的更清晰,更简单的解决方案 (2认同)