仅在(Primefaces)数据表的第一行上获取inputText,其中包含动态列和行

仅在(Primefaces)数据表的第一行上获取inputText,其中包含动态列和行,primefaces,datatable,jsf-2.2,Primefaces,Datatable,Jsf 2.2,我有一个带有动态列和动态行的Primefaces(5.0)数据表。 简言之,我的问题是如何设置它,使第一行的单元格是一系列inputText或InputExtArea,而第一行下面的行是outputText 为了详细说明,xhtml(遵循BalusC对的响应)如下所示: <p:dataTable var="rowMap" value="#{reviewController.rowMapList}" scrollable="true" scrollWidth="900px" >

我有一个带有动态列和动态行的Primefaces(5.0)数据表。 简言之,我的问题是如何设置它,使第一行的单元格是一系列inputText或InputExtArea,而第一行下面的行是outputText

为了详细说明,xhtml(遵循BalusC对的响应)如下所示:

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

#{columnName}
所以我在想,对inputExt行使用facet可能有问题,因为facet似乎没有参与dataTable数据迭代。 那么,如何将第一行作为“正常”行(而不是问题的一部分)放入,但仍然将inputTextarea应用于第一行,而不将inputTextarea应用于所有行

为了让它工作,我在reviewController上使用@PostConstruct静态地设置了它,如下所示

@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
}
@Named
@视域
公共类ReviewController实现可序列化{
私有列表列名称列表;
私有ArrayList行映射列表;
私有地图行地图;
@施工后
公共void init(){
columnNameList=新的ArrayList();
rowMapList=新的ArrayList();
columnNameList.add(“源报告”);
columnNameList.添加(“概述”);
列名列表。添加(“问题1”);
列名列表。添加(“问题2”);
列名列表。添加(“问题3”);
Map m=新的HashMap();
m、 put(columnNameList.get(0),“Assessor1”);
m、 put(columnNameList.get(1),“评估员1概述文本”);
m、 put(columnNameList.get(2),“评估人1对第一季度的评论”);
m、 put(columnNameList.get(3),“第二季度评估人1评论”);
m、 put(columnNameList.get(4),“第三季度评估人1评论”);
行映射列表。添加(m);
m=新的HashMap();
m、 put(columnNameList.get(0),“Assessor2”);
m、 put(columnNameList.get(1),“评估员2概述文本”);
m、 put(columnNameList.get(2),“评估人2对Q1的评论”);
m、 put(columnNameList.get(3),“评估人2对第二季度的评论”);
m、 put(columnNameList.get(4),“第三季度评估人2评论”);
行映射列表。添加(m);
//等
}
从视觉上看,结果如下:

我想要的是让第一行成为InputExtArea的一行,这样用户就可以在每个第一行单元格中添加注释,以响应其下行的内容。我已经在视觉上实现了这一点-但正如我上面所说的,InputExtArea不起作用(我认为是因为它们在facets中)未连接到rowMap和columnName迭代中

我已经研究了primefaces editable datatable()——它在某种程度上符合要求。但是它使所有行都可编辑,而不仅仅是第一行。在这种情况下,列和行都将被动态应用,这就更加复杂了


感谢您的任何评论或帮助。谢谢。

再次感谢未知:这实际上是您的答案(我不知道是否有更正式的方式将其归因于您,但我很高兴这样做)。非常感谢。xhtml代码如下:

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

#{行映射[列名称]}
#{columnName}

正如您对行所描述的,另外我添加了一个额外的p:columns块来区分第一列,并放置了一个带有rendered=“#{col!=0}”的columnIndexVar以主p:Columns块为条件,使第一列不具有第一行其他单元格所具有的InputExtArea。

因为您要求仅第一行是可编辑的,所以我要求您使用rowIndexVar来管理行

您可以使用p:dataTable的rowIndexVar属性

rowIndexVar是引用每行索引的迭代器的名称

可以在EL中使用其迭代器名称来获取行Id

例如:如果rowIndexVar=“row”,则可以使用#{row}在EL中使用该迭代器名称访问每一行索引

示例代码:

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

....

为什么不使用m.put(columnNameList.get(0),“input text value”);在行==0时使用呈现的输入列,或者显示输出文本?您的逻辑是正确的。我的问题是-在“当行==0”的条件下如何构建进入xhtml文件的表达式语言和xhtml?如何修改上面的xhtml,使其捕获第一行的单元格并根据需要进行修改?您可以使用数据表()的rowIndexVar=“row”,并使用rendered=“#{row==0}”在专栏上。这看起来很有希望,谢谢。这里很晚了,但我会在早上晚些时候尝试申请。“正式方式”只是在评论中要求
@user
将评论作为答案重新发布。为了安全起见,用户通常会将经过教育的猜测或对模棱两可问题的潜在答案作为评论发布。如果结果良好,用户通常不会在重新发布(甚至详细说明)时遇到任何问题答案是真实的。谢谢,这真的很有帮助。