2010-11-30 6 views
0

Ich habe ein einfaches Eis: dataTable, die 2 Spalten hat, eine eine Aktionsspalte die andere eine Zeichenfolge, die einen regulären Ausdruck darstellt. Die Aktionsspalte hat als Kopf eine Add-Aktion und für jede Zeile eine Entfernungsaktion. Es ist mir egal, wie das funktioniert, solange es funktioniert. Im Moment versuche ich, die Icefaces-Composite-Komponente editableTable nachzuahmen, die erfordert, dass Sie eine Zeile auswählen, bei der die Aktionen für diese Zeile gerendert werden. Wenn Sie dann auf eine Aktion klicken, wird sie auf die ausgewählte Zeile angewendet. Also in meinem Versuch, diese Arbeit zu machen, habe ich einfach Datentabelle mit einem rowSelector, die für die ausgewählte Zeile meine item.selected setzt:Wie entferne ich eine Zeile von einer Datentabelle?

<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> 

Da ist in meinem Backing Bean, ich habe diese 2 Methoden:

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); 
    } 
} 

Was ich bemerke passiert, als ich durch diesen Code Schritt ist, dass der Getter für selectedTagPositiveRegExes aufgerufen wird 3 Mal, wenn die Entfernen-Aktion angeklickt wird, gefolgt von der tatsächlichen Entfernung Methode gefolgt von 1 weiteren Anruf an den Getter an welchem ​​Punkt der Browser erhält eine Antwort, die tut was ich will. Einige Ereignisse müssen jedoch in die Warteschlange gestellt worden sein, da nach dem Zurückgeben der Antwort der Getter 3 weitere Male aufgerufen wird, woraufhin das Element nach dem entfernten Element durch das Element ersetzt wird, das entfernt wurde. Ich habe keine Ahnung, was hier vor sich geht und muss ein ernsthaftes Missverständnis darüber haben, wie dies verwendet wird, aber meine Annahme war, dass die Datentabelle, die durch eine Liste von Elementen unterstützt wird, ihren Inhalt von dieser Liste erhalten sollte. Auf diese Weise sollte die Datentabelle den neuen Zustand darstellen, wenn ich der Liste hinzufüge oder von ihr entferne. Aber mit dieser Annahme scheint ich schrecklich falsch zu liegen. Jeder Einblick, wie dies tatsächlich funktioniert, wird sehr geschätzt.

Antwort

0

Ich habe es nicht so versucht, aber das hat für mich funktioniert.

Erstellen Sie in Ihrer verwalteten Bean eine Eigenschaft vom Typ HtmlDataTable und verwenden Sie dann das Bindungsattribut von ice: dataTable, um darauf zu zeigen. Jetzt im Rückruf, tun Sie das:

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

In einigen Fällen musste ich dies ausführen, um es korrekt zu aktualisieren. Ich glaube, dies nur, wenn Sie Tabellen verschachtelt haben:

htmlTable.getChildren().clear(); 
+0

Ja, das ist es, was ich in der Vergangenheit getan haben, aber nicht sehen, warum es nec war erforderlich. Ich versuche dies jetzt zu tun, und wenn es für diesen Fall funktioniert, werde ich dies als die Lösung bezeichnen, aber die Frage meiner Vorgehensweise ist immer noch von Interesse für mich. Wenn jemand erklären kann, was vor sich geht, würde ich es begrüßen. Danke JOTN. – Lucas

+0

Nun, da ich mir das genauer anschaue, scheint es nichts anderes zu tun ... Sie entfernen immer noch nur das Element aus der Liste, das vom ListDataModel umschlossen ist, das von der DataTable selbst verwendet wird. Fehle ich hier etwas? – Lucas

0

Versuchen Sie, eine Bindung an die Datentabelle hinzufügen, könnte ein (org.icefaces.ace.component.datatable.DataTable) oder (HtmlDatatable)

die Code

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

und die Bohne sein:

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