Axapta 根据用户输入启用/禁用向导的“完成”按钮

Axapta 根据用户输入启用/禁用向导的“完成”按钮,axapta,x++,dynamics-ax-2012,dynamics-ax-2012-r2,Axapta,X++,Dynamics Ax 2012,Dynamics Ax 2012 R2,我已使用向导在AX 2012中创建了一个向导。。。现在我需要添加1个功能,即根据用户输入启用或禁用FINISH按钮 我已经试过这三种方法,但都没有成功 this.finishenabled()--关于wizard类的SetupNavigation方法 finishenabled[formrun.tabidx()]=false——关于wizard类的SetupNavigation方法 syswizard.finishenable(false,curtabidx(),false)-在向导表单的选项卡

我已使用向导在AX 2012中创建了一个向导。。。现在我需要添加1个功能,即根据用户输入启用或禁用FINISH按钮

我已经试过这三种方法,但都没有成功

this.finishenabled()--关于wizard类的SetupNavigation方法

finishenabled[formrun.tabidx()]=false——关于wizard类的SetupNavigation方法

syswizard.finishenable(false,curtabidx(),false)-在向导表单的选项卡页上


如果任何人对此有解决方案,请务必回复。…

向导类有一个验证方法,您将在其中执行以下操作:

boolean validate()
{
    if(SomeTestCondition)
    {
        return true;
    }
    return false;
}
class FormRun extends ObjectRun
{
    //FormControl objects used to get SysWizard Finish Button
    FormControlId   finishButtonId;
    FormControl     finishButton;
}
根据Microsoft的说法,此方法执行以下操作:

boolean validate()
{
    if(SomeTestCondition)
    {
        return true;
    }
    return false;
}
class FormRun extends ObjectRun
{
    //FormControl objects used to get SysWizard Finish Button
    FormControlId   finishButtonId;
    FormControl     finishButton;
}
用于验证用户输入,并在向导关闭前调用。 如果用户输入无效,则返回false。这将防止在用户单击Finish按钮时调用run方法。

此外,您可以对要验证的字段使用textchanged()方法(如果不是text,则可以使用对象的changed方法)


另外,在SysWizard类中,启用/禁用finishButton的检查位于该.hasFinishButton()的检查内(请参见SysWizard.enableButtons)


我通过覆盖向导类上的hasFinishButton()方法并设置ret=true,解决了这个问题。但是,这意味着您的“完成”按钮将在所有步骤中显示,但是,如果需要,您可以使用其他代码隐藏它。

在从SysWizard类调用的向导窗体上启用/禁用Finish按钮的最简单方法是使用FormControlId从FormRun对象检索FormControl对象,然后根据您的测试条件设置Enabled属性,例如,另一个FormControl是否包含值。有很多方法可以实现这一点。我将提供两个例子

在第一个示例中,所有修改都在向导窗体上完成。 使用的FormControl可以像任何将AutoDeclaration属性设置为Yes的FormControl一样调用。 在第二个示例中,我将重写向导类上的finishEnabled()方法,使其以预期的方式运行

在每个示例中,都使用FormControlId找到formControl,该ID将控件的标签文本(“Finish”)作为参数。我通过在代码编辑器的“Finish”(完成)上执行“Lookup Label/Text”(查找标签/文本)找到了正确的标签ID,然后在标签描述中选择了带有“Label for Finish button in wizard”(完成按钮标签在向导中)的SYS标签

示例1:向导窗体上的FormControl对象:

在classDeclaration表单中添加以下内容:

boolean validate()
{
    if(SomeTestCondition)
    {
        return true;
    }
    return false;
}
class FormRun extends ObjectRun
{
    //FormControl objects used to get SysWizard Finish Button
    FormControlId   finishButtonId;
    FormControl     finishButton;
}
在顶级Form init()方法中初始化新FormControl:

现在,您可以像使用任何其他表单控件一样使用该控件。在本例中,我使用WizardForm中名为IsFinished的复选框控件的状态作为测试条件,并从IsFinished.clicked()方法更新FormControl状态:

*示例2:*覆盖向导类中的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);
}
以init()方法的形式初始化控件值:

更新控件时调用类方法:

public void clicked()
{
    super();

    //set FormControl state based on the current value of the checkbox
    sysWizard.finishEnabled(this.checked());
}

谢谢回复。实际上我需要禁用完成按钮,特别是…我很清楚验证和禁用下一步。Bt如何禁用FINISH按钮,尤其是底部部分,对此进行了说明。您可以根据用户输入禁用finsh按钮。如果Finish按钮是下一个按钮,那么SysWizard.nextEnabled将引用finsihed按钮