根据用户输入启用/禁用向导的FINISH按钮

时间:2013-05-15 05:32:54

标签: axapta x++ dynamics-ax-2012 dynamics-ax-2012-r2

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

我已经尝试过这3种方法,但没有成功..

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

finishenabled [formrun.tabidx()] = false - 关于向导类的SetupNavigation方法

syswizard.finishenable(false,curtabidx(),false) - 在向导表单的Tabpage上

如果有人有解决方案,请回复....

3 个答案:

答案 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);
}

同样来自MSDN Enable Buttons

答案 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());
}