p:dataTable with paginator: 如何在没有分页器的情况下使用 p:printer 打印所有行
p:dataTable with paginator: how to use p:printer to print all rows without paginator
在带有分页器的 <p:dataTable>
中,我需要打印所有页面。当我使用 <p:printer>
并将数据 table 作为目标时,它只打印带有分页控件的第一页。如何用 <p:printer>
打印 table 的所有行?
好的,我实际上能够实现所需的行为,但是以一种非常不愉快的方式。
首先,p:printer
似乎只是通过 id 从 xhtml 页面获取一个 DOM 元素并将其传递给打印机。因此,为了能够打印完整的 table 它首先应该重新渲染。
我的想法是在没有分页器的情况下重新渲染 table,刷新它并传递给打印机,然后恢复 table 的状态。为了能够做到这一点,我创建了两个按钮:一个触发 table 重新渲染,另一个将此 table 传递给打印机并恢复其状态。
第一个按钮可见,是用户按下以进行打印的按钮。它调用 deactivatePaginator()
方法来禁用分页并准备 table 视图以供打印。
第二个按钮是隐藏的,是包含 p:printer
组件的实际按钮。它调用 activatePaginator()
方法来恢复 table 视图。
这是生成的 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>
方法的实现很简单。所需要做的就是相应地设置 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
可以解决所有这些疯狂问题,因为多个 table 更新会导致快速故障。
此解决方案是作为解决方法提出的,我认为这不是正确的处理方法。但我也不认为还有另一种方法可以使用 p:printer
.
来完成所需的操作
在带有分页器的 <p:dataTable>
中,我需要打印所有页面。当我使用 <p:printer>
并将数据 table 作为目标时,它只打印带有分页控件的第一页。如何用 <p:printer>
打印 table 的所有行?
好的,我实际上能够实现所需的行为,但是以一种非常不愉快的方式。
首先,p:printer
似乎只是通过 id 从 xhtml 页面获取一个 DOM 元素并将其传递给打印机。因此,为了能够打印完整的 table 它首先应该重新渲染。
我的想法是在没有分页器的情况下重新渲染 table,刷新它并传递给打印机,然后恢复 table 的状态。为了能够做到这一点,我创建了两个按钮:一个触发 table 重新渲染,另一个将此 table 传递给打印机并恢复其状态。
第一个按钮可见,是用户按下以进行打印的按钮。它调用 deactivatePaginator()
方法来禁用分页并准备 table 视图以供打印。
第二个按钮是隐藏的,是包含 p:printer
组件的实际按钮。它调用 activatePaginator()
方法来恢复 table 视图。
这是生成的 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>
方法的实现很简单。所需要做的就是相应地设置 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
可以解决所有这些疯狂问题,因为多个 table 更新会导致快速故障。
此解决方案是作为解决方法提出的,我认为这不是正确的处理方法。但我也不认为还有另一种方法可以使用 p:printer
.