我正在使用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。我觉得我错过了一些东西,因为没有人会在没有提供行和列的情况下创建单元格事件,对吗?
更新 - 似乎我可以获得像
这样的IDorg.primefaces.component.column.Column o = (org.primefaces.component.column.Column)event.getColumn();
不过,这对我来说似乎是个黑客。我仍然对更优雅的解决方案感兴趣; - )
答案 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")
}