如何从icefaces数据表中删除一行?

时间:2010-11-30 00:06:17

标签: datatable row icefaces

我有一个简单的冰:dataTable有2列,一列是动作列,另一列是表示正则表达式的字符串。 action列的标题是add动作,每行都有一个remove动作。只要它确实如此,我真的不关心它是如何工作的。现在我正在尝试模仿icefaces复合组件editableTable,它要求您选择一行,此时为该行呈现操作,然后单击一个应用于所选行的操作。因此,在我尝试使这项工作时,我创建了一个简单的数据表,其中包含一个rowSelector,用于为所选行设置我的item.selected:

    <ice:dataTable value="#{configuration.selectedTagPositiveRegexes}"
      var="item">
      <ice:column>
        <ice:rowSelector value="#{item.selected}" />
        <f:facet name="header">
          <ice:commandLink styleClass="linkBlue"
            action="#{configuration.tagRegexAdd}">
            <ice:outputText value="Add" />
          </ice:commandLink>
        </f:facet>
        <ice:commandLink styleClass="linkBlue"
          action="#{configuration.tagRegexRemove}"
          rendered="#{item.selected}">
          <ice:outputText value="Remove" />
        </ice:commandLink>
      </ice:column>
      <ice:column>
        <f:facet name="header">
          <ice:outputText value="Regular Expression" />
        </f:facet>
        <ice:inputText value="#{item.object}" size="100" />
      </ice:column>
    </ice:dataTable>

然后在我的支持bean中,我有以下两种方法:

public void tagRegexAdd() {
    log.debug( "add a new regex" );
    for ( SelectableRow<String> row : selectedTagPositiveRegexes ) {
        row.selected = false;
    }
    selectedTagPositiveRegexes.add( 0, new SelectableRow<String>( "", true ) );
}

public void tagRegexRemove() {
    log.debug( "remove an existing regex" );
    int i = 0;
    int selectedIndex = -1;
    for ( SelectableRow<String> row : selectedTagPositiveRegexes ) {
        if ( row.selected ) {
            selectedIndex = i;
            row.selected = false;
        }
        i++;
    }
    if ( selectedIndex >= 0 ) {
        selectedTagPositiveRegexes.remove( selectedIndex );
    }
}

当我单步执行此代码时,我注意到的是,当单击删除操作时,selectedTagPositiveRegexes的getter被调用3次,然后是实际的remove方法,然后再向getter调用1次,此时浏览器收到一个做我想要的回应。但是,某些事件必须已被某些事件排队,因为在返回响应之后,getter会再被调用3次,之后删除该项之后的项目将被删除的项目替换。我不知道这里发生了什么,并且必须对如何使用它有严重的误解,但我的假设是由元素列表支持的数据表应该从该列表中获取其内容。这样,如果我在列表中添加或删除,数据表应该代表新状态。但在这个假设中,我似乎非常错误。任何有关如何实际工作的见解将不胜感激。

2 个答案:

答案 0 :(得分:0)

我没有这样试过,但这对我有用。

在托管bean中,创建一个HtmlDataTable类型的属性,然后使用ice:dataTable的binding属性指向它。现在在回调中,执行以下操作:

RowClass row=(RowClass)htmlTable.getRowData();
rowList.remove(row);

在某些情况下,我必须运行它才能使其正确更新。我相信只有你有嵌套表:

htmlTable.getChildren().clear();

答案 1 :(得分:0)

尝试向数据表添加绑定,可以是(org.icefaces.ace.component.datatable.DataTable)或(HtmlDatatable)

代码将是

<ice:dataTable value="#{configuration.selectedTagPositiveRegexes}"
      var="item" binding="#{configuration.tabla}">

和bean:

private HtmlDatatable tabla;
public void tagRegexRemove() {
 objectClass   ob = (objectClass) this.tabla.getRowData();
 this.selectedTagPositiveRegexes.remove(ob);
}