如何以编程方式更改 p:dataTable 中 p:column 的渲染属性

Posted

技术标签:

【中文标题】如何以编程方式更改 p:dataTable 中 p:column 的渲染属性【英文标题】:How to programmatically change rendered attribute of a p:column in p:dataTable 【发布时间】:2014-06-01 12:27:49 【问题描述】:

在我的 facelets xhtml-view 中,我有一个 primefaces 数据表,我使用自制的 columnToggler-composite 动态隐藏和显示列。

我的第一个实现工作正常,并为绑定到服务器端 columModel 的所有可配置列使用显式渲染属性...

<p:dataTable id="myDataTable" ...>
  <p:column rendered="#bean.myColumnModel.isVisible('A Column name')" >
    ...
  </p:column>
  <!-- many other columns -->
</p:dataTable>

<my:columnToggler columnModel="#bean.myColumnModel" for="myDataTable" />

我想摆脱这些渲染属性,因为我已经知道哪些列是可配置的。以下是我在运行时更改数据表的方法:

private void renderColumnsInDataTable() 

    List columns = dataTable.getColumns();

    for (Iterator<Column> iterator = columns.iterator(); iterator.hasNext();) 

        ...

        if (isColumnConfigurable(columnName)) 

          column.setRendered(isVisible(columnName));

        
    

除了我在第一次调用时遇到问题之外,这可行。该方法必须在 dataTable 填充其列之后和 dataTable 首次呈现之前第一次调用。

我最初的想法是引入一个@FacesComponent,将我的columnToggler 绑定到这个@FacesComponent 并监听某些JSF 事件,但是例如使用这个实现,列只会在第二次调用时更新:

@FacesComponent(...)
public class ColumnTogglerComponent extends UINamingContainer

  @Override
  public void processEvent(ComponentSystemEvent event) throws AbortProcessingException  
   // will be triggered for a javax.faces.event.PostRestoreStateEvent
   // to late !
  

我可以在哪里调用 renderColumnsInDataTable?如何触发?

顺便说一句:我使用 PrimeFaces 4.0。

【问题讨论】:

【参考方案1】:

@ListenerFor(systemEventClass=PostAddToViewEvent.class) 
public class ColumnTogglerComponent extends UINamingContainer  
 ...

processEvent() 将被尽早调用。

【讨论】:

以上是关于如何以编程方式更改 p:dataTable 中 p:column 的渲染属性的主要内容,如果未能解决你的问题,请参考以下文章

如何更改默认 p:dataTable emptyMessage 消息

将样式应用于 p:datatable 中的 Header

如何在 p:dataTable 中使用 p:graphicImage 和 StreamedContent? [复制]

如何以编程方式更改 Access 中的选项?

如何从 p:dataTable 本身对 p:dataTable 进行 ajax 更新?

在 <p:ajax event="cellEdit"> 完成时更新整个 <p:dataTable>