2013-02-11 16 views
7

Ho una tabella di dati che scorre attraverso un oggetto personalizzato e genera caselle di controllo. Nella seconda pagina, voglio determinare quale di queste checkbox è stata selezionata.Come scoprire quali caselle di controllo sono state selezionate nella pagina successiva in VisualForce?

Nella pagina Visualforce:

Age <apex:inputText value="{!age}" id="age" /> 
<apex:dataTable value="{!Areas}" var="a"> 
     <apex:column > 
     <apex:inputCheckbox value="{!a.name}" /> <apex:outputText value="{!a.name}" /> 
     </apex:column> 
    </apex:dataTable> 

Nel Controller:

public String age {get; set; } 
    public List<Area_Of_Interest__c> getAreas() { 
     areas = [select id, name from Area_Of_Interest__c]; 
     return areas; 
    } 

Sulla mia seconda pagina, posso recuperare il valore che l'utente ha messo nella casella di testo "età" utilizzando {!age} . Come posso recuperare le caselle di controllo che sono state controllate?

Grazie.

risposta

4

Ok, se vuoi gestirlo con Javascript, usa il metodo di Pavel, altrimenti usa quello che segue per farlo tramite il controller. Devi creare una classe wrapper per tutto ciò che desideri monitorare. Non sono sicuro di come funzioni, ma in qualche modo se si nomina una variabile booleana "selezionata" nella propria classe wrapper, questa viene mappata alla casella di controllo.Di seguito è riportato il codice:

Quindi nel tuo pagina di forza visiva, fare:

<apex:dataTable value="{!Foos}" var="f"> 
    <apex:column > 
     <apex:outputLabel value="{!f.foo.name}" /> <apex:inputCheckbox value="{!f.selected}" /> 
    </apex:column> 
</apex:dataTable> 
<apex:commandButton action="{!getPage2}" value="go"/> 

nel controller, procedere come segue: 1) Effettuare una classe wrapper con il booleano "selezionato", che mappa in qualche modo al inputCheckbox selezionato:

public class wFoo { 
    public Foo__c foo {get; set} 
    public boolean selected {get; set;} 

    public wFoo(Foo__c foo) { 
     this.foo = foo; 
     selected = false; //If you want all checkboxes initially selected, set this to true 
    } 
} 

2) dichiarare le variabili di lista

public List<wFoo> foos {get; set;} 
public List<Foo__c> selectedFoos {get; set;} 

3) Definire la funzione di accesso per l'elenco

public List<wFoo> getFoos() { 
    if (foos == null) { 
     foos = new List<wFoo>(); 
     for (Foo__c foo : [select id, name from Foo__c]) { 
      foos.add(new wFoo(foo)); 
     } 
    } 
    return foos; 
} 

4) Definire il metodo per elaborare le caselle di controllo selezionati e metterli in una lista uso su un'altra pagina

public void processSelectedFoos() { 
    selectedFoos = new List<Foo__c>(); 
    for (wFoo foo : getFoos) { 
     if (foo.selected = true) { 
      selectedFoos.add(foo.foo); // This adds the wrapper wFoo's real Foo__c 
     } 
    } 
} 

5) Definire il metodo di restituire il PageReference alla pagina successiva quando si fa clic sul pulsante di invio

public PageReference getPage2() { 
    processSelectedFoos(); 
    return Page.Page2; 
} 
3

Nel mio progetto attuale ho dovuto affrontare lo stesso problema. Ho usato apice: pageBlockTable, ma credo che è possibile utilizzare il mio codice (ho fatto alcuni cambiamenti nel mio codice per An nomi degli oggetti)

<apex:pageBlockTable value="{!Areas}" var="areas"> 
    <apex:column width="25px"> 
     <apex:facet name="header"> 
      <input type="checkbox" onClick="selectAll();" /> 
     </apex:facet> 
     <input type="checkbox" id="{!areas.Id}" onClick="saveSelection();" /> 
    </apex:column> 
... some additional columns 
</apex:pageBlockTable> 

avevo messo ID oggetto personalizzato per l'id di ingresso in html, e sembra come

<input id="003R000000lCIq6IAG" onclick="saveSelection();" type="checkbox"> 
<input id="003R000000lCIoJIAW" onclick="saveSelection();" type="checkbox"> 

la funzione saveSelection() ha scritto su javascript

<script> 
var areaIds = []; 

function saveSelection() { 
    var selectedIds = areaIds.join(''); 
    $j(':checkbox').each(function(){ 
     if (this.checked) { 
      if (selectedIds.indexOf(this.id) === -1) { 
       areaIds.push(this.id); 
       selectedIds = selectedIds + this.id; 
      } 
     } else { 
      if (selectedIds.indexOf(this.id) !== -1) { 
       for (i=0; i < areaIds.length; i++) { 
        if (areaIds[i] === this.id) { 
         areaIds.splice(i, 1); 
         selectedIds = areaIds.join(''); 
        } 
       } 
      } 
     }      
    }); 
} 

e per il ripristino è stato utilizzato il seguente codice

function restoreSelection() { 
    contIds = areaIds.join(''); 
    i = 0; 
    $j(':checkbox').each(function(){ if(this.id !== ''){ if(contIds.indexOf(this.id) !== -1){this.checked=true;};}}); 

} 

Io uso jQuery qui, che significa che si dovrebbe includere il seguente codice nella tua pagina troppo

<apex:includeScript id="JQuery" value="//ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"/> 
... some code 
<script> 
    window.$j = jQuery.noConflict(); 
    ... some code 
</script> 

il JS è coinvolto anche dai pulsanti di impaginazione:

<apex:panelGrid columns="7"> 
    <apex:commandButton status="fetchStatus" reRender="results" value="|<" action="{!first}" disabled="{!!hasPrevious}" title="First Page" onClick="saveSelection();" oncomplete=" restoreSelection()"/> 
    <apex:commandButton status="fetchStatus" reRender="results" value="<" action="{!previous}" disabled="{!!hasPrevious}" title="Previous Page" onClick="saveSelection();" oncomplete="restoreSelection()"/> 
    <apex:commandButton status="fetchStatus" reRender="results" value=">" action="{!next}" disabled="{!!hasNext}" title="Next Page" onClick="saveSelection();" oncomplete=" restoreSelection()"/> 
    <apex:commandButton status="fetchStatus" reRender="results" value=">|" action="{!last}" disabled="{!!hasNext}" title="Last Page" onClick="saveSelection();" oncomplete=" restoreSelection()" /> 
    <apex:outputText >{!(pageNumber * size)+1-size}-{!IF((pageNumber * size)>noOfRecords, noOfRecords,(pageNumber * size))} of {!noOfRecords}</apex:outputText> 
    <apex:outputPanel style="color:#4AA02C;font-weight:bold"> 
     <apex:actionStatus id="fetchStatus" startText="Fetching..." stopText=""/> 
    </apex:outputPanel> 
</apex:panelGrid> 

spero che questo possa Aiutarti.

+0

Concetto perfetto e implementazione! Grazie a @Pavel – highfive

Problemi correlati