0

私はデータテーブルとコレクターを持っています。データテーブルの各行にはボタンがあり、このボタンは対応する行をコレクターに追加します。このデータテーブルに条件付きの色を追加したいと思います。条件は、選択した行がコレクターにあるかどうかです。

<p:dataTable rowStyleClass="#{backingBean.selectedMemberList.contains(aMember) ? 'passive' : 'active'}" style="width: 100%;" id="dTable" var="aMember" value="#{backingBean.memberList}">
   <p:column>
   ...
  </p:column>

  <p:column>
      <p:commandButton id="btn_add" value="Add" update=":mf:op" process=":mf:op_uk">
          <p:collector value="#{aMember}" addTo="#{backingBean.selectedMemberList}" />
       </p:commandButton>
  </p:column>  

バッキングビーン:

List<Member> selectedMemberList;
List<Member> memberList;

//getter and setter methods

上記のコードはパッシブスタイルクラスを実行しますが、アクティブスタイルを追加しません。var(リクエストスコープ)をバッキングBeanに渡せないことが原因だと思いました。そこで、値をバッキングBeanの値にバインドしてみました。

<p:dataTable binding="#{backingBean.anotherMember}" rowStyleClass="#{backingBean.selectedMemberList.contains(aMember) ? 'passive' : 'active'}" style="width: 100%;" id="dTable" var="aMember" value="#{backingBean.memberList}">

backingBean:

private Member anotherMember;
//getter and setter methods

しかし、それも機能しませんでした。この問題について誰かが何かアドバイスはありますか?

PrimeFaces ver 2.2.1

編集:cssには次のフィールドが含まれています:

.active{    
    background-image: none !important;   
}

.passive{
    background-color:gainsboro !important;
    background-image: none !important;
}

編集と解決策:

xhtml:

<p:commandButton action="#{backingBean.checkIfMemberInList(aMember)}" id="btn_add" value="Add" update=":mf:op :mf:op_uk" process=":mf:op_uk">
          <p:collector value="#{ukt}" addTo="#{backingBean.selectedMemberList}" />
</p:commandButton>

バッキングビーン:

public boolean checkIfMemberInList(Member aMember){       
        for(int i=0; i<selectedMemberList.size();i++){            
            if(selectedMemberList.contains(aMember)){ 
                return true;
            }
        }
        return false;
    }
4

1 に答える 1

1

backingBean.selectedMemberList.contains(aMember)常にfalseを返す可能性はありますか?

もしそうなら 、

で「再生」しbackingBean.selectedMemberList.contains(aMember)、最初にbackingBean.checkIfMemberInList(aMember)のようなメソッドを試してください。

boolean checkIfMemberInList(Member iMember){ 
    //iterate over the list and check if object exists , if so return true , otherwise false
}

オブジェクトが異なる可能性がありますsame id does not mean that their hash code is same......

you might consider override the int hashCode or boolean equals of the member class

編集

checkIfMemberInListに対する私の提案は、それを機能させるための最初のバージョンにすぎませんでした。メンバークラスのequalsをオーバーライドする必要があると思います。そうすれば、selectedMemberList.contains(memberObj)を使用できるようになります。

hashCode()とequals()の実装

于 2012-04-09T12:30:47.977 に答える