Захотелось тут добавить на грид с адресами в стандартной форме пару контролов. Смотрю, странно как-то грид реализован - не использует табличные группы полей, все контролы явно накиданы на грид. Фиг бы с ним, думаю, отрефакторю: сделал группу полей с нужными мне добавками, вывел на грид - и форма перестала открываться. Оказалось, что класс FormRunListener_Address_RU не поддерживает группы контролов в гриде, более того, он также не поддерживает display/edit-методы и unbound-контролы! Переделал используемый в этом классе м... незатейливый перебор контролов на вызов своего
итератора (последний пришлось допилить, чтоб поддерживал и FormBuild-контролы), а сам класс FormRunListener_Address_RU модифицировал следующим образом:
X++:
private Set addAddressGroupGrid()
{
FormBuildDesign design;
FormBuildStringControl formStringControl;
FormBuildControl parentControl;
FormBuildDataSource formDataSource, tmpFormDataSource;
Set ret = new Set(Types::Container);
Integer zipCodeControlId;
FormBuildStringControl zipCodeControl;
container groupInfo;
int i, j;
extendedTypeId type;
SysAnyType zipCodeControlRef; //+gl00m, 14.03.2011
void addAddressElementControl(fieldId _fieldId)
{
;
formStringControl = parentControl.addControl(FormControlType::String, #ControlName);
formStringControl.dataSource(formDataSource.id());
formStringControl.dataField(_fieldId);
}
;
design = formRun.form().design();
for (i = 1; i <= conlen(addressInfoGrid); i ++)
{
groupInfo = conpeek(addressInfoGrid, i);
parentControl = design.control(conpeek(groupInfo, #1));
// gl00m, 14.03.2011 -->
/*
for (j = 1; j <= parentControl.controlCount(); j ++)
{
formStringControl = parentControl.controlNum(j);
tmpFormDataSource = formRun.form().dataSource(formStringControl.dataSource());
type = new DictField(tmpFormDataSource.table(), formStringControl.dataField()).typeId();
if(type == extendedtypenum(AddressCountryRegionId) ||
type == extendedtypenum(AddressStateId) ||
type == extendedtypenum(AddressCountyId))
{
formStringControl.name(#ControlName);
}
if (type == extendedtypenum(AddressZipCodeId))
{
zipCodeControl = parentControl.controlNum(j);
zipCodeControlId = zipCodeControl.id();
zipCodeControl.name(#ZipCodeControlName);
}
}
*/
zipCodeControlRef = new SysAnyType( new Object() );
DEV_iterateThroughFormControls( parentControl,
this,
methodstr(FormRunListener_Address_RU, processAddressRelatedFormControl),
DEV_FormHelpers::addBuildStringCtrlId2Set(),
true,
0,
zipCodeControlRef
);
zipCodeControl = zipCodeControlRef.value();
zipCodeControlId = zipCodeControl.id();
// gl00m, 14.03.2011 <--
formDataSource = formRun.form().dataSource(zipCodeControl.dataSource());
addAddressElementControl(fieldnum(Address, TownId_RU));
addAddressElementControl(fieldnum(Address, SettlementId_RU));
addAddressElementControl(fieldnum(Address, StreetId_RU));
addAddressElementControl(fieldnum(Address, Estate_RU));
addAddressElementControl(fieldnum(Address, Building_RU));
addAddressElementControl(fieldnum(Address, Flat_RU));
ret.add([formDataSource.name(), conpeek(groupInfo, #1), conpeek(groupInfo, #2), fieldnum(Address, ZipCode), zipCodeControlId]);
}
return ret;
}
// gl00m, 14.03.2011
// сюда вынесена часть кода из внутреннего цикла в методе addAddressGroupGrid()
private void processAddressRelatedFormControl(FormBuildStringControl _formStringControl, Object _optParm = null)
{
FormBuildDataSource tmpFormDataSource;
SysAnyType zipCodeControlRef;
DictField dictField;
extendedTypeId type;
;
tmpFormDataSource = formRun.form().dataSource(_formStringControl.dataSource());
if (tmpFormDataSource)
{
dictField = new DictField(tmpFormDataSource.table(), _formStringControl.dataField());
}
if (dictField)
{
type = dictField.typeId();
}
if ( type == extendedtypenum(AddressCountryRegionId)
|| type == extendedtypenum(AddressStateId)
|| type == extendedtypenum(AddressCountyId)
)
{
_formStringControl.name(#ControlName);
}
if (type == extendedtypenum(AddressZipCodeId))
{
_formStringControl.name(#ZipCodeControlName);
// возвращаем ссылку на найденный FormControl для почтового индекса
zipCodeControlRef = SysDictClass::as(_optParm, classnum(SysAnyType));
if (zipCodeControlRef)
{
zipCodeControlRef.value(_formStringControl);
}
}
}
Приложение AX 2009 SP1 EE RU5