在datatable中表示静态和动态列 [英] Primefaces static and dynamic columns in datatable
问题描述
我的DataObject有一些必需的字段和一个可选的tupel(键值对)列表。可选列表的大小可能会有所不同。因此,我需要一个动态机制来在Primefaces.DataTable中显示DataObject列表。
我的方法看起来像:
public class DataObject {
private String staticval1;
private String staticval2;
私人列表< Tupel>可选值
// .. getter,setter,hashCode,toString .....
}
public class Tupel {
private字符串id
private String value;
}
@ManagedBean
@ViewScoped
public class TableOverviewBean {
private List< DataObject>数据;
@EJB
私人IMyDao myDao;
@PostConstruct
public void init(){
data = myDao.findAll();
}
public List< DataObject> getData(){
返回数据;
}
public void setData(List< DataObject> data){
this.data = data;
}
}
< h:form>
< p:dataTable value =#{tableOverviewBean.data}var =data>
< p:column headerText =static1>
< h:outputText value =#{data.staticval1}/>
< / p:column>
< p:column headerText =static2>
< h:outputText value =#{data.staticval2}/>
< / p:column>
< p:columns value =#{data.optionalValues}var =optheaderText =#{opt.id}>
< h:outputText value =#{opt.value}/>
< / p:columns>
< / p:dataTable>
< / h:form>
但这不行。动态列不呈现。
如何解决我的问题?
编辑:
预期结果:
staticval1 | staticval2 | dynamic_id1 | dynamic_id2 | ... | dynmic_idn
--------------------------------------------- -------------------------
static1a | static2a | dyna_value1a | dyna_value2a | ... | dyna_valu3a
static1b | static2b | dyna_value1b | dyna_value2b | ... | dyna_valu3b
static1c | static2c | dyna_value1c | dyna_value2c | ... | dyna_valu3c
不可能根据行数据。想象一下,第1行有2列,第2行有6列,第3行有1列,你如何在HTML中生成技术上有效的表?每行必须具有相同数量的列。
您有两个选项,具体取决于是否可以更改模型:
-
如果您无法更改模型,则需要替换
< p:columns>
通过单个< p:column>
,并使用嵌套循环循环使用#{data.optionalValues}
例如< ui:repeat>
或者甚至可以是另一个< p:dataTable>< p:columns>
/ p>
< p:column>
< p:dataTable value =><! - 空字符串作为值强制1行。 - >
< p:columns value =#{data.optionalValues}var =optheaderText =#{opt.id}>
#{opt.value}
< / p:columns>
< / p:dataTable>
< / p:column>
-
如果您可以更改模型,则需要让
< p:columns value>
指向一个bean属性而不是一个row属性,所以每行都完全一样。如果您替换列表< Tupel>可选值
由映射< String,Tupel>可选值
其中的密钥是Tupel#id
,并添加一个列表< String>
属性该bean包含所有可用的Tupel#id
值。< p :columns value =#{tableOverviewBean.availableTupelIds}var =idheaderText =#{id}>
#{data.optionalValues [id] .value}
< / p:columns>
I am using Primefaces 5.0 to create a dynamic datatable.
My DataObject has some required fields and a List of optional "tupel" (key-value pair). The optional list may vary in size. Therefore I need a dynamic mechanism to show a List of DataObject in Primefaces.DataTable.
My approach looks like:
public class DataObject {
private String staticval1;
private String staticval2;
private List<Tupel> optionalValues;
// .. getter, setter, hashCode, toString.....
}
public class Tupel{
private String id;
private String value;
}
@ManagedBean
@ViewScoped
public class TableOverviewBean {
private List<DataObject> data;
@EJB
private IMyDao myDao;
@PostConstruct
public void init() {
data = myDao.findAll();
}
public List<DataObject> getData() {
return data;
}
public void setData(List<DataObject> data) {
this.data = data;
}
}
<h:form>
<p:dataTable value="#{tableOverviewBean.data}" var="data">
<p:column headerText="static1">
<h:outputText value="#{data.staticval1}" />
</p:column>
<p:column headerText="static2">
<h:outputText value="#{data.staticval2}" />
</p:column>
<p:columns value="#{data.optionalValues}" var="opt" headerText="#{opt.id}">
<h:outputText value="#{opt.value}" />
</p:columns>
</p:dataTable>
</h:form>
But this does not work. The dynamic columns are not rendered. How can I solve my problem?
EDIT: Expected result:
staticval1 | staticval2 | dynamic_id1 | dynamic_id2 | ... | dynmic_idn
----------------------------------------------------------------------
static1a | static2a | dyna_value1a| dyna_value2a | ... | dyna_valu3a
static1b | static2b | dyna_value1b| dyna_value2b | ... | dyna_valu3b
static1c | static2c | dyna_value1c| dyna_value2c | ... | dyna_valu3c
It isn't possible to define columns based on row data. Imagine that row 1 has 2 columns, row 2 has 6 columns, row 3 has 1 column, etc how would you ever produce a technically valid table in HTML? Each row must have the same amount of columns.
You've 2 options, depending on whether can change the model or not:
If you can't change the model, then you need to replace that
<p:columns>
by a single<p:column>
and loop over the#{data.optionalValues}
using a nested loop with e.g.<ui:repeat>
or perhaps even another<p:dataTable><p:columns>
:<p:column> <p:dataTable value=""><!-- Empty string as value forces 1 row. --> <p:columns value="#{data.optionalValues}" var="opt" headerText="#{opt.id}"> #{opt.value} </p:columns> </p:dataTable> </p:column>
If you can change the model, then you need to let
<p:columns value>
point to a bean property instead of to a row property, so that it's exactly the same for every row. This works if you replaceList<Tupel> optionalValues
byMap<String, Tupel> optionalValues
where the key isTupel#id
and add aList<String>
property to the bean containing all availableTupel#id
values.<p:columns value="#{tableOverviewBean.availableTupelIds}" var="id" headerText="#{id}"> #{data.optionalValues[id].value} </p:columns>
这篇关于在datatable中表示静态和动态列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!