是否可以在jsf中向datatTable的一个特定行添加新列?

时间:2016-07-05 11:34:51

标签: datatables

我在法国组织工作,我应该开发一个由六个连续屏幕组成的相当复杂的表格。我已经完成了五个屏幕,在最后的屏幕中,我遇到了一个特定的问题,有不同的解决方案。为了使我的.xhtml页面中的标记更具可读性,我更喜欢我们可以将新列添加到dataTable的一个特定行的解决方案。将通过单击commandButton来选择该行,该命令按钮将同时选择该行并添加新列。到目前为止,我可以向数据表添加一个新行,但问题是新添加的列将添加到我的dataTable的所有行中。我的问题很简单。是否可以将新列添加到用户选择的特定行中?如果有可能我会搜索找到答案,如果没有,我会按照其他已经考虑过的解决方案。当然,我非常感谢任何进一步的帮助,如提及任何参考书或网站。

2 个答案:

答案 0 :(得分:0)

我们没有关于您的数据模型的任何信息,但我会尽力帮助您。

可能性:

在#{data.optionalValues}上使用和循环使用嵌套循环或者甚至是另一个

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

使用此结构,您可以使用不同列的行。如果它可以正常工作,您只需要在之后更新数组内容。

但是如果您需要更多信息,可以看到以下链接: Primefaces static and dynamic columns in datatable

你不想做什么,但我希望它可以帮到你。

答案 1 :(得分:0)

我已经解决了我的问题。也许我遇到的问题不会经常引发,我发布解决方案并希望它可以帮助其他人面对像我这样的问题。

首先,我想要的是一个列,其中列是特定的表单字段。但这将是用户 谁决定是否要添加新的表单字段。如图所示,这就是我想要的: enter image description here

为了做到这一点,我使用了primefaces <p:columns>的可能性。但是由于这个标签在特定的支持bean的帮助下为dataTable的所有行添加了一个列,所以我已经彻底使用了<ui:repeat>,因此休息的dataTable只有一行,如xhtml代码所示:

                        

Liste des Types de recherche

                    <ui:repeat var="thisQuadripole" value="#{saParametrageJbCoordinateurPrincipal.dataTableList.quadripoles}">
                        <h3>
                            <h:outputText value="#{thisQuadripole.quadripoleName}"></h:outputText>
                        </h3>
                        <ui:repeat var="thisMonoDatatable" value="#{thisQuadripole.monoDataTables}">
                            <h4>
                                <h:outputText value="#{thisMonoDatatable.directive}"></h:outputText>
                            </h4>
                            <p:dataTable value="" styleClass="normal" style="able-layout: fixed; width: 20px;" id="datatable">
                                <p:columns var="thisColumn" value="#{thisMonoDatatable.dataTableColumns}">
                                    <f:facet name="header">
                                        <h:outputText value="#{thisColumn.header}"></h:outputText>
                                    </f:facet>
                                    <h:selectOneMenu value="#{recherchesEcranBean.colonneTypeRechercheJb.sousColonne}">
                                        <f:selectItems value="#{saParametrageJbCoordinateurPrincipal.toutTypeColonne}"></f:selectItems>
                                    </h:selectOneMenu>
                                    <p></p>
                                    <p:outputLabel for="largeur2" value="(largeur)% "></p:outputLabel>
                                    <p:inputText id="largeur2" value="#{recherchesEcranBean.colonneTypeRechercheJb.largeurAffichage}"
                                        style="width: 40%;"></p:inputText>
                                </p:columns>
                                <p:column>
                                    <f:facet name="header" style="width:10px;">
                                        <h:outputText value=""></h:outputText>
                                    </f:facet>
                                    <h:commandButton id="thisButton"
                                        action="#{saParametrageJbCoordinateurPrincipal.addNewColumnToMonoDataTable(thisMonoDatatable)}"
                                        value=" + " style="background-color: #db70b8; cursor:pointer">
                                        <f:ajax execute="@this" render="datatable"></f:ajax>
                                    </h:commandButton>
                                </p:column>
                            </p:dataTable>
                        </ui:repeat>
                    </ui:repeat>
                </h:form>

为了做到这一点,我使用了四个支持bean,正如我将要解释的那样,其中一个是我正在处理的项目强加给我的,但是其他三个是你需要使用的。第一个,我命名为DataTableList只包含一个名为Quadripole的另一个bean的列表(命名来自我在物理学中的背景):

@ManagedBean
@SessionScoped
public class DataTableList
{
     @ManagedProperty(value="#{quadripoles}")
     private List<Quadripole> quadripoles;

     public List<Quadripole> getQuadripoles() {

     if (quadripoles == null) {
        quadripoles = new ArrayList<Quadripole>();
     }

     return quadripoles;
    }

}

Quardripole实际上是一个bean,实际上包含四个数据表,我称之为MonoDataTable:*

@ManagedBean
@SessionScoped
public class Quadripole
{
    @ManagedProperty(value="#{quadripoleName}")
    private String quadripoleName;

    @ManagedProperty(value="#{monoDataTables}")
    private List<MonoDataTable> monoDataTables;

    public Quadripole() {
    //Emty contructor for managedBean
    }

    public Quadripole(String quadripoleName) {
    this.quadripoleName = quadripoleName;
   }

   /**
   * Accesseur de quadripoleName
   *
   * @return quadripoleName
   */
   public String getQuadripoleName()
   {
      return quadripoleName;
    }

   /**
    * Mutateur de quadripoleName
    *
    * @param quadripoleName quadripoleName
    */
    public void setQuadripoleName(String quadripoleName)
    {
       this.quadripoleName = quadripoleName;
    }

MonodataTable包含dataTableColumns列表:

@ManagedBean

@ViewScoped 公共类MonoDataTable实现了Serializable {

/**
 * serialVersionUID - long, DOCUMENTEZ_MOI
 */
private static final long serialVersionUID = 1L;

@ManagedProperty(value="#{directive}")
private String directive;

@ManagedProperty(value="#{}")
private int columnCounter = 1;

@ManagedProperty(value="#{dataTableColumns}")
private List<DataTableColumn> dataTableColumns = new      ArrayList<DataTableColumn>();



public MonoDataTable() {
    //Empty constructor for managedBean
}

public MonoDataTable(String directive)
{
    // DOCUMENTEZ_MOI Raccord de constructeur auto-généré
    this.directive = directive;
}

/**
 * Accesseur de directive
 *
 * @return directive
 */
public String getDirective()
{
    return directive;
}

/**
 * Mutateur de directive
 *
 * @param directive directive
 */
public void setDirective(String directive)
{
    this.directive = directive;
}


/**
 * Accesseur de columnCounter
 *
 * @return columnCounter
 */
public int getColumnCounter()
{
    return columnCounter;
}

/**
 * Mutateur de columnCounter
 *
 * @param columnCounter columnCounter
 */
public void setColumnCounter(int columnCounter)
{
    this.columnCounter = columnCounter;
}

public List<DataTableColumn> getDataTableColumns() {
    return dataTableColumns;
}

}

/**
 * Accesseur de monoDataTables
 *
 * @return monoDataTables
 */
public List<MonoDataTable> getMonoDataTables()
{
    if (monoDataTables == null ) {
        monoDataTables = new ArrayList<MonoDataTable>();
    }
    return monoDataTables;
}

}

以这种方式借助于特定的函数:

public static void  addMonoDataTablesToQuadripole(Quadripole quadripole) {

    String directive = null;

    directive = "Autre Structure ou National 0";
    MonoDataTable newmonoDataTable = new MonoDataTable(directive);
    addFixedColumnsToMonoDataTable(newmonoDataTable);
    quadripole.getMonoDataTables().add(newmonoDataTable);

    directive = "Direction 3";
    MonoDataTable newmonoDataTable2 = new MonoDataTable(directive);
    addFixedColumnsToMonoDataTable(newmonoDataTable2);
    quadripole.getMonoDataTables().add(newmonoDataTable2);

    directive = "Direction 7";
    MonoDataTable newmonoDataTable3 = new MonoDataTable(directive);
    addFixedColumnsToMonoDataTable(newmonoDataTable3);
    quadripole.getMonoDataTables().add(newmonoDataTable3);

    directive = "Direction 10";
    MonoDataTable newmonoDataTable4 = new MonoDataTable(directive);
    addFixedColumnsToMonoDataTable(newmonoDataTable4);
    quadripole.getMonoDataTables().add(newmonoDataTable4);

}
/**
 * 
 * DOCUMENTEZ_MOI
 *
 * @param monoDataTable
 */

public static void addFixedColumnsToMonoDataTable(MonoDataTable monoDataTable) {

    int columnCounter = monoDataTable.getColumnCounter();
    String header = columnHeader + columnCounter;
    DataTableColumn newDataTableColumn = new DataTableColumn(header);
    monoDataTable.getDataTableColumns().add(newDataTableColumn);
    monoDataTable.setColumnCounter(++columnCounter);

    columnCounter = monoDataTable.getColumnCounter();
    header = columnHeader + columnCounter ;
    DataTableColumn newDataTableColumn2 = new DataTableColumn(header);
    monoDataTable.getDataTableColumns().add(newDataTableColumn2);
    monoDataTable.setColumnCounter(++columnCounter);

}

/**
 * 
 * DOCUMENTEZ_MOI
 *
 * @param monoDataTable
 */

public static void addNewColumnToMonoDataTable(MonoDataTable monoDataTable) {

    int columnCounter = monoDataTable.getColumnCounter();
    String header = columnHeader + columnCounter;
    DataTableColumn newDataTableColumn = new DataTableColumn(header);
    monoDataTable.getDataTableColumns().add(newDataTableColumn);
    monoDataTable.setColumnCounter(++columnCounter);
}

每次用户点击“+”时,结果都会在收到点击的确切行中添加一列。也许这个解决方案不是太优雅,但它对我有用。我希望,至少,它不是太愚蠢。