当我尝试更新h:dataTable中的单元格时,它不会这样做

时间:2011-11-18 10:25:16

标签: java jsf datatable facelets

我有一个h:dataTable,其中包含从带有自定义对象Result的ArrayList生成的数据。 当我尝试启用单元格编辑时,它不允许我这样做。我怀疑它从服务器请求数据并覆盖我最后的选择。

我的<h:dataTable>表单和完整的xhtml文档

<!-- language: xhtml -->
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>IGNORED</title>
    </h:head>
    <h:body>
        <ui:composition template="../templates/masterLayout.xhtml">
            <ui:define name="windowTitle"> #{msgs.viewResultsTitle}</ui:define>
            <ui:define name="content">
                <h:form>
                    <h:dataTable value="#{managedBean.viewResultList}" var="res"
                                 styleClass="tracks"
                                 headerClass="trackHeader"
                                 columnClasses="oddColumn,evenColumn">
                        <h:column>
                            <f:facet name="header">#{msgs.trackID}</f:facet>
                                #{res.track_name}
                        </h:column>
                        <h:column>
                            <f:facet name="header">#{msgs.startnumber}</f:facet>
                                <h:inputText value="#{res.startnumber}" size="5" rendered="#{res.editable}" />
                                <h:outputText value="#{res.startnumber}" rendered="#{not res.editable}" />
                        </h:column>
                        <h:column>
                            <f:facet name="header">#{msgs.time}</f:facet>
                                <h:inputText value="#{res.time}" size="10" rendered="#{res.editable}" >
                                    <f:validator validatorId="ResultValidator" />
                                    <f:converter converterId="ResultConverter" />                                    
                                </h:inputText>
                                <h:outputText value="#{res.time}" rendered="#{not res.editable}" />
                        </h:column>
                        <h:column>
                            <f:facet name="header">#{msgs.runnerID}</f:facet>
                                #{res.runner_name}
                        </h:column>
                        <h:column>
                            <f:facet name="header">#{msgs.divID}</f:facet>
                                #{res.division_value}
                        </h:column>
                        <h:column>
                            <h:commandLink value="#{msgs.edit}" action="#{managedBean.editAction(res)}" rendered="#{not res.editable}"/>
                       </h:column>
                        <h:column>
                                <h:commandLink value="#{msgs.saveChanges}" action="#{managedBean.saveAction(res)}" />
                       </h:column>
                </h:dataTable>
            </h:form>
            </ui:define>
        </ui:composition>
    </h:body>
</html>

它调用的managedBean.editAction如下所示:

public String editAction(Result result) {
result.setEditable(true);
return null;
}

将贝斯特设置的所有结果对象设置为可编辑。但是,当我按下它时,它会加载页面,没有任何事情发生。

我跟随了www.mkyoung.com jsf tutorial

的啧啧

2 个答案:

答案 0 :(得分:2)

在不知道managedBean的样子的情况下,这里有一些提示:

  • viewResultList()不应更新结果列表,只能返回结果列表。否则,如果您不首先更新模型,则可能会覆盖对该列表中条目的更改(例如,如果从那里加载结果,则将其写入数据库)。
  • result.setEditable(true);似乎引用了列表中的一个对象,或者它甚至可能引用该列表中的 not 对象。请注意,只有该对象设置为可编辑。

    如果要使所有条目都可编辑,则必须在托管bean中设置全局属性并在表中检查或迭代结果列表并在每个条目上调用setEditable(true)那份清单
    请注意,在您所遵循的示例中,editAction()实际上采用了对象参数order,该参数定义orderList中的哪个条目将设置为可编辑。

答案 1 :(得分:0)

非常感谢您的帮助。

我弄明白了这个问题。这是从数据填充的位置 - &gt;一个数据库。 并且editAction(res)将州保存到当地的arraylist。 因此,当我更新editable时,它未保存到数据库中。