2016-04-10 36 views
1

Bir Primefaces (5.0) Dinamik satırların yanı sıra dinamik satırlarla veritabam var. Özetle, ilk satırın hücreleri bir dizi inputText veya inputTextarea's olurken, ilk satırın altındaki hücreler outputText olsun, sorunumu nasıl ayarlayabilirim?inputText'i sadece bir (Primefaces) dataTable'ın ilk satırına getirme, dinamik sütunlar ve satırlar ile

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

yüzden muhtemelen inputTexts ile satır için yönleriyle kullanarak bir sorun var, düşünüyorum, çünkü şu şekildedir:

, (Creating and populating a DataTable dynamically in JSF2.0 için BalusC tepki sonrasında) xhtml ayrıntılı olduğu için faset dataTable veri yinelemesinde yer almıyor gibi görünüyor. Peki, ilk satırı bir "normal" satır olarak (problemin bir parçasıysa, bir faset yerine) nasıl yerleştiririm - ama yine de tüm satırlara inputTextareas uygulamadan inputTextarea'ları bu ilk satıra uygular mısınız?

Çalıştırmak amacıyla, aşağıdaki gibi reviewController'da bir @PostConstruct ile statik olarak ayarlamıştım.

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

Görme böyle çıkıyor:

enter image description here

İstediğim kullanıcı her ilk sıra hücrede açıklama eklenip böylece ilk satırı InputTextarea en sırası olan sahip olmaktır altındaki satırların içeriğine yanıt. Ben bunu görsel olarak başardım - ama yukarıda belirttiğim gibi, inputTextareas'ın (çünkü bunlar yönettikleri için) satır boşluğuna ve columnName yinelemelerine bağlanmadığı işe yaramıyor

Primefaces düzenlenebilir bir datatable (http://www.primefaces.org/showcase/ui/data/datatable/edit.xhtml) - hangi gerekli çizgiler boyunca biraz. Ancak, tüm satırları yalnızca ilk değil, düzenlenebilir hale getirir. Bu durumda, hem sütunların hem de satırların dinamik olarak uygulanacağı daha karmaşıktır.

Herhangi bir yorum veya yardım için teşekkür ederiz. Teşekkürler.

+0

Neden m.put kullanmayın (columnNameList.get (0), "giriş metin değeri"); ve == 0 başka çıktı metni görüntülediğinde rendered sütunu kullan? – Unknown

+0

Mantık sesinizdir. Sorum şu: - xhtml dosyasının ifade dili ve xhtml'sine "row == 0" olduğunda "nasıl" yazıyorsunuz? Yukarıdaki xhtml'i, ilk satırın hücrelerini yakalaması ve gerektiği gibi değiştirmesi için nasıl değiştiririm? – anvw

+1

Kullanıcınız rowIndexVar = "row" veri tablosunun () ve render render = "# {row == 0}" sütununda. – Unknown

cevap

2

Yalnızca 1. satırın düzenlenebilir olmasını istediğinizden beri, satırları yönetmek için rowIndexVar'ı kullanmanızı rica ettim.

p: dataTable'ın rowIndexVar özniteliğini kullanabilirsiniz.

rowIndexVar her satır dizinine başvurmak için yineleyicinin adıdır.Kimin yineleyici adı Örneğin Satır kimliği

almak için EL kullanılabilir

: rowIndexVar = "satır" o zaman # kullanarak EL o yineleyici adını kullanarak her satır Endeksi erişebilir eğer {satır} .

Örnek Kod:

<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

Teşekkür ederim, bu gerçekten yararlı. – anvw

0

Bilinmeyen'e tekrar teşekkürler: Bu etkili bir şekilde cevabınızdır (Bunu size vermenin daha resmi bir yolu olup olmadığını bilmiyorum, ancak bunu yapmaktan mutluluk duyarım). Çok takdir edildi.

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

Yani satırlar için tarif ettiği gibi, artı ekstra bir p eklemiş: xhtml kodu aşağıdaki gibi sütunlar sadece ilk sütunu ayırt etmek engellemek ve oluşturulan = "# ile bir columnIndexVar yerleştirilen { col! = 0} "ana p'de koşullu: Sütunlar, ilk sütunun ilk satırın diğer hücrelerini yaptığı inputTextarea'ya sahip olmayacak şekilde bloke edilir.

+1

"Resmi yol", "@ kullanıcı" sorusunu yorum olarak yanıtlamak için yorumda bulunuyor. Çoğu zaman, kullanıcılar sadece güvenli tarafta olmak için yorum olarak muğlak sorulara eğitimli tahminler veya potansiyel yanıtlar gönderebilir. İyi bir şekilde işe yarayacaksa, çoğu zaman kullanıcının gerçek bir cevapta çözümü (ve hatta detaylandırmasını) herhangi bir problemi olmayacaktır. – BalusC