How is it possible to loop through all the controls in a form when a form is initialized?
I have tried the following in the init and run methods, but it does not work:
for( i = 1 ; i <= element.form().design().controlCount() ; i++ )
{
control = element.form().design().controlNum(i);
switch ( control.handle() )
{
case classnum(FormBuildButtonControl):
element.initButton(control);
break;
case classnum(FormBuildStaticTextControl):
element.initStaticText(control);
break;
}
}
Is there any way of doing this?
Each control can have child controls and parent controls. You're only going over the first level. Here is a sample job that demonstrates how to use recursion over form controls.
Edit: Ah somebody beat me to the answer. Hopefully somebody will appreciate my demo job.
The code you have works, but it only iterates through the top level of the design. You need to build a recursive function to iterate through the entire set of controls, and place it in the init method before the super():
The super() call will automatically initialize all the controls on the form. Once they are initialized, you won't be able to use
FormBuildControl
type objects to configure the fields, as they will already be consumed onto the form. If you need to modify the field after initialization, you should refer to the field directly (though I'm unsure of how you could get the field name and reference it via X++).Instead of conditionally initializing the controls, call super() and simply hide the field conditionally, or use security to hide information you don't want certain people to have access to.
EDIT: Since you are dealing with
FormBuildControl
s, which are pre-initialized designs, you should have the super() call after the initial processControls call. I've changed my example to reflect this.I have written a simple code in x++ (and also in d365) but it maybe help someone. In this code all form controls will be save in a table called FormControlsTable.