3

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

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

this.finishenabled() -- 在向导类的 SetupNavigation 方法上

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

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

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

4

3 回答 3

5

Wizard 类有一个 validate 方法,您将在其中执行以下操作:

boolean validate()
{
    if(SomeTestCondition)
    {
        return true;
    }
    return false;
}

根据 Microsoft 的说法,此方法执行以下操作:

用于验证用户输入,并在向导关闭之前调用。如果用户输入无效,则返回 false。这将防止在用户单击 Finish 按钮时调用 run 方法。 MSDN 上的向导类

此外,您可以在要验证的字段上使用 textchanged() 方法(或者如果不是文本,您可以使用对象的 changed 方法)。

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

于 2013-05-17T14:36:22.830 回答
0

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

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

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

示例 1: Wizard Form 上的 FormControl 对象:

在 Form classDeclaration 中添加以下内容:

class FormRun extends ObjectRun
{
    //FormControl objects used to get SysWizard Finish Button
    FormControlId   finishButtonId;
    FormControl     finishButton;
}

在顶层 Form 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());
}
于 2013-12-19T03:05:03.470 回答
0

在 SysWizard 类中,启用/禁用 finishButton 的检查位于 this.hasFinishButton() 的检查中(参见 SysWizard.enableButtons)。

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

于 2013-09-23T13:19:41.147 回答