dynamic - tutorial - AX2009 Boucle à travers tous les contrôles dans le formulaire sur init




microsoft dynamics ax tutorial pdf (2)

Comment est-il possible de parcourir tous les contrôles dans un formulaire lors de l'initialisation d'un formulaire?

J'ai essayé ce qui suit dans les méthodes init et run, mais cela ne fonctionne pas:

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;
    }
}

Y a-t-il une manière de faire ça?


Chaque contrôle peut avoir des contrôles enfants et des contrôles parents. Vous allez seulement au-dessus du premier niveau. Voici un exemple de travail qui montre comment utiliser la récursivité sur les contrôles de formulaire.

static void recurseOverAllFormControls(Args _args)
{
    Form form = new Form(formstr(SalesTable));

    void recurse(Object _parent, int _depth = 1)
    {
        int     i;
        str     name;
        str     caption;
        str     dashes;
        ;

        // Used for making it pretty
        //-->
        i = _depth;
        while (i)
        {
            dashes += '-';
            i--;
        }
        //<--

        // Used for example of how to use data
        //-->
        if (SysTest::hasMethod(_parent, identifierStr(caption)))
            caption = _parent.caption();

        if (SysTest::hasMethod(_parent, identifierStr(name)))
            name = _parent.name();

        info(strfmt("%1%2[%3](%4)", _depth, dashes, name, caption));
        //<--

        // Escape condition!
        if (_parent.controlCount() == 0)
            return;

        // Recursive statement
        for (i=1; i<=_parent.controlCount(); i++)
            recurse(_parent.controlNum(i), _depth+1);
    }
    ;

    recurse(form.design());
}

Edit : Ah quelqu'un m'a battu à la réponse. J'espère que quelqu'un appréciera mon travail de démo.


Le code que vous avez fonctionne, mais il ne fait que répéter le niveau supérieur de la conception. Vous devez créer une fonction récursive pour parcourir l'ensemble des contrôles et la placer dans la méthode init avant le super ():

void init()
{
    int     i;
    void    processControls(FormBuildControl fbc)
    {
        int     j;
        ;

        if (fbc.isContainer())
        {
            for (j = 1; j < fbc.controlCount(); j++)
            {
                //Process container, if you need to
                processControls(fbc.controlNum(j)); 
            }
        }
        else
        {
            //Control is not a container, process it here.                
        }
    }
    ;

    for (i = 1; i <= element.form().design().controlCount(); i++)
    {
        processControls(element.form().design().controlNum(i);
    }

    super();
}

L'appel de super () initialisera automatiquement tous les contrôles sur le formulaire. Une fois qu'ils sont initialisés, vous ne pourrez pas utiliser les objets de type FormBuildControl pour configurer les champs, car ils seront déjà consommés sur le formulaire. Si vous avez besoin de modifier le champ après l'initialisation, vous devez vous référer directement au champ (même si je ne suis pas sûr de la façon dont vous pourriez obtenir le nom du champ et le référencer via X ++).

Au lieu d'initialiser les contrôles de manière conditionnelle, appelez super () et masquez simplement le champ de manière conditionnelle, ou utilisez la sécurité pour masquer les informations auxquelles vous ne voulez pas que certaines personnes aient accès.

EDIT: Puisque vous avez affaire à FormBuildControl s, qui sont des conceptions pré-initialisées, vous devriez avoir l'appel super () après l'appel initial de processControls. J'ai changé mon exemple pour refléter cela.