【问题标题】:Primefaces datatable's p:columns not iterating over MapPrimefaces 数据表的 p:columns 未迭代 Map
【发布时间】:2014-11-08 04:04:46
【问题描述】:

我有一个两级地图Map<String,HashMap<String,String>>,我需要使用<p:dataTable> 显示它。托管bean的代码如下:

@ManagedBean(name="MyBean")
public class MyBean{
    private Map<String,HashMap<String,String>> twoDimentionalMap;
    public void getMapData(){
       twoDimentionalMap=getDataFromDataStore();
    }

}

现在我在view.xhtml 文件中使用此地图,如下所示:

<p:dataTable var="entrySet1" value="#{MyBean.twoDimentionalMap.entrySet()}">
    <p:columns var="entrySet2" value="#{entrySet1.getValue()}">
         #{entrySet2.getKey()} - #{entrySet2.getValue()}
    </p:columns>
</p:dataTable>

我也尝试过使用

<p:dataTable var="entrySet1" value="#{MyBean.twoDimentionalMap.entrySet()}">
    <p:columns var="entrySet2" value="#{MyBean.twoDimentionalMap.get(entrySet1.getKey()).getValue()}">
         #{entrySet2.getKey()} - #{entrySet2.getValue()}
    </p:columns>
</p:dataTable>

我什至尝试将外部地图转换为列表:

List<HashMap<String,String>> twoDimentionalMap;

但是数据表上没有显示任何内容。执行没有错误,但页面上没有显示任何内容。

如果我做错了什么或&lt;p:columns&gt; 在处理地图时遇到任何问题,请提出建议。

谢谢

【问题讨论】:

  • 您只需要显示entrySet2的键/值?
  • 是的,实际数据存储在内部映射中,所以我只需要显示 entrySet2 的键/值
  • 您需要动态列还是只是将它们用作迭代地图的一种方式?
  • 我需要动态列。由于列名也在数据库中定义,所以我事先不知道列名,因此我不能使用静态列。列名和相应数据将在运行时从数据库中获取并显示在数据表中。
  • 在地图中,您使用什么作为列名?外地图的key?

标签: jsf jsf-2 primefaces datatable


【解决方案1】:

由于outer map的key没有意义,所以将outer map转为list是正确的。

但是您从 xhtml 检索列名的方法似乎无效。您需要从当前迭代变量entrySet1 中独立获取它们,否则您将在操作中添加第三维,这是数据表无法处理的。

我们需要假设列出的映射中的所有键都是相同的。

这里是 xhtml 的代码:

<p:dataTable var="entrySet1" value="#{testMB.twoDimensionalMap}">
    <p:columns var="keySet2" value="#{testMB.columnNames}">
         #{keySet2} - #{entrySet1[keySet2]}
    </p:columns>
</p:dataTable>

对于 bean:

@Named
@ViewScoped
public class TestMB implements Serializable {

    private List<HashMap<String,String>> twoDimensionalMap;

    public TestMB()
    {
        getMapData();
    }

    private void getMapData(){
        //twoDimentionalMap=getDataFromDataStore();
        twoDimensionalMap = new ArrayList<HashMap<String,String>>();
        twoDimensionalMap.add(new HashMap<String,String>());
        twoDimensionalMap.get(0).put("key0", "value00");
        twoDimensionalMap.get(0).put("key1", "value01");
        twoDimensionalMap.add(new HashMap<String,String>());
        twoDimensionalMap.get(1).put("key0", "value10");
        twoDimensionalMap.get(1).put("key1", "value11");
    }

    public Set<String> getColumnNames()
    {
        return twoDimensionalMap.size() > 0 ? twoDimensionalMap.get(0).keySet() : new HashSet<String>();
    }

    public List<HashMap<String, String>> getTwoDimensionalMap() {
        return twoDimensionalMap;
    }
}

【讨论】:

  • 谢谢...它工作了:) 你的建议是正确的,我正在创建三个维度。但是没有显示错误,因此我无法找出原因。再次感谢您的回复:)
猜你喜欢
  • 2012-11-22
  • 2013-01-14
  • 2016-02-03
  • 1970-01-01
  • 2015-03-31
  • 2013-05-17
  • 2013-05-20
  • 1970-01-01
  • 2016-10-08
相关资源
最近更新 更多