带有 contextMenu、multipleSelection、rowEdit 的数据表

DataTable with contextMenu, multipleSelection, rowEdit

提问人:leostiw 提问时间:4/8/2013 最后编辑:partlovleostiw 更新时间:11/14/2019 访问量:1355

问:

所以我有一个非常复杂的 dataTable。它应该能够编辑单行、选择多行以及为每一行显示上下文菜单。单行编辑工作正常,多选工作正常,我唯一的问题是,每当我尝试在右键单击的行上打开 contextMenu 时,所选 tableItem 的值都是 null。只有当我在行上明确单击(左键单击),然后右键单击以显示上下文菜单时,它才有效。这很不方便,我想右键单击 contextMenu 以显示所选的 itemValue。

我知道还有其他一些关于这个问题的帖子,但没有真正的解决方案或解决方法,所以我希望你能帮助我。

这是我的代码:

  <p:contextMenu id="schadenTableContextMenu" for="todoSchadenTable"
     style="width: 200px; ">

     <p:submenu id="schadenTableSetAsReadSBM" label="Markieren als"
        styleClass="my-menu">
        <p:menuitem id="schadenTableSetAsReadSBMMI1" value="Gelesen"
           style="width: 167px;" icon="ui-icon-mail-open" ajax="true"
           partialSubmit="true" process="@this"
           action="#{todoLeseHistController.setAlsGelesen()}" update=":mainForm" />

        <p:menuitem id="schadenTableSetAsReadSBMMI2" value="Ungelesen"
           style="width: 167px;" icon="ui-icon-mail-closed" ajax="true"
           partialSubmit="true" process="@this"
           action="#{todoLeseHistController.setAlsUngelesen()}"
           update=":mainForm" />
     </p:submenu>

     <p:menuitem id="schadenTableContextMenuMI3"
        style="width:190px !important; font-size:12px !important;"
        value="In der Applikation öffnen" icon="ui-icon-pencil"
        title="Öffnet den ToDo in der entsprechenden Applikation." ajax="true"
        partialSubmit="true" process="@this"
        action="#{openExternalLinkController.openTodoInExtUrl()}"
        oncomplete="openExternal(xhr, status, args)" update=":msgGrowl" />

  </p:contextMenu>

 -------------------dataTable-----------------
<p:dataTable id="todoSchadenTable" widgetVar="todoSchadenTableW"
     emptyMessage="Keine Schadenmeldungen gefunden." var="currentTableItem"
     value="#{schadenTableController.dataModel}" paginator="true" rows="15"
     filteredValue="#{schadenTableController.filteredTodos}"
     filterEvent="keyup" filterDelay="500"
     sortBy="#{currentTableItem.angelegtAm}" sortOrder="descending"
     editable="true"
     rendered="#{(loginBean.loggedIn and !mitViewController.leiterViewActiv and mitViewController.schadenTabActive) or (loginBean.loggedIn and leiterTreeController.todoSchadenTableAktiv)}"
     selection="#{schadenTableController.selectedSchadenmeldungen}"
     rowKey="#{currentTableItem.meldungId}"
     style="min-width:1700px !important;">

     <p:ajax event="rowEdit" global="false" partialSubmit="true"
        listener="#{schadenTableController.saveErlVorgelBis(currentTableItem)}" />

     <!-- <p:ajax event="rowSelect" global="false" listener="#{todoLeseHistController.aktuelleSchadenMeldung(currentTableItem)}" /> -->

     <p:ajax event="contextMenu" global="false" partialSubmit="true"
        listener="#{todoLeseHistController.testeMich()}" />

     <p:ajax event="toggleSelect" update="zuordnenZuButton"
        partialSubmit="true" process="@this" global="false" />
     <p:ajax event="rowSelectCheckbox" update="@this" partialSubmit="true"
        process="@this" global="false"  listener="#{todoLeseHistController.testeMich()}"/>
     <p:ajax event="rowUnselectCheckbox" update="@this" partialSubmit="true"
        process="@this" global="false" />


     <f:facet name="header">
        <p:commandButton value="Zuordnen" id="zuordnenZuButton" ajax="true"
           partialSubmit="true" process="@this"
           label="Schandemeldung einem Mitarbeiter zuordnen"
           oncomplete="zuordnenDialogW.show();"
           disabled="#{not schadenTableController.hasSelectedSchadenmeldungen}"
           action="#{zuordnenDialogController.prepareDataForTable()}"
           style="float: left;" />
        <pe:tooltip for="zuordnenZuButton"
           value="Ausgwählte Schadenmeldungen einem Benutzer zuordnen"
           myPosition="left center" atPosition="right center" showEffect="fadeIn"
           hideEffect="fadeOut" showDelay="700" />
        <h:outputText
           value="#{schadenTableController.tableHeaderName} - #{leiterTreeController.getDataTableHeaderZusatz()}"
           style="color:#cf0008; font-size: 22px;  padding-top: 7px; " />
     </f:facet>


                   ...
Ajax JSF primefaces XHTML

评论

0赞 Sva.Mu 9/25/2015
你检查过PF展示吗?他们带有 ContextMenu 的 DataTable 示例似乎涵盖了您的问题,即使无需在右键单击之前选择该行,它也可以工作: primefaces.org/showcase/ui/data/datatable/contextMenu.xhtml
0赞 leostiw 9/25/2015
@Sva.Mu 是的,我检查了 PF-showcase。但这是另一个例子,它只是单一选择。但是,可能是他们解决了这个问题,因为这个问题已经很老了。
0赞 opfau 10/2/2015
看看这是否解决了你的问题:stackoverflow.com/questions/14506098/......

答:

0赞 imnotthatrobot 11/14/2019 #1

在调用 contextMenu 事件的侦听器时,是否将所选行分配给后备 Bean 中的变量?

它应该看起来像这样:

        <p:ajax event="contextMenu"  listener="#{backingBean.contextMenuSelect}" />

这在后备 Bean 中:

        public void contextMenuSelect(SelectEvent event) {
             selectedRow = (EntityClassName) event.getObject();
        }