2016-04-10 8 views
1

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:

enter image description here

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.

+0

Warum Sie nicht verwenden m.put (columnNameList.get (0) "Eingabetextwert"); und verwende gerenderte Eingabespalte wenn Zeile == 0 sonst Ausgabetext anzeigen? – Unknown

+0

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

+1

Sie Benutzer rowIndexVar = "Zeile" der Datentabelle () und verwenden gerendert = "# {row == 0}" für die Spalte. – Unknown

Antwort

2

Da Sie gefragt, Sie wollen nur die erste Zeile editierbar ist, ich habe Sie gefragt, rowIndexVar zu verwenden, um die Zeilen zu verwalten.

Sie können das p: dataTable-Attribut rowIndexVar verwenden.

rowIndexVar ist Name des Iterators, der auf jeden Zeilenindex verweist.

Wessen Iterator Name kann in EL verwendet werden, um die Zeilen-ID

Zum Beispiel zu bekommen: Wenn rowIndexVar = "Zeile", dann können Sie jede Zeile Index zugreifen, die Iterator Namen in EL mit # mit {Reihe} .

Beispielcode:

<p:dataTable rowIndexVar="row" value="..." var="myVar"> 
    <p:column> 
     <p:inputTextarea rows="2" cols="25" counter="display" 
          value="#{myVar.myText}" rendered="#{row==0}"      id="comment1" 
          maxlength="200" 
          counterTemplate="{0} remaining characters" 
          autoResize="false"> 
         </p:inputTextarea> 
     <h:outputText value="#{myVar.myText}" rendered="#{row!=0}" /> 
    </p:column> 
    .... 
</p:dataTable> 
+0

Danke, das ist sehr hilfreich. – anvw

0

Vielen Dank noch einmal an Unknown: Diese effektiv Ihre Antwort ist (ich weiß nicht, ob es eine formale Art und Weise ist es Ihnen zuzuschreiben, aber ich bin glücklich, so zu tun). Sehr geschätzt. XHTML-Code wie folgt:

<p:dataTable var="rowMap" rowIndexVar="row" value="#{reviewController.rowMapList}" > 
      <p:columns value="#{reviewController.columnNameList[0]}" var="columnName" headerText="#{columnName}"> 
             #{rowMap[columnName]} 
            </p:columns> 
      <p:columns value="#{reviewController.columnNameList}" columnIndexVar="col" rendered="#{col!=0}" var="columnName" headerText="#{columnName}" > 
       <f:facet name="header" >#{columnName}</f:facet> 
       <h:inputTextarea value="#{rowMap[columnName]}" rendered="#{row==0}" /> 
       <h:outputText value="#{rowMap[columnName]}" rendered="#{row!=0}" /> 
      </p:columns> 
     </p:dataTable> 

So ist es, wie Sie es für die Zeilen beschrieben, und ich habe eine zusätzliche p hinzugefügt: Spalten blockieren nur die erste Spalte zu unterscheiden, und legte eine columnIndexVar mit gerendert = "# { col! = 0} "abhängig vom Haupt-p: Spaltenblock, so dass die erste Spalte nicht die inputTextarea hat, die die anderen Zellen der ersten Zeile haben.

+1

"Formaler Weg" fragt nur "@ user" in einem Kommentar, um den Kommentar als Antwort erneut zu posten. In vielen Fällen können Benutzer fundierte Vermutungen oder mögliche Antworten auf mehrdeutige Fragen als Kommentare posten, nur um auf der sicheren Seite zu sein. Wenn es sich herausstellt, dass es gut läuft, würde der Benutzer mehr als oft Probleme haben, die Lösung in einer echten Antwort umzubenennen (und sogar zu verfeinern). – BalusC