在带有分页器的<p:dataTable>
中,我需要打印所有页面。当我使用<p:printer>
并将数据表作为目标时,它只打印带有分页控件的第一页。如何使用<p:printer>
打印表格的所有行?
答案 0 :(得分:6)
好吧,我实际上能够以非常不愉快的方式实现所期望的行为。
首先,似乎p:printer
只是通过xhtml页面中的id获取DOM元素并将其传递给打印机。因此,为了能够打印完整的表,首先应该重新渲染它。
我的想法是重新渲染没有分页器的表,刷新它并传递给打印机,之后恢复表的状态。为了能够这样做,我创建了两个按钮:一个触发表重新呈现,另一个将该表传递给打印机并恢复它的状态。
第一个按钮可见,是用户按下以打印的按钮。它调用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>
方法&#39;实现很简单。所有需要做的就是相应地设置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;
}
}
由于多个表格更新导致快速故障,p:blockUI
可以涵盖所有这些疯狂。
这个解决方案被提议作为解决方法,我不认为这是一种正确的做事方式。但我也不认为还有另一种方法可以使用p:printer
来完成所需的工作。