Enable/Disable a ribbon button dynamically based on a form value
Requirement:
You need to Enable or Disable a form ribbon button depending field values using the following rule:
Enable if: ( accountcategorycode=1 OR accountcategorycode=2 OR ( accountcategorycode=3 AND accountnumber != null AND accountnumber != "" ) )
Solution:
The CRM2011 Ribbon can read values from the current form from
inside an Enable Rule. Using the Ribbon Workbench you can create an
Enable Rule with a set of 'Or' rules. Each Or rule contains a one or
more OrGroups. Inside the OrGroup, you can add Rules that all must
be true in order that the OrGroup returns true.
So to implement the above, we must use:
OrEnableRule Or OrGroup ValueRule (accountcategorycode=1) OrGroup ValueRule (accountcategorycode=2) OrGroup ValueRule (accountcategorycode=3) ValueRule (accountnumber='null', Invert=true) ValueRule (accountnumber='', Invert=true)
Notice that rather than using != (not equals) we are using a standard equals comparison, but selecting to invert the result, so if the rule returns true, it will be evaluated as false.
In the Ribbon Workbench, this would look like:
Be sure to associate your Enable Rule with your Command that is associated with your button.
Note: You will need to add a white space and delete it again to distinguish the Value of '' from a null value. To make a comparison with a null value, you provide the text 'null' for the value.
Once published, you'll notice that the button will only be enabled if the rules match the criteria when the form is loaded. To make the ribbon dynamically change when a field value changes, you'll need to create a JavaScript Webresource with the following JavaScript function:
function refreshRibbonOnChange()
{
Xrm.Page.ui.refreshRibbon();
}
Within the onchange event of the accountcategorycode and accountnumber fields, call the refreshRibbonOnChange function:
Once published, you should see your ribbon button enabling and disabling based on your form values.
Note: Value rules cannot be used in Grid or HomePage ribbons. To implement similar functionality, you must create a javascript function to dynamically retrieve the data from the server and return true/false.
You can see a similar process as described here in the following video: http://www.develop1.net/public/post/Dynamically-ShowHide-a-standard-ribbon-button-based-on-a-form-value.aspx