Apex Search with Checkbox Results

This demo is a single Apex custom controller, two Visualforce pages and a wrapper class allowing the user to search an object by keyword (via Dynamic SOQL) and return the results in a page block table with corresponding checkboxes. Selecting one or more checkboxes and clicking the 'See Results' button displays the list of the selected items.

This is a very common function as you typically want to search for stuff and then process some selected stuff.

You can run this demo on my developer site.

Custom Controller - CategorySearchController

public class CategorySearchController {

 // the results from the search. do not init the results or a blank rows show up initially on page load
 public List<categoryWrapper> searchResults {get;set;}
 // the categories that were checked/selected.
 public List<categoryWrapper> selectedCategories {
  get {
   if (selectedCategories == null) selectedCategories = new List<categoryWrapper>();
   return selectedCategories;
  }
  set;
 }

 // the text in the search box
 public string searchText {
  get {
   if (searchText == null) searchText = 'Category'; // prefill the serach box for ease of use
   return searchText;
  }
  set;
 }

 // constructor
 public CategorySearchController() {}

 // fired when the search button is clicked
 public PageReference search() {

  if (searchResults == null) {
   searchResults = new List<categoryWrapper>(); // init the list if it is null
  } else {
   searchResults.clear(); // clear out the current results if they exist
  }
  // Note: you could have achieved the same results as above by just using:
  // searchResults = new List<categoryWrapper>();

  // dynamic soql for fun
 String qry = 'Select c.Name, c.Id From Cat3__c c Where c.Name LIKE '%'+searchText+'%' Order By c.Name';
 // may need to modify for governor limits??
 for(Cat3__c c : Database.query(qry)) {
  // create a new wrapper by passing it the category in the constructor
  CategoryWrapper cw = new CategoryWrapper(c);
  // add the wrapper to the results
 searchResults.add(cw);
  }
  return null;
 }

 public PageReference next() {

  // clear out the currently selected categories
  selectedCategories.clear();

  // add the selected categories to a new List
  for (CategoryWrapper cw : searchResults) {
   if (cw.checked)
    selectedCategories.add(new CategoryWrapper(cw.cat));
  }

  // ensure they selected at least one category or show an error message.
  if (selectedCategories.size() > 0) {
   return Page.Category_Results;
  } else {
   ApexPages.addMessage(new ApexPages.message(ApexPages.severity.ERROR,'Please select at least one Category.'));
  return null;
  } 

 } 

 // fired when the back button is clicked
 public PageReference back() {
  return Page.Category_Search;
 } 

}

Visualforce Search Page - Category_Search

<apex:page controller="CategorySearchController">
 <apex:form >
  <apex:pageBlock mode="edit" id="block">

   <apex:pageBlockButtons >
    <apex:commandButton action="{!next}" value="See Results" disabled="{!ISNULL(searchResults)}"/>
   </apex:pageBlockButtons>
   <apex:pageMessages />

   <apex:pageBlockSection >
    <apex:pageBlockSectionItem >
     <apex:outputLabel for="searchText">Search for Categories</apex:outputLabel>
     <apex:panelGroup >
     <apex:inputText id="searchText" value="{!searchText}"/>
     <!-- We could have rerendered just the resultsBlock below but we want the -->
     <!-- 'See Results' button to update also so that it is clickable. -->
     <apex:commandButton value="Search" action="{!search}" rerender="block" status="status"/>
     </apex:panelGroup>
    </apex:pageBlockSectionItem>
   </apex:pageBlockSection>

   <apex:actionStatus id="status" startText="Searching... please wait..."/>
   <apex:pageBlockSection title="Search Results" id="resultsBlock" columns="1">
    <apex:pageBlockTable value="{!searchResults}" var="c" rendered="{!NOT(ISNULL(searchResults))}">
     <apex:column width="25px">
      <apex:inputCheckbox value="{!c.checked}"/>
     </apex:column>
     <apex:column value="{!c.cat.Name}" headerValue="Name"/>
    </apex:pageBlockTable>
   </apex:pageBlockSection>
  </apex:pageBlock>
 </apex:form>
</apex:page>

Visualforce Results Page - Category_Results

<apex:page controller="CategorySearchController">
 <apex:form >
  <apex:pageBlock >

   <apex:pageBlockButtons >
    <apex:commandButton action="{!back}" value="Back"/>
   </apex:pageBlockButtons>
   <apex:pageMessages />

   <apex:pageBlockSection title="You Selected" columns="1">
    <apex:pageBlockTable value="{!selectedCategories}" var="c">
     <apex:column value="{!c.cat.Name}"/>
    </apex:pageBlockTable>
   </apex:pageBlockSection>  

  </apex:pageBlock>
 </apex:form>
</apex:page>

Wrapper Class - CategoryWrapper

public class CategoryWrapper {

 public Boolean checked{ get; set; }
 public Cat3__c cat { get; set;}

 public CategoryWrapper(){
 cat = new Cat3__c();
 checked = false;
 }

 public CategoryWrapper(Cat3__c c){
 cat = c;
 checked = false;
 }

 public static testMethod void testMe() {

  CategoryWrapper cw = new CategoryWrapper();
  System.assertEquals(cw.checked,false); 

  CategoryWrapper cw2 = new CategoryWrapper(new Cat3__c(name='Test1'));
  System.assertEquals(cw2.cat.name,'Test1');
  System.assertEquals(cw2.checked,false); 

 }

}