2011-11-18 51 views
1

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

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

它bassicly设置所有结果对象为可编辑的。但是当我按下它加载页面并没有任何事情发生。

我已经按照在www.mkyoung.com jsf tutorial

+0

看起来'结果'是表中的一个条目。它指的是哪一个? – Thomas

+0

它引用dataTable中的res对象。不知道为什么我没有将它与managedBean.editAction(res)一起传递,现在就做。但它仍然不起作用... – jonas

回答

2

啧啧不知道你managedBean是什么样子,下面是一些提示:

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

    如果你想使所有条目编辑,您可能已在托管bean设置一个全球性的属性,然后检查你的表或遍历结果列表,并呼吁setEditable(true)在该列表中的每个条目。

    请注意,在您遵循的示例中,editAction()实际上采用的对象参数order定义orderList中的哪些条目将设置为可编辑。
+0

viewResultList()只返回ArrayList对象,所以这不更新表,只表示数据。要么? editAction()缺少我现在更新的结果参数。但是这仍然不起作用.. – jonas

+0

@ zo0mbie只是一些额外的(和微不足道的)问题:你是否检查过editAction(res)被调用?你把''换成了''吗?你没有告诉我们,但我认为你正在使用JSF 2和一个兼容的容器,不是吗?我知道这些问题是微不足道的,但我宁愿消除可能被假定并因此被忽视的最明显的事情。 – Thomas

+0

editAction(res)被调用,我可以在这里访问res。 包裹在内。我正在使用JSF2。我不确定你的容器是什么意思? – jonas

0

非常感谢您的帮助。

我想出了这个问题。数据从哪里填充 - >数据库。 和editAction(res)将状态保存到本地数组列表中。 因此,当我更新editable它不会保存到数据库。

+0

因此,刷新视图时数据已从数据库重新加载? – Thomas

+0

是的。 >< – jonas

相关问题