【问题标题】:Primefaces - how to get the column of a CellEditEventPrimefaces - 如何获取 CellEditEvent 的列
【发布时间】:2014-03-19 20:37:00
【问题描述】:

我正在使用 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()。

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

问题是,在调试时,我找不到获取任何列信息(名称、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();

不过,这对我来说似乎是一个 hack。我仍然对更优雅的解决方案感兴趣;-)

【问题讨论】:

    标签: java jsf jsf-2 primefaces


    【解决方案1】:

    您可以通过引用您传递的列标题来获取该列。

    在 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 代码 - 使其难以使用。

    【讨论】:

      【解决方案2】:

      如果您使用p:columns 而不是p:column - 这也更具可读性 - event.getColumn() 返回一个实现UIColumnDynamicColumn。然后你可以使用:

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

      确定列索引。还有一个column.isDynamic() 来检查有效性。

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

      【讨论】:

        【解决方案3】:

        我发现只有一种方法可以做到这一点。在 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")
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-08-24
          • 1970-01-01
          • 2012-07-30
          • 2014-11-25
          • 1970-01-01
          • 1970-01-01
          • 2015-11-19
          • 2014-02-27
          相关资源
          最近更新 更多