【问题标题】:Is it posible to add a new column to one specific row of a datatTable in jsf?是否可以在 jsf 中的数据表的特定行中添加新列?
【发布时间】:2016-11-07 05:33:21
【问题描述】:

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

【问题讨论】:

    标签: datatables


    【解决方案1】:

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


    可能性:

    在 #{data.optionalValues} 上使用 and 循环使用嵌套循环,甚至可能是另一个

    <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 行有 2 列,第 2 行有 6 列,第 3 行有 1 列,等等,您将如何在 HTML 中生成技术上有效的表格?
    【解决方案2】:

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

    首先,我想要的是其中的列是特定的表单字段。但这将是用户 谁决定是否要添加新的表单域。正如你在图中看到的,这就是我想要的:

    为了做到这一点,我使用了 primefaces &lt;p:columns&gt; 可能性。但是由于这个标签在特定的支持 bean 的帮助下为 dataTable 的所有行添加了一列,所以我已经用尽了&lt;ui:repeat&gt; 以便剩余的 dataTable 只有一行,正如您在 xhtml 代码中看到的那样:

    研究类型列表

                        <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);
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-05
      相关资源
      最近更新 更多