好的,我花了一些时间来尝试这个,我有两个可能的解决方案给你。
- 您可以通过使用未绑定的控件并传入选定的记录来完成
- 或者您可以在向导表单上使用数据源并过滤所选值
首先让我们尝试使用一个简单的未绑定控件来完成它。首先将 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 行为。
所以我希望这是你需要的。如果您还有其他问题,请告诉我。