【问题标题】:How to generate rows of PanelGrid dynamically? (JSF, Primefaces)如何动态生成 PanelGrid 行? (JSF,Primefaces)
【发布时间】:2013-03-15 23:23:26
【问题描述】:

我正在尝试创建一个具有 2 列的 PanelGrid 并从 List 加载数据。问题是它不会创建新行。它只是将整个 List 放在第一行。

没有与数据库的通信。我需要显示的只是一个列表,每个值对应一行。

这就是我的 PanelGrid 的样子:

        <p:panelGrid style="border:10px;">

                <p:row>
                    <p:column style="font-size:15px;font-weight:bold;">Column1</p:column>
                    <p:column style="font-size:15px;font-weight:bold;">Column2</p:column>
                </p:row>

                <p:row>
                    <p:column style="width:35%">
                        <h:outputText value="#{myService.columnOne}" />
                    </p:column>
                    <p:column style="width:35%">
                        <h:outputText value="#{myService.columnTwo}" />
                    </p:column>
                </p:row>

            </p:panelGrid>

这是我在 MyService.java 中的列表:

 public List<String> columnOne = new ArrayList<String>();
public List<String> columnTwo = new ArrayList<String>();

我只是在我的方法中添加一些值

columnOne.add("String");

...

编辑

我已经通过更改我的 Java 逻辑、创建键值映射并将其显示在数据表中来解决它。

【问题讨论】:

    标签: jsf primefaces javabeans panel


    【解决方案1】:

    您不会使用 p:panelGrid 迭代您的列表 您应该使用像 p:datatable 或 p:datagrid 这样的迭代器

    而#{myService.columnOne} 将输出对象columnOne,而不是其中的值。

    在 datagrid 中,您定义一个 var 来迭代列表。

    你应该定义这样的东西;

    <p:dataGrid style="border:10px;" value="#{myService.columnOne}" var="col"  columns="3">
        <p:panel header="col" style="text-align:center">
        <h:outputText value="#{col}"/>
      </p:panel>             
     </p:dataGrid>
    

    在 bean 中

        public myservice() {
            columnOne.add("String1");
            columnOne.add("String2");
            columnOne.add("String3");
    
            columnTwo.add("Something1");
            columnTwo.add("Something2");
            columnTwo.add("Something3");
    
        }
    public List<String> getColumnOne() {
        return columnOne;
    }
    

    【讨论】:

    • 这会为每个值生成一列
    • 这只是一个例子。显然,提问者不(不)了解如何在 JSF 中迭代列表。所以我试图解释那部分。
    【解决方案2】:

    按照您编写的方式,当然它不会只生成两行,一个用于标题,另一个包含两个列,它们将输出columnOne.toString()columnTwo.toString()

    必须有某种方法将它们显示在一个 p:panelGrid 中。但是,如果您确定两个列表的大小相同,我认为最好的方法(优化并且在您的 Java 代码中不需要额外的代码)是使用两个 p:panelGrids,每个都将显示一列。之后,您可以使用 CSS 使它们显示为一个独特的表格。

    根据您的评论,我应该在我的方法中做些什么:

    <p:dataTable var="colValue" value="#{myService.columnOne}">    
      <p:column headerText="Column1">  
            <h:outputText value="#{colValue}" />  
      </p:column>
    </p:dataTable> 
    

    第二列就像第一列。

    我没有使用p:panelGrid来避免在迭代数据时使用c:forEach

    【讨论】:

    • 那么我在哪里设置列的值?就像我在代码中所做的那样? 它会为每个值创建一行吗?
    • 如果您愿意使用我的方法,那么我会使用 p:datatable,查看我的答案编辑
    • 你的解决方案对我有用,但不能在一个数据表中设置两列吗?我真的需要为每列创建两个数据表吗?
    • OP 想要一个固定的 2 列表。这个答案没有提供。
    • @BalusC,请在您的回答中注意,OP 有两个列表,他希望每一列都将列表中的值分开。这就是为什么我建议使用两个数据表
    猜你喜欢
    • 1970-01-01
    • 2013-03-17
    • 2013-10-01
    • 1970-01-01
    • 2012-04-03
    • 2012-05-17
    • 2021-01-26
    • 2017-01-30
    • 2011-12-08
    相关资源
    最近更新 更多