Primefaces - 如何获取CellEditEvent的列

时间:2014-02-19 13:21:28

标签: java jsf jsf-2 primefaces

我正在使用primefaces 4。

我正在使用一个可编辑的表,当我编辑一个单元格时,调用一个侦听器方法传递一个CellEditEvent

喜欢这个

public void onCellEdit(CellEditEvent event) {  
    /*
     * The rowIndex here can be changed according to the sorting/filtering.

     * FilteredData starts as null, but primefaces initializes it, so you 
     * don't have to check for NPE here
     */
    int alteredRow = event.getRowIndex();
    UIColumn o = event.getColumn();

    System.out.println(this.filteredData.get(event.getRowIndex()).get(columns.get(0)));
}  

到目前为止,非常好。

该事件有一个getRowIndex()

但它没有getColumnIndex()。

相反,它有一个getColumn()方法,它返回一个UIColumn对象。

问题是,在调试时,我找不到获取任何列信息(名称,ID等)的方法

我可以破解该列有一些像这样的唯一ID

 <p:ajax event="cellEdit" listener="#{myMB.onCellEdit}"/>
 <c:forEach items="#{myMB.columns}" var="column" varStatus="loop">

    <p:column id="col#{loop.index}" headerText="#{column}" sortBy="#{column}" filterBy="#{column}" filterMatchMode="contains"/>

      <p:cellEditor>

       <f:facet name="output">
        <h:outputText value="#{dataRow[column]}" />
       </f:facet>

       <f:facet name="input">
        <p:inputText value="#{dataRow[column]}"  />
       </f:facet>

    </p:cellEditor>     

    </p:column>

 </c:forEach>               

但我仍然找不到从CellEditEvent

中检索列id的方法

因此,假设某个单元格中有行和列,我必须要求

如何在CellEditEvent中检索已编辑单元格的列?

PS。我觉得我错过了一些东西,因为没有人会在没有提供行和列的情况下创建单元格事件,对吗?

更新 - 似乎我可以获得像

这样的ID
org.primefaces.component.column.Column o = (org.primefaces.component.column.Column)event.getColumn();
不过,这对我来说似乎是个黑客。我仍然对更优雅的解决方案感兴趣; - )

3 个答案:

答案 0 :(得分:7)

您可以通过返回您传递的列标题来获取列。

在bean中你可以这样做:

public void onCellEdit(CellEditEvent event) {  

int alteredRow = event.getRowIndex();
String column_name;
column_name=event.getColumn().getHeaderText();

 // now you can use this to identify the column we are working on.

}

使用getColumnId()或getColumnKey()返回列Id但添加了primefaces代码 - 使其难以使用。

答案 1 :(得分:0)

如果您使用p:columns而不是p:column - 这也更具可读性 - event.getColumn()会返回实现DynamicColumn的{​​{1}}。然后你可以使用:

  

((DynamicColumn)event.getColumn())。getIndex()

确定列索引。还有UIColumn来检查有效性。

使用标头需要更多代码,可能效率更低。

答案 2 :(得分:0)

我发现只有一种方法可以做到这一点。在xhtml上,向该列添加ID:

<p:column id="myColumn">
...
</p:column>

在后备bean中,column.getColumnKey()将返回一个生成的ID,其中包含您在xhtml中设置的ID(类似于j_idt30:j_idt32:0:contratoReal)。因此,您可以执行以下操作:

public void onCellEdit(CellEditEvent event) {
    if (event.getColumn().getColumnKey().endsWith("myColumn")
}