I am new In salesforce, currently learning a visualforce elements.
I am having a problem in my code that when I insert a SelectList code in my visualForce page then page re-rendering stops working.
Without SelectList page re-rendering works fine.
I have provided a code snippets below. After adding SelectList save method from controller not getting called also contact i am trying to insert is not getting inserted.
Any help is appreciated.
This is my visualforce page.
<apex:page controller="ContactController">
<apex:form >
<apex:pageBlock>
<apex:pageBlockSection >
<apex:inputField value="{!Contact.AccountId}" label="Account Name:"/>
<apex:inputField value="{!Contact.LastName}" label="LastName"/>
<apex:inputField value="{!Contact.phone}" label="Phone"/>
<apex:inputField value="{!Contact.Department}"/>
<apex:inputField value="{!Contact.Designation__c}"/>
</apex:pageBlockSection>
<apex:pageBlockSection id="id3">
<apex:pageBlockSectionItem >
<apex:actionRegion >
<apex:selectList value="{!Contact}" multiselect="true" id="slist1" style="overflow scroll; height : 100px;">
<apex:actionSupport event="onchange" rerender="id1" />
<apex:selectOptions value="{!ContactFields}"></apex:selectOptions>
</apex:selectList><p/>
</apex:actionRegion>
</apex:pageBlockSectionItem>
</apex:pageBlockSection>
<apex:pageBlockSection id="id1">
<apex:pageBlockTable value="{!contactList}" var="c" >
<apex:column headerValue="Last Name">
<apex:outputField value="{!c.Lastname}"/>
</apex:column>
<!-- <apex:column headerValue="Account">
<apex:outputField value="{!c.Account.Name}"/>
</apex:column> -->
</apex:pageBlockTable>
</apex:pageBlockSection>
<apex:pageBlockButtons >
<apex:commandButton value="Save" action="{!save}" reRender="id1"/>
</apex:pageBlockButtons>
</apex:pageBlock>
</apex:form>
</apex:page>
This is my controller.
public class ContactController {
public Account account { get; private set; }
public Contact contact { get; set; }
public List<Contact> contactList{get {return ([SELECT LastName,Account.Name FROM Contact where Account.Id = :ApexPages.currentPage().getParameters().get('id') order by createdDate DESC limit 5]);} set;}
public Id id;
Map<String, Schema.SobjectField> Contactfields{ get; set;}
List<SelectOption> lstContactFields{get;set;}
public ContactController() {
contact=new Contact();
id = ApexPages.currentPage().getParameters().get('id');
contact.AccountId=id;
Contactfields = Schema.SobjectType.Contact.fields.getMap();
}
public List<SelectOption> getContactFields(){
if(lstContactFields==null){
lstContactFields=new List<SelectOption>();
}
for(Schema.SObjectField s:Contactfields.values()){
Schema.DescribeFieldResult fieldResult = s.getDescribe();
lstContactFields.add(new SelectOption(String.valueof(fieldResult.getName()),String.valueof(fieldResult.getLabel())));
// lstContactFields.add(Contactfields.get(s).getDescribe().getLabel());
//lstContactFields.add(String.valueOf(s));
}
return lstContactFields;
}
public PageReference save() {
try {
System.debug('save method');
upsert contact;
contact.Id=null;
return null;
} catch(System.DMLException e) {
ApexPages.addMessages(e);
return null;
}
// After successful Save, navigate to the default view page
// PageReference pg = new PageReference(System.currentPageReference().getURL());
// pg.setRedirect(true);
// return pg;
}
}
Your value bindings on these components aren't set up correctly.
<apex:selectList value="{!Contact}" multiselect="true" id="slist1" style="overflow scroll; height : 100px;">
An <apex:selectList> needs to be bound to a String or a List<String> (only for multiselect=true). Here, you've bound it to an sObject variable.
The fact that you've named your sObject variable the same as its class, Contact, is highly likely to cause further problems. Apex isn't case-sensitive, so contact and Contact are the same identifier. In general, you should not reuse reserved words or system class names as variable names, which you do again with id.
<apex:selectOptions value="{!ContactFields}"></apex:selectOptions>
<apex:selectOptions> has to have its value bound to a List<SelectOptions>. You've declared a property by that name with the wrong type:
Map<String, Schema.SobjectField> Contactfields{ get; set;}
while also implementing a getter method with the right type:
public List<SelectOption> getContactFields(){
Again, this is likely to produce unintuitive behavior, even if it does compile and render.
Related
Roles are assigned to each Employee and each employee has a checkbox. Whenever checkbox is checked and Role selected from Dropdown(Roles from Picklist), New Role Should be assigned to Employee after clicking on Update Button.
How do i get it.. I've assigned ID to checkbox and trying like if Checkbox==true then perform certain condition but it is not working..Please guide me
VF Page
<apex:page extensions="EmployeeSelectClassController13" standardController="Employee__c" sidebar="false">
<apex:form >
<apex:pageBlock >
<apex:pageBlockSection title="Employees" collapsible="false">
<apex:pageBlockTable value="{!wrapEmployeeList}" var="empWrap" id="table" title="All Employees">
<apex:column >
<apex:inputCheckbox value="{!empWrap.selected}" id="inputCheckbox"/>
</apex:column>
<apex:column value="{!empWrap.emp.Name}" id="inputName" />
<apex:column value="{!empWrap.emp.Role__c}" id="inputRole" />
</apex:pageBlockTable>
<apex:pageBlockSection id="InfoId" columns="1" >
<apex:selectList size="1" value="{!SelectedValue}">
<apex:selectOptions value="{!statusOptions}"/>
</apex:selectList>
</apex:pageBlockSection>
<apex:commandButton value="Update" id="inputButton" action="{!updateRole}" />
</apex:pageBlockSection>
</apex:pageBlock>
</apex:form>
</apex:page>
Apex Controller
public class EmployeeSelectClassController13 {
public List<wrapEmployee> wrapEmployeeList {get; set;}
public List<Employee__c> empRecord {get;set;}
public string selectedValue { get;set; }
public List<SelectOption> statusOptions { get;set; }//TO get Roles from Employee
public EmployeeSelectClassController13(ApexPages.StandardController controller){
if(wrapEmployeeList == null){
wrapEmployeeList = new List<wrapEmployee>();
for(Employee__c empList:[Select Name,Role__c from Employee__c]){
wrapEmployeeList.add(new wrapEmployee(empList));
autorun();
}
}
}
public class wrapEmployee{
public Employee__c emp {get; set;}
public Boolean selected {get; set;}
public wrapEmployee(Employee__c e) {
emp = e;
selected = false;
}
}
//To get all Roles(PickList) from Employee Object
public void autoRun()
{
Schema.DescribeFieldResult statusFieldDescription = Employee__c.Role__c.getDescribe();
statusOptions = new list<SelectOption>();
for (Schema.Picklistentry picklistEntry : statusFieldDescription.getPicklistValues())
{
statusOptions.add(new SelectOption(pickListEntry.getValue(),pickListEntry.getLabel()));
}
}
public void updateRole()
{
}
}
Something like this? You don't need IDs in the Visualforce unless you do some JavaScript magic. This can be done completely in Apex.
public void updateRole(){
List<Employee__c> toUpdate = new List<Employee__c>();
for(wrapEmployee wrap : wrapEmployeeList){
if(wrap.selected){
wrap.emp.Role__c = SelectedValue;
// wrap.selected = false; // you could choose to untick checkboxes now?
// or after successful update loop through them one more time and then untick
toUpdate.add(wrap.emp);
}
}
update toUpdate;
}
I have a page with a list of Asset.
In this list, i have one checkbox by Asset.
I'm trying to open another page with my selection.
I create a object with all selected Asset.
When i try to give my object to my new page, i have the message "Attempt to de-reference a null object".
Do you have some idea to how correct this?
My first page:
<apex:page Controller="CreationProjetController">
<apex:form >
<apex:pageBlock>
<apex:pageBlockButtons location="top">
<apex:commandButton value="Créer" action="{!newProject}"/>
</apex:pageBlockButtons>
</apex:pageBlock>
<apex:pageBlock title="Actif sans projet" id="creationprojet_list">
<apex:pageBlockTable value="{! Asset }" var="a">
<apex:column >
<apex:inputCheckBox value="{!a.selected}" id="idSelected"/>
</apex:column>
<apex:column value="{! a.Asset.Id }"/>
<apex:column value="{! a.Asset.Status }"/>
<apex:column value="{! a.Asset.AccountId }"/>
<apex:column value="{! a.Asset.Name }"/>
<apex:column value="{! a.Asset.Contrat_Standard__c }"/>
<apex:column value="{! a.Asset.D_partement_du_compte__c }"/>
<apex:column value="{! a.Asset.Projet__c }"/>
<apex:column value="{! a.Asset.Date_intervention__c }"/>
<apex:column value="{! a.Asset.CreatedDate }"/>
</apex:pageBlockTable>
</apex:pageBlock>
</apex:form>
</apex:page>
My Controller
public class CreationProjetController {
private String sortOrder = 'AccountId';
public List<cAsset> assetList {get;set;}
public string compte;
public boolean unCompte = true;
public string contrat;
public boolean unContrat = true;
//Populer notre collection d'objet
public List<cAsset> getAsset(){
assetList = new List<cAsset>();
//Requête pour récuperer les objet
for(Asset a :[SELECT Id, Status, Name, AccountId, Contrat_Standard__c, D_partement_du_compte__c, Projet__c, Date_intervention__c, CreatedDate
FROM Asset
WHERE (
(Status LIKE 'Acheté') AND
Contrat_Standard__c <> NULL AND
Projet__c = NULL AND
(NOT Name LIKE '%licence%') AND (NOT Name LIKE 'Facturation specifique') AND
(NOT Status LIKE 'Sans BDC') AND (NOT Status LIKE '%Opportunité%')
)
ORDER BY AccountId ASC LIMIT 1000]){
assetList.add(new cAsset(a));
}
return assetList;
}
public class cAsset{
public Asset asset {get; set;}
public Boolean selected {get; set;}
public cAsset(Asset a){
asset = a;
selected = false;
}
}
public SelectedAsset getSelectedAsset(){
SelectedAsset selectedwrpList = new SelectedAsset(assetList);
return selectedwrpList;
}
public class SelectedAsset{
public List<Asset> assetChoise{get;set;}
public string compte;
public string contrat;
public boolean unContrat = true;
public boolean unCompte = true;
public SelectedAsset(List<cAsset> assetList){
compte = assetList.get(0).asset.AccountId;
contrat = assetList.get(0).asset.Contrat_Standard__c;
for(cAsset a :assetList){
if (a.selected = true){
if(a.asset.Contrat_Standard__c != contrat){
unContrat = false;
}
if(a.asset.AccountId != compte){
unCompte = false;
}
assetChoise.add(a.asset);
}
}
}
}
public PageReference newProject() {
SelectedAsset assetChoise = new SelectedAsset(assetList);
PageReference newProject = new pagereference('/Apex/CreationProjet2');
newProject.setRedirect(false);
return newProject;
}
}
My second page:
<apex:page Controller="CreationProjetController" >
<apex:form >
<apex:pageBlock title="Actif selectionné" id="creationprojet_list">
<apex:pageBlockTable value="{!assetChoise}" var="a">
<apex:column value="{! a.id }"/>
</apex:pageBlockTable>
</apex:pageBlock>
</apex:form>
</apex:page>
You're using the "wizard" approach to VF pages, where same controller is reused on mutliple pages and that's how state is being passed. Good, this should work OK, it's documented https://developer.salesforce.com/docs/atlas.en-us.pages.meta/pages/pages_quick_start_wizard.htm for example.
Check this piece:
SelectedAsset assetChoise = new SelectedAsset(assetList);
PageReference newProject = new pagereference('/Apex/CreationProjet2');
Page 2 references a variable that doesn't exist in controller. You've just made a local variable with that name. Try to either reference original assetList in your 2nd page or make assetChoise a full class-level variable, not just a local in this method.
And try to create the pagereference as Page.CreationProjet2, not as strings. Like in that wizard demo. No idea if it changes anything in your bug but it's genrally better idea. That way page is really referenced in code and for example SF will warn you when you try to delete the page, it'll throw error about usage in this class. If it was just a string/address reference it'd happily let you delete and only user would see the error during testing...
So I have this in the page:
< apex:commandButton id="songdbabc" value="Synch from song db" action="{!sendingSign}" />
and this in the controller:
public PageReference sendingSign(){
System.debug(' message ');
return null;
}
But everytime I press the button there isn`t any message in the "Log" I mean the action is not executed , any idea?
Do you have another variable or function with same name? I mean public String sendingSign {get; set;} or maybe public String getSendingSign()? These would "shadow" your action function. Do you have more than 1 controller extension in <apex:page> tag? they'd be checked for matching function names from right to left (so if you have few classes maybe it's calling the match from a class you're not looking at)
Open up your browser's JS console / network panel, see if there's any traffic recorded at all when you click the button...
Try changing your sendingSign method to :
public void sendingSign(){
System.debug(' message ');
}
And recheck your log.
EDIT: Fixed! Removed "Static" variables from my extension; all bad behavior cleared right up.
Original:
I had to build a stackoverflow account just so I could vent a little here. I'm facing the same issue, and found that it will only skip my action if I include a picklist on the same page. I've never had this issue.
this page runs the action, but doesn't include the picklist I want:
<apex:page standardController="Checklist_Template_Item__c" recordSetVar="Checklist_Template_Items__r" extensions="ChecklistTemplateItemMassApply">
<apex:form >
<apex:pageBlock >
<apex:commandButton action="{!myCustomAction}" value="Append/Remove" />
<apex:commandButton action="{!cancel}" value="Cancel"/>
<apex:variable value="{!appendValue}" var="appendValue"/>
<apex:variable value="{!selection}" var="selection"/>
<apex:pageBlockSection >
Include your selected items for select machine models.
<apex:inputText value="{!appendValue}"/>
</apex:pageBlockSection>
</apex:pageBlock>
</apex:form>
this page completely skips the action, but includes my picklist:
<apex:page standardController="Checklist_Template_Item__c" recordSetVar="Checklist_Template_Items__r" extensions="ChecklistTemplateItemMassApply">
<apex:form >
<apex:pageBlock >
<apex:commandButton action="{!myCustomAction}" value="Append/Remove" />
<apex:commandButton action="{!cancel}" value="Cancel"/>
<apex:variable value="{!appendValue}" var="appendValue"/>
<apex:variable value="{!selection}" var="selection"/>
<apex:pageBlockSection >
Include your selected items on certain machine models.
<apex:inputText value="{!appendValue}"/>
<apex:pageBlockSectionItem >
<apex:outputText value="Why tho"/>
<apex:selectList size="1" value="{!selection}" required="true">
<apex:selectOptions value="{!applyRemove}"/>
</apex:selectList>
</apex:pageBlockSectionItem>
</apex:pageBlockSection>
</apex:pageBlock>
</apex:form>
having either a page constructor or not, action doesn't run when the picklist is included:
extension v1:
public without sharing class ChecklistTemplateItemMassApply{
public static String appendValue{get;set;}
public static String selection{get;set;}
public static List<SelectOption> applyRemove{get;set;}
ApexPages.StandardSetController setCon;
public ChecklistTemplateItemMassApply(ApexPages.StandardSetController myController){
setCon = myController;
List<String> addList = new List<String>{'Applies_To__c'};
setCon.addFields(addList);
system.debug('addList = '+addList);
applyRemove = new List<SelectOption>();
applyRemove.add(new SelectOption('','--None--'));
applyRemove.add(new SelectOption('Include','Include'));
applyRemove.add(new SelectOption('Remove','Remove'));
}
public ApexPages.pageReference myCustomAction(){
system.debug('hey');
PageReference returnPage = new PageReference(ApexPages.currentPage().getParameters().get('retURL'));
system.debug('returnPage = '+returnPage);
return returnPage;
}
}
extension V2:
public without sharing class ChecklistTemplateItemMassApply{
public static String appendValue{get;set;}
public static String selection{get;set;}
public static List<SelectOption> applyRemove{get;set;}
ApexPages.StandardSetController setCon;
public ChecklistTemplateItemMassApply(ApexPages.StandardSetController myController){
setCon = myController;
List<String> addList = new List<String>{'Applies_To__c'};
setCon.addFields(addList);
system.debug('addList = '+addList);
applyRemove = new List<SelectOption>();
applyRemove.add(new SelectOption('','--None--'));
applyRemove.add(new SelectOption('Include','Include'));
applyRemove.add(new SelectOption('Remove','Remove'));
}
public void ApexPages.pageReference myCustomAction(){
system.debug('hey');
}
}
Let's pretend that I have an sObject called MyCutomObject with the fields Column1, Column2, Column3, PickMeColumn and others. The type of the PickMeColumn is Picklist.
While it's easy to access the object's instance data in my page, I'm a bit stucked with how to get the user's input data from that page to be accessible inside the controller.
Page code:
<apex:page sidebar="false" standardController="MyCustomObject__c" extensions="MyCustomSearchController">
<apex:form >
<apex:pageBlock title="Search Criteria">
<apex:pageBlockSection>
<apex:inputField value="{!myObject.PickMeColumn__c}" />
</apex:pageBlockSection>
<apex:commandButton value="Search" id="SearchButton" action="{!search}"/>
</apex:pageBlock>
<apex:pageBlock title="Search Results">
<apex:pageBlockTable value="{!myObjectList}" var="myObject">
<apex:repeat value="{!myObject}" var="aRecord">
<apex:column value="{!aRecord.Column1__c}"/>
<apex:column value="{!aRecord.Column2__c}"/>
<apex:column value="{!aRecord.Column3__c}"/>
</apex:repeat>
</apex:pageBlockTable>
</apex:pageBlock>
</apex:form>
</apex:page>
Controller code:
public class MyCustomSearchController {
public MyCutomObject__c myObject {get;set;}
public List<MyCutomObject__c> myObjectList {get;set;}
public MyCustomSearchController(ApexPages.StandardController controller) {
}
public PageReference search() {
String ValueSelectedByUser = '??? Help!';
myObjectList = [SELECT Column1__c, Column2__c, Column3__c FROM MyCutomObject__c WHERE PickMeColumn__c = ValueSelectedByUser];
return ApexPages.currentPage();
}
}
In controller's code simply like so:
public class MyCustomSearchController {
public MyCutomObject__c myObject {get;set;}
public List<MyCutomObject__c> myObjectList {get;set;}
public MyCustomSearchController(ApexPages.StandardController controller) {
myObject = new myCustomObject__c(); // Must create the object!
}
public PageReference search() {
String ValueSelectedByUser = myObject.PickMeColumn__c;
myObjectList = [SELECT Column1__c, Column2__c, Column3__c FROM MyCutomObject__c WHERE PickMeColumn__c = :ValueSelectedByUser];
// Have to add the colon
return ApexPages.currentPage();
}
}
I need to show all the custom object records in pageblocktable. Before populating all the records i need to add a picklist value, Checkbox in the first row and then populate all the records. How can i do that.
Name Satisfy Opportunity Status Last modified
Status(Picklist)
Turn on all checkbox Turn on all checkbox
Clear all Clear all
Test 1 Checkbox Checkbox 12/12/2014
Test 2 Checkbox Checkbox 12/12/2014
Test 3 Checkbox Checkbox 12/12/2014
VF code:
<apex:page standardcontroller="Opportunity" extensions="oppgapstatus">
<apex:form>
<apex:pageBlock>
<apex:pageBlockSection id="Info">
<apex:pageBlockTable value="{!WrapperList}" var="wraprec">
<apex:column value="{!wraprec.accRec.Name__c}"/>
<apex:column value="{!wraprec.accRec.Satisfied__c}"/>
<apex:column value="{!wraprec.accRec.Current_Status__c}"/>
<apex:column value="{!wraprec.accRec.LastModifiedDate}"/>
</apex:pageBlockTable>
</apex:pageBlockSection>
<apex:commandbutton value="Save" action="{!UpdateSelectedRecords}"/>
<apex:commandbutton value="Cancel"/>
</apex:pageBlock>
</apex:form>
</apex:page>
Apex class:
Public class oppgapstatus{
Public Opportunity optyList{get;set;}
Public Opportunity_Status__c opst{get;set;}
public PageReference openPresentationOptions() {
return null;
}
private ApexPages.StandardController controller;
public oppgapstatus(ApexPages.StandardController controller) {
}
//Checkbox selectall
Public List<wrapperclass> wrapList {get;set;}
Public boolean checked{get;set;}
Public string selectedField {get;set;}
Public string inputVal{get;set;}
Public void selectallnone(){
if(!checked)
checked = true;
else
checked = false;
}
Public List<wrapperclass> getWrapperList(){
wrapList = New List<wrapperclass>();
for(Opportunity_Status__c acc:[select name,Satisfied__c,Current_Status__c,LastModifiedDate from Opportunity_Gaps__c where Opportunity_Detail__c =: optyList.Id]){
if(!checked)
wrapList.add(New wrapperclass(acc,false));
else
wrapList.add(New wrapperclass(acc,true));
}
return wrapList;
}
Public class wrapperclass{
Public Opportunity_Status__c accRec{get;set;}
Public boolean checkFlag{get;set;}
Public wrapperclass(Opportunity_Status__c acc,boolean flag){
accRec = acc;
checkFlag = flag;
}
}
Can anyone help me..thanks in advance
You can simply change the
<apex:column value="{!wraprec.accRec.Name__c}"/>
to
<apex:column> <apex:inputCheckbox value="{!wraprec.accRec.boolean_Field__c}"/></apex:column>
You can even write onchange action as well in the