2

以下の複合主キーで複数選択(チェックボックス)でprimefacesデータテーブルを使用する際に問題があります

 <p:dataTable id="cars" var="car" value="#{setujutolakanpencairan.listmktksppencairan0}"
                     rowKey="#{car.mktksppencairan0PK}"
                     selection="#{setujutolakanpencairan.mktksppencairan0s}"   >
            <p:ajax event="rowSelectCheckbox" process="@this"/>
            <p:column selectionMode="multiple" style="width:2%" />
            <f:facet name="header">
                Click "View" button after selecting multiple to see details
            </f:facet>
            <p:column headerText="Color">
                #{car.vcKeterangan}
            </p:column>

            <f:facet name="footer">
                <p:commandButton value="View" icon="ui-icon-search"
                                 update=":form:display" oncomplete="carDialog.show()" actionListener="#{setujutolakanpencairan.outprint()}"/>
            </f:facet>
        </p:dataTable>

以下は私のバックビーンです

private List<Mktksppencairan0> listmktksppencairan0;
private Mktksppencairan0[] mktksppencairan0s;

以下は私のゲッターセッターです

public Mktksppencairan0[] getMktksppencairan0s() {
    if (mktksppencairan0s != null) {

        for (Object asdf : mktksppencairan0s) {
            System.out.println("mktksppencairan0s mktksppencairan0s mktksppencairan0smktksppencairan0s =====" + asdf);
        }
    }
    return mktksppencairan0s;
}

public void setMktksppencairan0s(Mktksppencairan0[] mktksppencairan0s) {
    this.mktksppencairan0s = mktksppencairan0s;
}

以下はデータを表示するリストです

public List<Mktksppencairan0> getListmktksppencairan0() {
    TypedQuery<Mktksppencairan0> query = em.createNamedQuery("Mktksppencairan0.findBybulantahun", Mktksppencairan0.class);
    query.setParameter(
            "iTahun", mktkontrol.getTahun());
    query.setParameter(
            "iBulan", mktkontrol.getBulan());
    List<Mktksppencairan0> results = query.getResultList();
    return results;
}

public void setListmktksppencairan0(List<Mktksppencairan0> listmktksppencairan0) {
    this.listmktksppencairan0 = listmktksppencairan0;
}

ここに値をデバッグするために使用した私のアクションがあります

 public void outprint() {

    System.out.println("asdfasdf ===" + mktksppencairan0s.toString().length());
    System.out.println("asdfasdf ===" + mktksppencairan0s.toString());
    System.out.println("asdfasdf ===" + mktksppencairan0s);
    for (Mktksppencairan0 asdf : mktksppencairan0s) {
        System.out.println("mktksppencairan0s mktksppencairan0s mktksppencairan0smktksppencairan0s =====" + asdf.toString().length());
    }
}

netbeans デバッガーを使用してデバッグすると、結果 [] または 0 System.out の場合に結果が返されます

INFO: asdfasdf ===[Lcom.infion.web.biaya_marketing.entity.Mktksppencairan0;@a20a9b
INFO: asdfasdf ===64

INFO: asdfasdf ===[Lcom.infion.web.biaya_marketing.entity.Mktksppencairan0;@1f5db6
INFO: asdfasdf ===[Lcom.infion.web.biaya_marketing.entity.Mktksppencairan0;@1f5db6

参考までに、netbeans 7.3、glassfish 3.1.2、primefaces 3.5 を使用しています。

NB:非複合主キー(単一の主キー)とその機能を試してみましたが、別の複合主キーを試しても機能しません

4

2 に答える 2

0

私は同じ問題を抱えていましたが、いつものようにエンティティのリストで作業しました。

private List<SipreTmpGuardia> beanList;
private List<SipreTmpGuardia> beanListSelected;

次に、selectionmode multiple を使用してデータテーブルに設定します。

    <!-- DATATABLE-->
                <p:dataTable id="dt" var="item" widgetVar="wdt"
                    rowIndexVar="rowIndex"
                    value="#{guardia.beanList}"
                    emptyMessage="#{constantesUtil.LIST_EMPTY}" paginator="true"
                    rows="20" paginatorPosition="top"
                    paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} "
                    selection="#{guardia.beanListSelected}" rowKey="#{item.codigoRowIndexTemp}"
                      >
                    <p:column headerText="N*" width="1%">
                        <h:outputText value="#{rowIndex+1}" />
                    </p:column>
                    <p:column selectionMode="multiple"  width="1%"/>
                    <p:column headerText="Indicador Mes o Reintegro" width="2%">
                        <h:outputText value="#{item.ctgIndSituacion==2?'Reintegro':'Proceso Mes'}" />
                    </p:column>

                    <f:facet name="footer">
                <p:commandButton ajax="false" action="#{guardia.saveListTmpGuardia()}" update=":frm:messages,:frm:dt,:frm:dtGM" icon="ui-icon-search" value="Guardar Seleccionados"  />
        </f:facet>
                </p:dataTable>

編集: Primefaces 5 の RowKey は複合主キーをサポートしていないことを理解しています。上記で行ったことは、rowKey="#{item.codigoRowIndexTemp}" を設定し、これをテーブルを埋める関数に入力することです.. value="#{guardia.beanList}" .

エンティティに「codigoRowIndexTemp」などの一時的なプロパティを作成して入力するだけで、複合主キーを設定する必要はありません。それを選択すると、codigoRowIndexTemp によってリストがフィルター処理されます。

それを試してみてください!

ところで1:私の複合主キーまたはEmbeddedIdは:

@EmbeddedId
protected SipreTmpGuardiaPK sipreTmpGuardiaPK;
于 2015-06-04T17:26:20.193 に答える
0

@dmatosが述べたようにselectionModeを「複数」に設定する必要があり、rowkeyは各行の一意の識別子を返す必要があり、一貫している必要があります。より複雑になり、rowKey の一意のフィールドにアクセスする場合は、いつでも Primefaces に selectabledatamodel を実装できます。

于 2015-06-05T06:44:39.740 に答える