0

我有一个小的 jsf/primefaces 应用程序,它带有一个显示(订单)项目的 datgrid。现在我想在对话期间添加项目。

  1. 我通过单击按钮打开对话框。- 作品
  2. 我想将对话框中的值提交到 bean 并更新数据网格。如果我使用默认值(不是来自对话框)它可以工作。该项目显示在数据网格中,对话框关闭。这意味着。-addItem 功能有效 -update 有效

但是如果我想从对话框中添加值,我会得到一个空指针异常。所以我的值不会在 bean 中设置。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">
    <p:fieldset legend="Positionen" toggleable="true" toggleSpeed="500" styleClass="mbsFieldSet">
        <h:form id="form_positions">

        <p:growl id="messages" showDetail="true" /> 
        <!-- Add position mask -->

        <!-- Button to open the open position mask -->
        <p:commandButton id="btOpenAddPositionMask" value="Position via Dialog" onclick="dlg.show();">
        </p:commandButton>

        <p:dataTable var="banfPosition" value="#{banfPositionBean.lsBanfPositions}"
            id="tableBanfPositions" editable="true" >
            <f:facet name="header">Positionen</f:facet>

            <!-- AJAX Events for editing position values -->
            <p:ajax event="rowEdit" listener="#{banfPositionBean.onEdit}"
                update=":form_positions:messages"/>

            <p:ajax event="rowEditCancel" listener="#{banfPositionBean.onCancel}"
                update=":form_positions:tableBanfPositions"  />


            <p:column headerText="Menge" style="width:50px">
                <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{banfPosition.amount}" />
                    </f:facet>
                    <f:facet name="input">
                        <p:inputText value="#{banfPosition.amount}" style="width:100%" />
                    </f:facet>
                </p:cellEditor>
            </p:column>

            <p:column headerText="Matr. / Lager-Nr." style="width:125px">
                <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{banfPosition.stockNumber}" />
                    </f:facet>
                    <f:facet name="input">
                        <p:inputText value="#{banfPosition.stockNumber}" style="width:100%" />
                    </f:facet>
                </p:cellEditor>
            </p:column>
            <p:column headerText="Artikel" style="width:125px">
                <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{banfPosition.article}" />
                    </f:facet>
                    <f:facet name="input">
                        <p:inputText value="#{banfPosition.article}" style="width:100%" />
                    </f:facet>
                </p:cellEditor>
            </p:column>


            <p:column headerText="Preis/Einheit" style="width:125px">
                <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{banfPosition.price}" />
                    </f:facet>
                    <f:facet name="input">
                        <p:inputText value="#{banfPosition.price}" style="width:100%" />
                    </f:facet>
                </p:cellEditor>
            </p:column>
            <p:column headerText="Gesamtpreis" style="width:125px">
                <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{banfPosition.sum}" />
                    </f:facet>
                    <f:facet name="input">
                        <p:inputText value="#{banfPosition.sum}" style="width:100%" />
                    </f:facet>
                </p:cellEditor>
            </p:column>
            <p:column headerText="Etat-Nr" style="width:125px">
                <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{banfPosition.etat}" />
                    </f:facet>
                    <f:facet name="input">
                        <p:inputText value="#{banfPosition.etat}" style="width:100%" />
                    </f:facet>
                </p:cellEditor>
            </p:column>
            <p:column headerText="Anlagen-Nr" style="width:125px">
                <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{banfPosition.complex}" />
                    </f:facet>
                    <f:facet name="input">
                        <p:inputText value="#{banfPosition.complex}" style="width:100%" />
                    </f:facet>
                </p:cellEditor>
            </p:column>

            <p:column headerText="Ändern" style="width:20px; text-align:center">
                <p:rowEditor />
            </p:column>
            <p:column headerText="Löschen" style="width:20px; text-align:center" >
                <p:commandButton id="deletePos" actionListener="#{banfPositionBean.deletePos(banfPosition)}" 
                 update=":form_positions:tableBanfPositions" ajax="true" icon="ui-icon ui-icon-close" iconPos="center"
                title="Löscht den Eintrag in dieser Zeile." />
            </p:column>
        </p:dataTable>


        </h:form>
    </p:fieldset>

    <p:dialog header="Neue Position hinzufügen" widgetVar="dlg"
        resizable="false">
        <h:panelGrid columns="2" style="margin-bottom:10px">

                <h:outputLabel value="Artikel:" />
                <p:selectOneMenu id="selectArticleForPosition"
                    value="#{banfPositionBean.selectedArticle}" var="art"
                    panelStyle="width:150px" style="width:260px" effect="fade"
                    filterMatchMode="starts" filter="true">
                    <f:selectItems value="#{dataBean.lsArticle}" var="article"
                        itemLabel="#{article.name}" itemValue="#{article}" />
                    <p:column>
                #{art.id} - #{art.name}
            </p:column>
                </p:selectOneMenu>
            </h:panelGrid>

            <p:commandButton id="btAddPosition" value="Position einfügen"
                actionListener="#{banfPositionBean.addPos()}"
                update=":form_positions:tableBanfPositions" oncomplete="dlg.hide();"
                ajax="true" process="@all" type="submit">
            </p:commandButton>

    </p:dialog>
</ui:composition>

我尝试使用 h:form-Tag,如http://www.primefaces.org/showcase/ui/dialogForm.jsf所示,但如果我添加这个。

<p:dialog header="Neue Position hinzufügen" widgetVar="dlg"
        resizable="false">
        <h:form id="form_dialog">
        <h:panelGrid columns="2" style="margin-bottom:10px">

                <h:outputLabel value="Artikel:" />
                <p:selectOneMenu id="selectArticleForPosition"
                    value="#{banfPositionBean.selectedArticle}" var="art"
                    panelStyle="width:150px" style="width:260px" effect="fade"
                    filterMatchMode="starts" filter="true">
                    <f:selectItems value="#{dataBean.lsArticle}" var="article"
                        itemLabel="#{article.name}" itemValue="#{article}" />
                    <p:column>
                #{art.id} - #{art.name}
            </p:column>
                </p:selectOneMenu>
            </h:panelGrid>

            <p:commandButton id="btAddPosition" value="Position einfügen"
                actionListener="#{banfPositionBean.addPos()}"
                update=":form_positions:tableBanfPositions" oncomplete="dlg.hide();"
                ajax="true" process="@all" type="submit">
            </p:commandButton>
            </h:form>
    </p:dialog>

页面重新加载,但我的 bean 也不会被调用。

有谁知道我做错了什么?感谢帮助。

------------------------------------------------------- *编辑* ---- --------------------------------------

我尝试使用 p:inputText 而不是 selectOneMenu 来调用 bean。

<p:dialog header="Neue Position hinzufügen" widgetVar="dlg"
        resizable="false" appendToBody="true">
        <h:form id="form_dialog">
        <h:panelGrid columns="2" style="margin-bottom:10px">
                <h:outputLabel for="inputTxt" value="Artikel:" />
                <p:inputText id="inputTxt" value="#{banfPositionBean.testStr}"></p:inputText>
            </h:panelGrid>

            <p:commandButton id="btAddPosition" value="Position einfügen"
                actionListener="#{banfPositionBean.addPos()}"
                update=":form_positions:tableBanfPositions" oncomplete="dlg.hide();">
            </p:commandButton>
        </h:form>
    </p:dialog>

所以我只需要找出为什么它不适用于selectOneMenu。

4

1 回答 1

0

首先我不知道什么是属性类型,我猜它与(in ) 属性selectedArticle的类型相同。您应该定义转换器,或者另一方面,您应该将 of 绑定为与 相同的类型,并设置为。articleitemValuevalueselectOneMenuarticle.iditemValue#{article.id}

于 2013-02-14T09:52:16.917 回答