初始化AX 2012向导控件中的值....

时间:2012-12-17 09:40:24

标签: axapta dynamics-ax-2012 ax

我使用向导>向导在Ax2012中创建了一个向导,我从Custtablelistpage表单调用此向导...现在,我在此向导中添加了一些控件,如CustAccount,我需要初始化此控件中的值在Custtablelistpage表单中选择记录.... 我试图使用Args类来执行此操作,但它不起作用,请提出一些解决方案..

请使用工具>向导>向导在AX 2012中创建一个向导 那么,请把这个向导的菜单项放在custtablelistpage上。 之后,请在向导的欢迎选项卡上放置一个名为Customer account的字段。 现在,如果您在custtablelistpage表单中显示任何记录,请选择该记录。 我的任务是当我点击我放在custtablelist页面上的菜单项按钮时,向我的向导显示所选记录的帐号。

实际上,我已经编写了一些代码,这对于普通表单来说非常好。但它不适用于向导,我无法在我对向导的控制中初始化。

1 个答案:

答案 0 :(得分:3)

好的,我花了一些时间试试这个,我有两个可能的解决方案。

  • 您可以使用未绑定的控件并传入所选记录
  • 或者您可以在向导表单上使用数据源并过滤所选值

首先让我们尝试使用简单的未绑定控件来完成它。首先将CustTable成员变量和参数方法添加到向导类中。

public class MyTestWizardWizard extends SysWizard
{
    CustTable   mySelectedCustomer;
}

public CustTable parmMySelectedCustomer(CustTable _mySelectedCustomer = mySelectedCustomer)
{
    ;
    mySelectedCustomer = _mySelectedCustomer;
    return mySelectedCustomer;
}

然后在表单中,您可以覆盖init方法并执行以下操作:

void init()
{
    int                 controlid;
    FormStringControl   fsControl;
    ;

    super();

    if (element.Args().caller())
    {
        sysWizard = element.Args().caller();

        // Get the control id of the CustomerId control 
        controlid = element.controlId(formControlStr(MyTestWizardWizard, CustomerId));  

        // Check if we actually have a form string control
        if(element.control(controlid) is FormStringControl)
        {
            // Cast to the FormStringControl type
            fsControl = element.control(controlid) as FormStringControl;

            // Now fill in the field value
            fsControl.text(sysWizard.parmMySelectedCustomer().AccountNum);
        }
    }
    else
    {
        MyTestWizardWizard::main(new args());
        element.closeCancel();
    }
}

所以你在这里实际做的只是获取存储在向导类中的选定记录。然后我们检查我们想要赋值的控件是否实际上是将值放入的正确控件。

虽然这是有效的,但我更喜欢第二种方法。那就是在表单上使用数据源,并像这样在所选记录上放置一个范围。只需将CustTable作为数据源放在表单上,​​然后按照通常的方式放置控件。

然后,确保init方法在底部执行super()调用,以确保在调用数据源方法之前完成初始化:

void init()
{
    ;

    // make sure the sysWizard is already initialized before the super to make sure the init on the datasource has an instance of sysWizard
    if (element.Args().caller())
    {
        sysWizard = element.Args().caller();
    }
    else
    {
        MyTestWizardWizard::main(new args());
        element.closeCancel();
    }

    super();
}

然后覆盖数据源上的init方法,将范围放在custTable的recId字段上。 请注意,您可以在ExecuteQuery方法中指定范围的值,但对于这种情况,我只是在这里进行。

public void init()
{
    ;
    super();

    SysQuery::findOrCreateRange(this.query().dataSourceTable(tableNum(CustTable)), fieldNum(CustTable, RecId)).value(queryValue(SysWizard.parmMySelectedCustomer().RecId));
}

现在,当你的向导运行时,args将记录传递给你的向导类,表单会在数据源的init上选择它并在你选择的记录上放置一个范围。所有剩下的魔法都是具有绑定数据控件的正常Ax行为。

所以我希望这就是你所需要的。如果您还有其他问题,请与我们联系。