【问题标题】:Dynamic Column in JSF Datatable JSF2.0JSF 数据表 JSF2.0 中的动态列
【发布时间】:2012-01-19 03:50:27
【问题描述】:

我需要你的帮助。我正在使用 JSF 2.0,并且我有一个数据表组件。数据表中的一列是操作列,我需要创建一个工具栏,其中包含不同类型的操作源组件,例如命令按钮、链接等。操作源的类型在运行时确定,操作源的数量也在运行。我如何在 JSF 2.0 中实现这一点

           <p:dataTable value="#{listBranchBean1.rowDataModel}" var="rowItem"
              id="myId" paginator="true"
              paginatorTemplate="{FirstPageLink}{PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}{RowsPerPageDropdown} "
              rowsPerPageTemplate="10,5,2" previousPageLinkLabel="&lt;"
              nextPageLinkLabel="&gt;" widgetVar="branchTable"
              selection="#{listBranchBean1.selectedBranchesPrime}"
              resizableColumns="true"
              sortBy="#{rowItem.columnsValueMap['branchId'].value}">
              <f:facet name="header">
                 <p:outputPanel>
                    <h:outputText value="Search all fields:" />
                    <p:inputText id="globalFilter" onkeyup="branchTable.filter()"
                       style="width:150px" />
                 </p:outputPanel>
              </f:facet>
              <p:column selectionMode="multiple" style="text-align:left">
                 <f:facet name="header">
                    <h:outputText value="Select" />
                 </f:facet>
                 <h:outputText value="#{rowItem.uniqueId}" />
              </p:column>
              <p:column
                 rendered="#{listBranchBean1.columnsMap['objectId'].hidden==false}"
                 sortBy="#{rowItem.columnsValueMap['objectId'].value}"
                 filterBy="#{rowItem.columnsValueMap['objectId'].value}">
                 <f:facet name="header">
                    <h:outputText
                       value="#{listBranchBean1.columnsMap['objectId'].displayLabel}" />
                 </f:facet>
                 <h:outputText
                    value="#{rowItem.columnsValueMap['objectId'].value}" />
              </p:column>
              <p:column
                 rendered="#{listBranchBean1.columnsMap['actions'].hidden==false}">
                 <f:facet name="header">
                    <h:outputText
                       value="#{listBranchBean1.columnsMap['actions'].displayLabel}" />
                 </f:facet>
                 <p:toolbar>
                    <p:toolbarGroup>
                       <ui:repeat var="action"
                          value="#{rowItem.columnsValueMap['actions'].value}">
                          <p:commandButton title="#{action}" type="button">
                          </p:commandButton>
                       </ui:repeat>
                    </p:toolbarGroup>

                 </p:toolbar>
              </p:column>
           </p:dataTable>

我想用类似的东西替换最后一列

                 <p:toolbar binding="#{listBranchBean1.getActions(rowItem)}">
                 </p:toolbar>

感谢您的帮助

普拉吉什·奈尔

【问题讨论】:

    标签: jsf dynamic jsf-2 datatable


    【解决方案1】:

    JSF 中的构建时间和渲染时间是有区别的。像&lt;ui:repeat&gt; 这样的构建时标签能够动态创建新组件,但它们只能使用构建时可用的数据。

    但是,使用 Java 也可以通过编程方式更改组件树,但这也不能在任何时候发生。执行此操作的安全时刻是preRenderViewEvent,它比构建时间时刻(即restore view 阶段)晚了好一点,届时您应该拥有所需的所有数据。

    在此事件的事件处理程序中,您可以引用绑定到支持 bean 的工具栏,并以编程方式向其中添加列。

    例子见:

    请注意,如果您的支持 bean 是 @ViewScoped,您最好不要使用绑定,而是使用手动查找。这是由于 JSF 中的视图范围和绑定组件存在一些错误。

    【讨论】:

    • 1.范围可以由最终用户定义,因为它是一个可定制的解决方案。到目前为止,它是一个 ViewScope。如果您看到可能是最后一列,则 rowItem 是数据表 var。所以我需要获取特定于该行的操作列。每行都会有所不同
    • 如果您需要动态列,请使用 arjan 的解决方案。如果您还需要每行动态内容,请放入多个组件并有条件地呈现它们。数据表中的每行不能有任意组件,因为行并不真正存在于那里(它是用不断变化的数据呈现的列)。如果你需要的话,也许看看一些数据网格组件。
    【解决方案2】:

    以下代码将根据所选国家/地区创建动态列

    public void loadDynamicList() throws Exception {
    int i=0;
     dynamicList = new ArrayList<List<String>>();
    dynamicList.add(Arrays.asList(new String[] { "ID1" }));
    existingCountryList = new ArrayList<Country>();
    String countryCode="US";
    existingCountryList.add(getCountryService().getCountryByCode(countryCode));
    Country country=getCountryService().getCountryByCode(countryCode);
    countryLanguageSet=country.getCountryLanguage();
    i=country.getCountryLanguage().size();
    dynamicHeaders = new String[i] ;
    int j=0;
       for (CountryLanguage count: countryLanguageSet) {
        System.out.println(count.getLanguage().getLanguageName());
        dynamicHeaders[j]=count.getLanguage().getLanguageName();
        j++;
    }
     }
    public void populateDynamicDataTable() {
    debugLogger.debug("populateDynamicDataTable:Enter");
    // Create <h:dataTable value="#{myBean.dynamicList}" var="dynamicItem">.
    HtmlDataTable dynamicDataTable = new HtmlDataTable();
    dynamicDataTable.setValueExpression("value", createValueExpression("#{relationBean.dynamicList}", List.class));
    dynamicDataTable.setVar("dynamicItem");
    
    // Iterate over columns.
    for (int i = 0; i < dynamicHeaders.length; i++) {
        // Create <h:column>.
        HtmlColumn column = new HtmlColumn();
        dynamicDataTable.getChildren().add(column);
        // Create <h:outputText value="dynamicHeaders[i]"> for <f:facet name="header"> of column.
        HtmlOutputText header = new HtmlOutputText();
        header.setValue(dynamicHeaders[i]);
        column.setHeader(header);
         HtmlInputText input=new HtmlInputText();
        column.getChildren().add(input);
    }
       dynamicDataTableGroup = new HtmlPanelGroup();
    dynamicDataTableGroup.getChildren().add(dynamicDataTable);
    debugLogger.debug("populateDynamicDataTable:Exit");
    }
    
    public HtmlPanelGroup getDynamicDataTableGroup() throws Exception {
    // This will be called once in the first RESTORE VIEW phase.
    if (dynamicDataTableGroup == null) {
        loadDynamicList(); // Preload dynamic list.
        populateDynamicDataTable(); // Populate editable datatable.
    }
    
    return dynamicDataTableGroup;
    }
    
    
    public List<List<String>> getDynamicList() {
    return dynamicList;
    }
    public void setDynamicList(List<List<String>> dynamicList) {
    this.dynamicList = dynamicList;
    }
    
    public void setDynamicDataTableGroup(HtmlPanelGroup dynamicDataTableGroup) {
    this.dynamicDataTableGroup = dynamicDataTableGroup;
    }
    
    public ValueExpression createValueExpression(String valueExpression, Class<?> valueType) {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    return facesContext.getApplication().getExpressionFactory().createValueExpression(
        facesContext.getELContext(), valueExpression, valueType);
    }
    

    【讨论】:

      猜你喜欢
      • 2012-07-20
      • 1970-01-01
      • 2011-12-25
      • 2015-08-14
      • 1970-01-01
      • 2013-12-11
      • 2023-03-21
      • 2013-07-01
      相关资源
      最近更新 更多