在datatable中表示静态和动态列 [英] Primefaces static and dynamic columns in datatable

查看:235
本文介绍了在datatable中表示静态和动态列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Primefaces 5.0创建一个动态数据。



我的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中生成技术上有效的表?每行必须具有相同数量的列。



您有两个选项,具体取决于是否可以更改模型:


  1. 如果您无法更改模型,则需要替换< 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>


  2. 如果您可以更改模型,则需要让 < 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:

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

  2. 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 replace List<Tupel> optionalValues by Map<String, Tupel> optionalValues where the key is Tupel#id and add a List<String> property to the bean containing all available Tupel#id values.

    <p:columns value="#{tableOverviewBean.availableTupelIds}" var="id" headerText="#{id}">
        #{data.optionalValues[id].value}
    </p:columns>
    

这篇关于在datatable中表示静态和动态列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆