2013-12-11 3 views
0
Hello Guys, 

<h:form id="targetsMenuPanelForm"> 
<p:commandButton id="cancel" ajax="false" process="@this" value="Cancel" 
    action="#{myMenuTabsBean.cancel}" styleClass="uta-button button-red" /> 

<p:commandButton id="save" process="@form" action="#{myMenuTabsBean.save}" 
    update="@form" value="Save" /> 
<p:commandButton id="new" action="#{myBackingbean.addEmptyRow}" 
    process="@this" update="myTable" value="New" /> 
<p:commandButton id="delete" value="Delete" 
    action="#{myBackingbean.deleteRow}" process="@form" update="@form" /> 

<p:dataTable id="myTable" value="#{myBackingbean.myDataModel}" 
    var="myList" selection="#{myBackingbean.selectedRows}"> 
    <p:column selectionMode="multiple" id="select" /> 
    <p:column id="namecol" headerText="Name"> 
     <p:inputText id="name" value="#{myList.targetName}" /> 
    </p:column> 
    <p:column id="typecol" headerText="Type"> 
     <p:selectOneMenu id="types" value="#{myList.type}"> 
    <f:selectItem itemLabel="Direct Dial" itemValue="DirectDial" /> 
    <f:selectItem itemLabel="Private Wire" itemValue="PrivateWire" /> 
    </p:selectOneMenu> 
</p:column> 
    </p:dataTable> 
    </h:form> 

위의 코드는 내 XHTML입니다. New 버튼을 클릭 할 때마다 빈 행이 목록에 추가됩니다.
.primefaces datatable 선택 속성 항상 첫 번째 행을 처음으로 채우기

이제 새 단추를 두 번 클릭하여 두 개의 빈 행을 추가했다고 가정합니다. 이제 두 개의 행에 데이터를 채우고 두 번째 행의 checkbox/selected 행을 확인한 다음 db에이 두 번째 행을 저장하는 저장 버튼을 클릭했습니다.

항상 첫 번째 행이 데이터 테이블의 선택 특성에
으로 매핑 된 배열로 채워지고 db에 저장됩니다.

내가 비어있는 첫 번째 행을 유지하는 경우 가정 및 두 번째 행을 채우고 확인/초
행을 선택하고 저장하려고, 응용 프로그램 이름과 현재
첫 번째 행을 선택하지 두 번째 행을 입력하면 오류가 발생합니다. 내가 첫 번째 행을 선택/취소하고
두 번째 행을 선택/확인하고 모든 것을 저장하려고 시도하면 잘됩니다.

아무도 내가 이것을 해결하는 데 도움이 될 수 있겠습니까? 미리 감사드립니다.

답변

1

백업 빈과 오류 메시지를 게시해야합니다.
페이지 코드에 아무런 문제가 없으므로

더 많은 것은 무엇이든, 나는 당신이 코드로 무엇을 할 의도가 있는지 알지 못합니다.
dataTable을 버퍼로 사용하고 선택한 레코드를 DB에 저장 하시겠습니까? 그렇다면,이 시도 :

private DataModel myDataModel; 
private List<myData> temp=new ArrayList<>(); 
private myData[] selectedRows=new myData[100]; 
private int count=0; 
@PostConstruct 
public void init(){ 
    temp=new ArrayList<>(); 
    count=0; 
    myDataModel=new DataModel(); 
} 
public void addEmptyRow(){ 
    temp.add(new myData("targetName"+count,"type"+count++)); 
    myDataModel=new DataModel(temp); 
} 
public void deleteRow(){ 
    for(myData m:selectedRows){ 
     temp.remove(m); 
    } 
    myDataModel=new DataModel(temp); 
} 
//getters and setters below... 

myMenuTabsBean.java :


myBackingbean.java (페이지가 당신으로 정확한 동일)

private List<myData> savedData = new ArrayList<>(); 

public void cancel() { 
    myBackingbean myBean = (myBackingbean) FacesContext.getCurrentInstance().getELContext().getELResolver().getValue(FacesContext.getCurrentInstance().getELContext(), null, "myBackingbean"); 
    DataModel myData = new DataModel(); 
    myBean.setMyDataModel(myData); 
    myBean.init(); 
} 

public void save() { 
    myBackingbean myBean = (myBackingbean) FacesContext.getCurrentInstance().getELContext().getELResolver().getValue(FacesContext.getCurrentInstance().getELContext(), null, "myBackingbean"); 
    myData[] my = myBean.getSelectedRows(); 
    for (myData m : my) { 
     savedData.add(m); //Add to List instead of DB for simplicity. 
    } 
    printSavedData(); 
    cancel(); 
} 

public void printSavedData() { //print saved data to see if the data is saved. 
    for (int i = 0; i < savedData.size(); i++) { 
     System.out.println(savedData.get(i).getTargetName() + ":" + savedData.get(i).getType()); 
    } 
} 

마지막으로, 왜 save()cancel()myMenuTabsBean에 쓰는가? myBackingbean? 그게 더 복잡하지 않니? 이것에 대한 다른 우려가 있습니까?

+0

답장을 보내 주셔서 감사 드리며 지연을 사과드립니다. 이전에 나는 실제 개발자가 아니기 때문에 페이지에서 중첩 된 폼의 사용을 관찰하지 못했습니다 (실제로이 페이지는 마스터 폼을 가진 다른 페이지에 포함되었습니다). 중첩 된 양식을 제거하고 불필요한 ajax 호출을 제거했습니다. 이제는 모든 것이 잘 작동합니다. xhtml은 괜찮 았으므로 대답을 수락했다. –

+0

문제가 해결되었습니다. – nosnhoj

관련 문제