表单初始化时如何循环遍历表单中的所有控件?

我在 init 和 run 方法中尝试了以下方法,但它不起作用:

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

有没有办法做到这一点?

最佳答案

您拥有的代码有效,但它只迭代设计的顶层。您需要构建一个递归函数来遍历整个控件集,并将其放在 init 方法中的 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();
}

super() 调用将自动初始化窗体上的所有控件。一旦它们被初始化,你将不能使用 FormBuildControl 类型对象来配置字段,因为它们已经被表单使用了。如果您需要在初始化后修改该字段,您应该直接引用该字段(尽管我不确定您如何获取该字段名称并通过 X++ 引用它)。

不是有条件地初始化控件,而是调用 super() 并简单地有条件地隐藏字段,或者使用安全来隐藏您不希望某些人访问的信息。

编辑:
由于您正在处理 FormBuildControl s,这是预初始化的设计,您应该在初始 processControls 调用之后调用 super() 。我已经改变了我的例子来反射(reflect)这一点。

关于dynamic - AX2009 循环遍历 init 窗体中的所有控件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23787228/

10-11 23:11
查看更多