如何从使用Columns生成的DataTable行中获取数据?

时间:2019-09-13 10:00:41

标签: jsf primefaces

我在JSF中遇到问题。我使用Primefaces DataTable对象创建了一个动态表。动态是指我可以随时添加和删除列。为此,我受到了primefaces网站上给出的示例的启发。 DataTable由第一列组成,该列代表行的ID,然后是一个至其他几列,仅包含selectBooleanCheckbox对象。

DataTable image example

当我单击selectBooleanCheckbox时,我想在弹出窗口中显示该行的ID值以及相关列的标题。 但是我做不到,显示的不是好的值。

我在Java 6中使用JSF 2.0和Primefaces 6.2。

//Java object that represents the lines of my table
public class FunctionActionData
{
    //The boolean array represents each column of the array
    private Boolean[] isActivated;
    private String id;
}

我还有一个View(或MBean)对象将管理我的JSF应用:

@ManagedBean(name = "dtColumnsView")
@ApplicationScoped
public class ColumnsView implements Serializable
{
    /**
         * 
         */
    private static final long serialVersionUID = -749089990661485115L;

    private final static List<String> VALID_COLUMN_KEYS = new ArrayList<String>();

    private List<ColumnModel> columns;

    private List<FunctionActionData> functionActionDatas;

    @ManagedProperty("#{functionActionServices}")
    private FunctionActionServices service;

    @PostConstruct
    public void init()
    {
        functionActionDatas = service.createFunctionActionDatas();

        for(FunctionData data : service.getListData())
        {
            VALID_COLUMN_KEYS.add(data.getShortLabel());
        }

        createDynamicColumns();
    }

    private void createDynamicColumns()
    {
        String[] columnKeys = VALID_COLUMN_KEYS.toArray(new String[VALID_COLUMN_KEYS.size()]);
        columns = new ArrayList<ColumnModel>();

        int i = 0;
        for (String columnKey : columnKeys)
        {
            columns.add(new ColumnModel(columnKey.toUpperCase(), i));
            i++;
        }
    }

    public void updateColumns()
    {
        // reset table state
        UIComponent table = FacesContext.getCurrentInstance().getViewRoot().findComponent(":form:functionActionDatas");
        table.setValueExpression("sortBy", null);

        // update columns
        createDynamicColumns();
    }

    static public class ColumnModel implements Serializable
    {

        /**
                 * 
                 */
        private static final long serialVersionUID = -3314098148361435201L;
        private String header;
        private int property;

        public ColumnModel(String header, int property)
        {
            this.header = header;
            this.property = property;
        }

        public String getHeader()
        {
            return header;
        }

        public int getProperty()
        {
            return property;
        }
    }
}

最后是我页面的xhtml文件:

<f:view>
    <h:form id="form">

        <h:panelGrid columns="3" style="margin:10px 0">
            <p:commandButton value="Add feature"
                oncomplete="PF('addClmn').show()">
                <p:resetInput target="addColumn" />
            </p:commandButton>
        </h:panelGrid>

        <p:dataTable id="functionActionDatas" var="functionActionData"
            value="#{dtColumnsView.functionActionDatas}" scrollable="true"
            scrollHeight="500" widgetVar="functionActionDatasTable"
            filteredValue="#{dtColumnsView.filteredFunctionActionDatas}"
            styleClass="myTable">
            <p:column headerText="CODE CR"
                filterBy="#{functionActionData.regionalBankId}">
                <h:outputText value="#{functionActionData.regionalBankId}" />
            </p:column>
            <p:columns value="#{dtColumnsView.columns}" var="column"
                columnIndexVar="colIndex">
                <f:facet name="header">
                    <h:outputText value="#{column.header}" />
                    <br />
                    <p:commandButton value="Delete" />
                </f:facet>
                <center>
                    <p:selectBooleanCheckbox
                        value="#{functionActionData.isActivated[column.property]}"
                        update=":form:display" onchange="PF('dlg').show()" />
                </center>
            </p:columns>
        </p:dataTable>

        <p:dialog id="dialog" header="Values" modal="true" resizable="false"
            showEffect="fade" widgetVar="dlg">
            <p:ajax event="close" update="dialog" />
            <h:panelGrid columns="1" id="display">
                <h:outputText value="Value: #{column.property}" />
                <h:outputText value="Value: #{functionActionData.regionalBankId}" />
                <h:outputText value="Value: #{column.header}" />
            </h:panelGrid>
        </p:dialog>

        <p:dialog id="addColumn" header="Values" modal="true"
            resizable="false" showEffect="fade" widgetVar="addClmn">
            <h:panelGrid columns="2" id="display2">
                <h:outputText value="Short label: " />
                <h:inputText id="msgShortLabel"
                    value="#{dtColumnsView.msgShortLabel}" />
                <h:outputText value="Feature label: " />
                <h:inputText id="msgLongLabel"
                    value="#{dtColumnsView.msgLongLabel}" />
                <p:commandButton update="functionActionDatas"
                    action="#{dtColumnsView.updateColumns}" value="Add"
                    process="@parent"
                    oncomplete="PF('functionActionDatasTable').clearFilters()">
                </p:commandButton>
            </h:panelGrid>
        </p:dialog>
    </h:form>
</f:view>

您将看到有一个打开对话窗口的按钮,该对话框允许后验者添加或删除列,但这不是我们感兴趣的。

当我们单击selectBooleanCheckBox时,我们感兴趣的是打开的窗口。

pop-up result

无论您单击哪种selectBooleanCheckBox,我总是得到相同的结果。正如您在弹出窗口的图像上看到的那样,我没有获得该行的ID,也无法获得单击的selectBooleanCheckBox的优良牧民和正确的冒号。

0 个答案:

没有答案