Ich habe eine Primefaces (5.0) Datentabelle mit dynamischen Spalten sowie dynamische Zeilen. Kurz gesagt, mein Problem ist, wie ich es einrichten, so dass die Zellen der ersten Zeile eine Reihe von inputText oder inputTextarea sind, während die Zeilen unter dem ersten outputText sind?input immer nur auf der ersten Zeile eines (Primefaces) Datatable mit dynamischen Spalten und Zeilen
zu erarbeiten, die xhtml (nach BalusC Antwort auf Creating and populating a DataTable dynamically in JSF2.0) ist wie folgt:
<p:dataTable var="rowMap" value="#{reviewController.rowMapList}" scrollable="true" scrollWidth="900px" >
<p:columns value="#{reviewController.columnNameList}" var="columnName" headerText="#{columnName}">
<f:facet name="header" >#{columnName}</f:facet>
<f:facet name="header"><p:inputTextarea value="#{rowMap[columnName]}" /></f:facet>
<h:outputText value="#{rowMap[columnName]}" />
</p:columns>
</p:dataTable>
So gibt ich denke, wahrscheinlich ein Problem Facetten für die Zeile mit dem inputTexts in Verwendung, weil die Facette scheint nicht an der DatenTabellen-Dateniteration teilzunehmen. Also, wie lege ich die erste Zeile als eine "normale" Zeile (anstatt eine Facette, wenn das ein Teil des Problems ist) - aber inputTextarea auf diese erste Zeile anwenden, ohne inputTextareas auf alle Zeilen anzuwenden?
Für die Zwecke der es immer funktioniert, habe ich es statisch mit einem @PostConstruct auf reviewController eingerichtet ist, wie folgt.
@Named
@ViewScoped
public class ReviewController implements Serializable {
private List<String> columnNameList;
private ArrayList<Map<String, Object>> rowMapList;
private Map<String, Object> rowMap;
@PostConstruct
public void init() {
columnNameList = new ArrayList<>();
rowMapList = new ArrayList<>();
columnNameList.add("Source Report");
columnNameList.add("Overview");
columnNameList.add("Question 1");
columnNameList.add("Question 2");
columnNameList.add("Question 3");
Map<String, Object> m = new HashMap<>();
m.put(columnNameList.get(0), "Assessor1");
m.put(columnNameList.get(1), "Assessor1 overview text");
m.put(columnNameList.get(2), "Assessor1 comment on Q1");
m.put(columnNameList.get(3), "Assessor1 comment on Q2");
m.put(columnNameList.get(4), "Assessor1 comment on Q3");
rowMapList.add(m);
m = new HashMap<>();
m.put(columnNameList.get(0), "Assessor2");
m.put(columnNameList.get(1), "Assessor2 overview text");
m.put(columnNameList.get(2), "Assessor2 comment on Q1");
m.put(columnNameList.get(3), "Assessor2 comment on Q2");
m.put(columnNameList.get(4), "Assessor2 comment on Q3");
rowMapList.add(m);
//etc
}
Optisch stellt sich wie folgt aus:
Was ich will, ist die erste Reihe ist eine Reihe von InputTextarea ist zu haben, so dass der Benutzer Kommentare in jeder ersten Reihe Zelle hinzufügen können in Antwort auf den Inhalt der Zeilen darunter. Ich habe es visuell erreicht - aber wie ich oben bemerkt habe, funktioniert es nicht darin, dass die inputTextareas (ich nehme an, weil sie in Facetten sind) nicht in die rowMap und columnName Iterationen eingebunden sind presefaces editierbare Datentabelle (http://www.primefaces.org/showcase/ui/data/datatable/edit.xhtml) - was in etwa den Anforderungen entspricht. Es macht jedoch alle Zeilen editierbar, nicht nur die ersten. In diesem Fall besteht die weitere Komplexität darin, dass sowohl Spalten als auch Zeilen dynamisch angewendet werden.
Jeder Kommentar oder Unterstützung geschätzt. Vielen Dank.
Warum Sie nicht verwenden m.put (columnNameList.get (0) "Eingabetextwert"); und verwende gerenderte Eingabespalte wenn Zeile == 0 sonst Ausgabetext anzeigen? – Unknown
Ihre Logik ist gesund. Meine Frage ist - wie bauen Sie die Bedingung "wenn row == 0" in die Ausdruckssprache und xhtml der xhtml-Datei ein? Wie ändere ich das obige xhtml, so dass es die Zellen der ersten Zeile abfängt und bei Bedarf verändert? – anvw
Sie Benutzer rowIndexVar = "Zeile" der Datentabelle () und verwenden gerendert = "# {row == 0}" für die Spalte. –
Unknown