我是jsf和Primefaces的新手,对数据表有一个奇怪的问题: 我使用行编辑功能。一切运作良好,包括将更改的值保存到数据库。但是在编辑模式结束后,编辑行的最后两个字段没有显示(没有边框也没有值,似乎这些字段没有呈现)。编辑行上方和下方的字段显示正确。
这是代码。请帮忙,我绝望了..
<?xml version="1.0" encoding="UTF-8" ?>
<ui:composition template="../common/BaseTemplate.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<ui:define name="pageTitle">Meilensteine</ui:define>
<ui:define name="body">
<f:event listener="#{meilensteineController.init}" type="preRenderView" />
<f:subview id="pnlMeilensteine" binding="#{root}">
<div class="MainZoom">
<p:dataTable id="tblMeilensteine" binding="#{table}" widgetVar="MeilensteineSearchTable"
var="item" value="#{meilensteineController.list}" editable="true"
filteredValue="#{meilensteineController.filteredValue}"
scrollable="true" liveScroll="false"
scrollHeight="#{screen.screenHeight}" scrollWidth="#{screen.screenWidth}"
selectionMode="single" rowKey="#{item.id}" scrollRows="100">
<p:ajax event="rowEdit" listener="#{meilensteineController.onEdit}" update=":form:messages" />
<p:ajax event="rowEditCancel" update=":form:messages" />
<p:column style="min-width: 35px; width: 35px; ">
<p:rowEditor />
</p:column>
<p:column rendered="false" sortBy="#{item.id}" filterBy="#{item.id}"
filterStyle="display: none; visibility: hidden;" headerText="Id">
<h:outputText value="#{item.id}" />
</p:column>
<p:column rendered="false" sortBy="#{item.projekt}" filterBy="#{item.projekt}"
filterStyle="display: none; visibility: hidden;" headerText="Projekt">
<h:outputText value="#{item.projekt}" />
</p:column>
<p:column style="min-width: 300px; width: 300px; " sortBy="#{item.bezeichnung}" filterBy="#{item.bezeichnung}"
filterStyle="display: none; visibility: hidden;" headerText="Bezeichnung">
<p:cellEditor >
<f:facet name="output">
<h:outputText value="#{item.bezeichnung}" />
</f:facet>
<f:facet name="input">
<p:inputText readonly ="#{item.posInfoscreen > 0}" style="width:300px" value="#{item.bezeichnung}" />
</f:facet>
</p:cellEditor>
</p:column>
<p:column style="min-width: 75px; width: 75px;" sortBy="#{item.datumSoll}" filterBy="#{item.datumSoll}"
filterStyle="display: none; visibility: hidden;" headerText="Datumsoll">
<p:cellEditor>
<f:facet name="output">
<h:outputText style="color: #{meilensteineController.getBgcolor(item.datumSoll,item.erledigt)}" value="#{item.datumSoll}">
<f:convertDateTime type="date" pattern="dd.MM.yyyy" />
</h:outputText>
</f:facet>
<f:facet name="input">
<p:calendar readonlyInput="true" navigator="true"
value="#{item.datumSoll}" pattern="dd.MM.yyyy"
label="Datum Soll" styleClass="normalDate"></p:calendar>
</f:facet>
</p:cellEditor>
</p:column>
<p:column style="min-width: 75px; width: 75px; " sortBy="#{item.poenalisiert}" filterBy="#{item.poenalisiert}"
filterStyle="display: none; visibility: hidden;" headerText="Pönalisiert">
<p:cellEditor>
<f:facet name="output">
<p:selectBooleanCheckbox disabled="true"
value="#{item.poenalisiert}" />
</f:facet>
<f:facet name="input">
<p:selectBooleanCheckbox disabled="false"
value="#{item.poenalisiert}" />
</f:facet>
</p:cellEditor>
</p:column>
<p:column style="min-width: 75px; width: 75px; " sortBy="#{item.erledigt}" filterBy="#{item.erledigt}"
filterStyle="display: none; visibility: hidden;" headerText="Erledigt">
<p:cellEditor>
<f:facet name="output">
<p:selectBooleanCheckbox disabled="true" value="#{item.erledigt}" />
</f:facet>
<f:facet name="input">
<p:selectBooleanCheckbox disabled="false"
value="#{item.erledigt}" />
</f:facet>
</p:cellEditor>
</p:column>
<p:column style="min-width: 75px; width: 75px; " sortBy="#{item.datumIst}" filterBy="#{item.datumIst}"
filterStyle="display: none; visibility: hidden;" headerText="Datumist">
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{item.datumIst}">
<f:convertDateTime type="date" pattern="dd.MM.yyyy" />
</h:outputText>
</f:facet>
<f:facet name="input">
<p:calendar readonlyInput="true" navigator="true"
value="#{item.datumIst}" pattern="dd.MM.yyyy" label="Datum Ist"
styleClass="normalDate"></p:calendar>
</f:facet>
</p:cellEditor>
</p:column>
<p:column style="min-width: 200px; width: 200px; " sortBy="#{item.bemerkung}" filterBy="#{item.bemerkung}"
filterStyle="display: none; visibility: hidden;" headerText="Bemerkung">
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{item.bemerkung}" />
</f:facet>
<f:facet name="input">
<p:inputText style="width:200px" value="#{item.bemerkung}" />
</f:facet>
</p:cellEditor>
</p:column>
<p:column style="min-width: 150px; width: 150px; " sortBy="#{item.user}" filterBy="#{item.user}" filterStyle="display: none; visibility: hidden;" headerText="User">
<h:outputText value="#{item.user}" />
</p:column>
<p:column style="min-width: 150px; width: 150px; " sortBy="#{item.link}" filterBy="#{item.link}" filterStyle="display: none; visibility: hidden;" headerText="Link">
<p:commandLink styleClass="ui-icon ui-icon-circle-plus" actionListener="#{meilensteineController.PickRowToUpload(item)}"
oncomplete="PF('uploadFileDialog').show();" width="20px" rendered="#{item.link eq '' or item.link eq null}"/>
<h:commandLink value="#{meilensteineController.retriveActualFile(item.link)}" rendered="#{not(item.link eq '' or item.link eq null)}">
<p:fileDownload value="#{meilensteineController.downloadFile(item.link)}" />
</h:commandLink>
<p:commandLink styleClass="ui-icon ui-icon-circle-close" actionListener="#{meilensteineController.PickRowToUpload(item)}"
oncomplete="PF('confirmationDialog').show();" rendered="#{not(item.link eq '' or item.link eq null)}"/>
</p:column>
<p:column style="min-width: 85px; width: 85px; " sortBy="#{item.letzterEintrag}" filterBy="#{item.letzterEintrag}"
filterStyle="display: none; visibility: hidden;" headerText="LetzterEintrag">
<h:outputText value="#{item.letzterEintrag}">
<f:convertDateTime type="date" pattern="dd.MM.yyyy" />
</h:outputText>
</p:column>
<p:column style="min-width: 35px; width: 35px; " sortBy="#{item.posInfoscreen}" filterBy="#{item.posInfoscreen}"
filterStyle="display: none; visibility: hidden;" headerText="Pos">
<h:outputText value="#{item.posInfoscreen}" />
</p:column>
<p:column style="min-width: 85px; width: 85px; " sortBy="#{item.doc}" filterBy="#{item.doc}"
filterStyle="display: none; visibility: hidden;" headerText="Dokument">
<h:outputText value="#{item.doc}" />
</p:column>
<p:column style="min-width: 30px; width: 30px; ">
<p:rowEditor />
</p:column>
<p:column rendered="true" style="min-width: 30px; width: 30px; ">
<p:commandLink styleClass="ui-icon ui-icon-trash"
actionListener="#{meilensteineController.PickRowToDelete(item)}"
process="@this" oncomplete="PF('confirmDelDialog').show();"
update="#{meilensteineController.cid(deldlMeilensteine)},:form:messages" />
</p:column>
<f:facet name="footer" style="align:left">
<table class="tabFooter" style="width: 350px;">
<tr>
<td class="tabFooter" style="width: 50px"><p:commandButton
id="New" value="New" title="Creates new recordset"
actionListener="#{meilensteineController.initAddnew}"
oncomplete="PF('addNewDialog').show();" update=":form:messages"></p:commandButton>
<p:tooltip for="New" showEvent="mouseover" hideEvent="mouseout" />
</td>
<td class="tabFooter" style="width: 100px">Records:
#{meilensteineController.count}</td>
<td><h:outputText value=" Search:" /> <p:inputText
styleClass="tabFooter" id="globalFilter"
onkeyup="PF('MeilensteineSearchTable').filter()" style="width:250px;" />
</td>
</tr>
</table>
</f:facet>
</p:dataTable>
<p:dialog header="Bitte Löschen bestätigen" widgetVar="confirmDelDialog" resizable="false" modal="false">
<h:panelGrid id="delMeilensteine" binding="#{deldlMeilensteine}" columns="2" cellpadding="4" style="margin:0 auto;">
<h:outputText value="Bezeichnung" />
<h:outputText value="#{meilensteineController.rowToDelete.bezeichnung}" style="font-weight:bold"/>
<p:commandButton id="del" actionListener="#{meilensteineController.Delete( meilensteineController.rowToDelete)}" process="@this" oncomplete="PF('confirmDelDialog').hide()"
update="tblMeilensteine,:form:messages" value="#{res['GEN_Delete']}"/>
<p:commandButton id="cancelDel" onclick="PF('confirmDelDialog').hide()" value="#{res['GEN_Cancel']}"/>
</h:panelGrid>
</p:dialog>
<p:dialog header="Neuer Meilenstein" widgetVar="addNewDialog" resizable="false" id="addNewDlg" modal="false">
<h:panelGrid id="addNew" columns="2" cellpadding="4" style="margin:0 auto;">
<h:outputText value="Bezeichnung" />
<p:inputText id="Bezeichnung" value="#{meilensteineController.newRow.bezeichnung}"/>
<p:commandButton id="addButton" action="#{meilensteineController.addRow( meilensteineController.newRow)}" process="addNewDlg @this" update="tblMeilensteine,:form:messages" value="#{res['GEN_Save']}"/>
<p:commandButton id="cancelAdd" onclick="PF('addNewDialog').hide()" value="#{res['GEN_Cancel']}"/>
</h:panelGrid>
</p:dialog>
</div>
</f:subview>
<p:dialog width="500" header="File Upload" widgetVar="uploadFileDialog" resizable="false" modal="false" >
<p:panel id="uploadFile" styleClass="nobord">
<table style="width:100%">
<tr>
<td>
<p:fileUpload fileUploadListener="#{meilensteineController.uploadFile}"
mode="advanced" dragDropSupport="true" oncomplete="PF('uploadFileDialog').hide()"
update="messages2,form:pnlMeilensteine:tblMeilensteine" sizeLimit="50000000" multiple = "false" >
</p:fileUpload>
<p:growl id="messages2" showDetail="true"/>
</td>
</tr>
</table>
</p:panel>
</p:dialog>
<p:confirmDialog message="#{res['MIL_ConfirmMessage']}" header="Confirmation" widgetVar="confirmationDialog" resizable="false" modal="false" >
<p:commandButton value="#{res['MIL_Yes']}" oncomplete="PF('confirmationDialog').hide()"
update="messages3,form:pnlMeilensteine:tblMeilensteine" action="#{meilensteineController.deleteFile}" />
<p:commandButton value="#{res['MIL_No']}" onclick="PF('confirmationDialog').hide()" type="button" />
<p:growl id="messages3" showDetail="true"/>
</p:confirmDialog>
</ui:define>
</ui:composition>