【问题标题】:Enable/Disable FINISH button of wizard based on user input根据用户输入启用/禁用向导的 FINISH 按钮
【发布时间】:2013-05-15 05:32:54
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    用于验证用户输入,并在向导关闭之前调用。 如果用户输入无效,则返回 false。这将防止在用户单击 Finish 按钮时调用 run 方法。 Wizard Class on 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

    【讨论】:

    • 感谢您的回复。实际上我需要特别禁用“完成”按钮...我很清楚验证和禁用下一步。 Bt如何特别禁用FINISH按钮????
    • 底部,解释了这一点。您可以根据用户输入禁用完成按钮。如果完成按钮是下一个按钮,则 SysWizard.nextEnabled 将引用完成按钮
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      在表单类声明中添加以下内容:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-24
        • 2020-09-11
        • 2021-04-09
        • 1970-01-01
        • 1970-01-01
        • 2021-12-13
        相关资源
        最近更新 更多