当我尝试更新 h:dataTable 中的单元格时,它不会执行此操作

发布于 2024-12-17 04:58:59 字数 3856 浏览 0 评论 0原文

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

我的 表单和完整的 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教程

I have an h:dataTable with data generated from an ArrayList with custom object Result.
When I try to enable editing of cells, it will not allow me to do so. I suspect that it request data from the server and overrides my last choice.

My <h:dataTable> form and the complete xhtml document

<!-- 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>

It calls the managedBean.editAction wich looks like this:

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

It bassicly set all the result objects to editable. But when I press the it loads the page and nothing happends.

I've followed the tut at www.mkyoung.com jsf tutorial

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

少跟Wǒ拽 2024-12-24 04:58:59

在不知道您的 managementBean 是什么样子的情况下,这里有一些提示:

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

    如果您想让所有条目都可编辑,则必须在托管 Bean 中设置全局属性并在表中检查该属性,或者迭代结果列表并对每个条目调用 setEditable(true) 该列表中的条目。

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

Without knowing what your managedBean looks like, here are some hints:

  • viewResultList() should not update the result list but only return it. Otherwise changes to entries in that list might be overwritten if you don't update your model first (e.g. write them to the database if you load the results from there).
  • result.setEditable(true); seems to refer to one object in your list, or it might even refer to an object not in that list. Note that only that object is set to editable.

    If you want make all entries editable, you either have to set a global property in your managed bean and check that in your table or iterate over the result list and call setEditable(true) on each entry in that list.

    Note that in the example you followed, the editAction() actually takes an object parameter order which defines which entry in orderList will be set to editable.

疯狂的代价 2024-12-24 04:58:59

非常感谢您的帮助。

我发现了问题所在。它是从 -> 填充数据的地方。一个数据库。
editAction(res) 将状态保存到本地数组列表中。
因此,当我更新editable时,它没有保存到数据库中。

Thank you very much for the help.

I figured out the problem. It was with from where the data was populated from -> a database.
And editAction(res) saved the state to a local arraylist.
So when I updated the editable it were not saved to the database.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文