Problem description: Form parts in Dynamics AX usually make use of linked data sources to activate changes. However there may the case that your form part does not have a direct datasource link to the parent form or simply needs to activate code to populate the info displayed. In this case one needs a mechanism to call code on the form part when the record on the parent form is changed.
Solution: To resolve the issue one needs to create method call-backs between the two forms. Two approaches need to be followed based on whether the form part has been added to a list page or to a normal form.
Standard forms
- Create your form and form parts.
- Add your form part to your main form
- On your main form create a reference to your form part in the class declaration e.g. Object _part;
- Create a method on your main form e.g. “registerForChange(Object _part); with the following code:
public void registerForChange(Object _part)
{
part = _part;
}
This method will allow your form part to provide a reference of itself to the main form.
- On your form part’s init method. Call this method register call the above method passing itself as a reference. Note: you will need to perform step #4 on all forms that will use this form part.
public void init()
{
Object caller;
caller= args.caller();
if(caller)
{
caller.registerForChange(this)
}
} - On your form part create an doRefresh method, your main form will call this method whenever a form part refresh is needed. This method can have an parameter that your would like the main form to pass through. In this example we will pass the active record from the main form E.G.
publicvoid doRefresh(Common _record)
{
//Do custom form part refresh.
} - Finally, on your main form, call the the method in #6 at the appropriate time. In this example calling “part.doRefresh(myTable);” in the myTable datasource’s active method works well. You could also do your call from a button on the main form or on any other trigger.
ListPage variation
If you are planning on using the form part as part of a list page. You need to make the following adjustments.
- Create a reference to your part in the list page’s ListPageInteractionClass’ ClassDeclaration e.g. Object part;
- For step #4 add the “registerForChange” to your list page’s ListPageInteractionClass
- For step #5 detect whether your part is being called from a ListPage or a normal form: E.G.
public void init()
{
Object caller;
SysSetupFormRun formRun;
super();
caller= this.args().caller();
if(caller)
{
formRun = caller;
if (formRun.pageInteraction())
{
caller = formRun.pageInteraction();
caller.registerForChange(this);
} else
{
caller.registerForChange(this);
}
}
} - On the relevant method in your list page interaction class call the part’s doRefresh method. For this example use the selectionChanged method
public void selectionChanged()
{
ListPage listPage = this.listPage();
if (listPage.activeRecord(“MyTable”))
{
part.doRefresh(listPage.activeRecord(“MyTable”));
}
}