表单初始化时如何循环遍历表单中的所有控件?
我在 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/