0

データテーブルの各行にチェックボックスがあるというシナリオがあります。チェックボックスが選択されている場合、複数のデータを削除し、1 つのデータのみを編集できます。

削除を正常に実装できましたが、編集に行き詰まり、checkedID がサイズ 0 を返します。

私がこの例に従っている記録について

以下は私のコードです:

list.xhtml

<h:form>
<h:commandButton value="Edit" action="#{transportationController.prepareEdit()}"/>
               <h:commandButton value="Delete" action="#{transportationController.delete()}">

<p:dataTable value="#{transportationController.items}" var="item"                  <p:column>
              <f:facet name="header">
              </f:facet>
              <h:selectBooleanCheckbox value="#{transportationTypeController.checkedID[item.id]}"/>
            </p:column>
            <p:column>
              <f:facet name="header">
                <h:outputText value="Name"/>
              </f:facet>
              <h:outputText value="#{item.name}"/>
            </p:column>
            <p:column>
              <f:facet name="header">
                <h:outputText value="Remark"/>
              </f:facet>
              <h:outputText value="#{item.remark}"/>
            </p:column>
          </p:dataTable>
</h:form>

managedbean ---> transportcontroller.java transportcontroller はセッションスコープです

private Map<Integer, Boolean> checkedID = new HashMap<Integer, Boolean>();
  private List<Transportation> transportation = new ArrayList<Transportation>();

//setters and getters.

public List<Transportation> getCheckedTransportation() {
    List<Transportation> checkedItems = new ArrayList<Transportation>();
    for (Transportation trans : transportation) {
      if (checkedID.get(trans.getId())) {
        checkedItems.add(trans);
      }
    }
    checkedID.clear();
    return checkedItems;
  }

//delete function

public String delete() {
    List<Transportation> list = getCheckedTransportation();
    if (list.size() > 0) {
      for (int i = 0; i < list.size(); i++) {
        ejbFacade.remove(list.get(i));
      }
      return "List";
    } else {
      FacesMessage msg = new FacesMessage("Please select data", "Please select data");
      JsfUtil.getCurrent().addMessage("warning-message", msg);
      return null;
    }
  }

//edit function

public void prepareEdit() {
      List<Transportation> list = getCheckedTransportation();
      if (list.size() == 1) {
        current = list.get(0);
      } else {
        FacesMessage msg = new FacesMessage("Please select at least one data", "Please select at least one data");
        JsfUtil.getCurrent().addMessage("warning-message", msg);
     }

  }

public Transportation getSelected() {

    if (current == null) {
      current = new Transportation();
      selectedItemIndex = -1;
    }
    return current;
  }

エンティティークラス ---> Transportation.java

public class Transportation implements Serializable{
@Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

//etc..
}

私がデバッグすると、マップのcheckedIDのサイズは常に編集用に0になりますが、削除用には正常に機能します。私は今、これにこだわっていますが、checkedIDのサイズが常に0である理由を特定できません。これは、削除が正常に機能している場合にのみ編集されます。どんな助けでもいただければ幸いです。ありがとう。

注: primefaces p:datatable には selectionMode="multiple" と選択があることは知っていますが、使用しません。ページネーションにprimefacesのみを使用したい。

4

0 に答える 0