我使用向导向导在AX 2012中创建了一个向导...现在我需要根据用户输入放置1个功能,即启用或禁用FINISH按钮。
我已经尝试过这3种方法,但没有成功..
this.finishenabled() - 关于向导类的SetupNavigation方法
finishenabled [formrun.tabidx()] = false - 关于向导类的SetupNavigation方法
syswizard.finishenable(false,curtabidx(),false) - 在向导表单的Tabpage上
如果有人有解决方案,请回复....
答案 0 :(得分:5)
Wizard类有一个验证方法,您可以在其中执行以下操作:
boolean validate()
{
if(SomeTestCondition)
{
return true;
}
return false;
}
根据Microsoft的说法,此方法执行以下操作:
用于验证用户输入,并在向导关闭之前调用。 如果用户输入无效,则返回false。这将阻止在用户单击“完成”按钮时调用run方法。 Wizard Class on MSDN
此外,您可以在要验证的字段上使用textchanged()方法(如果不是文本,则可以使用对象的已更改方法)。
if (this.text())
{
if (!sysWizard.isNextEnabled())
{
sysWizard.nextEnabled(true, sysWizard.curTab(), false);
}
}
else
{
if (sysWizard.isNextEnabled())
sysWizard.nextEnabled(false, sysWizard.curTab(), false);
}
答案 1 :(得分:0)
在SysWizard类中,启用/禁用finishButton的检查是在this.hasFinishButton()的检查中(参见SysWizard.enableButtons)。
我通过覆盖向导类中的hasFinishButton()方法并设置ret = true来克服此问题。但这确实意味着您的完成按钮将在所有步骤中显示,但如果需要,您可以使用其他代码隐藏它。
答案 2 :(得分:0)
启用/禁用从SysWizard类调用的向导表单上的“完成”按钮的最简单方法是使用FormControlId从FormRun对象检索FormControl对象,然后根据您的测试条件设置Enabled属性,例如另一个FormControl是否包含值。有很多方法可以实现这一点。我将提供两个例子。
在第一个示例中,所有修改都在向导表单上完成。 使用FormControl,可以像任何将AutoDeclaration属性设置为Yes的FormControl一样调用。 在第二个例子中,我将覆盖Wizard类中的finishEnabled()方法,因此它的行为方式与预期的一样。
在每个示例中,使用FormControlId找到formControl,FormControlId将控件的标签文本(“Finish”)作为参数。我通过在代码编辑器中的“完成”上执行“查找标签/文本”找到了正确的标签ID,然后在标签的描述中选择了“向导中的标签完成按钮”的SYS标签。
示例1:向导表单上的FormControl对象:
在Form classDeclaration中添加以下内容:
class FormRun extends ObjectRun
{
//FormControl objects used to get SysWizard Finish Button
FormControlId finishButtonId;
FormControl finishButton;
}
在顶级表单init()方法中初始化新的FormControl:
void init()
{
super();
if (element.Args().caller())
{
sysWizard = element.Args().caller();
}
finishButtonId = sysWizard.formRun().controlId("@SYS302811");
finishButton = sysWizard.formRun().control(finishButtonId);
finishButton.enabled(false);
}
现在您可以像使用任何其他表单控件一样使用该控件。在这种情况下,我在WizardForm中使用名为IsFinished的复选框控件状态作为测试条件,并从IsFinished.clicked()方法更新FormControl状态:
public void clicked()
{
super();
//set FormControl state based on the current value of the checkbox
finishButton.enabled(this.checked());
}
* 示例2: *覆盖Wizard类中的finishEnabled()方法:
请注意,您需要为方法参数设置默认值,否则AX将抛出编译错误,因为它与基类的签名不匹配。出于某种原因,AX无法正确创建方法签名。摆脱对super的默认调用,并将其替换为以下代码:
public boolean finishEnabled(boolean _enabled = false,
int _idx = this.curTab(),
boolean _setfocus = false)
{
return this.formRun().control(this.formRun().controlId("@SYS302811")).enabled(_enabled);
}
在Form init()方法中初始化控件值:
void init()
{
super();
if (element.Args().caller())
{
sysWizard = element.Args().caller();
}
sysWizard.finishEnabled();
}
更新控件时调用类方法:
public void clicked()
{
super();
//set FormControl state based on the current value of the checkbox
sysWizard.finishEnabled(this.checked());
}