Создайте фильтр поиска для диалогового окна в Dynamics AX 4.0.

Я пытаюсь создать собственный фильтр поиска в диалоговом окне в AX.

Я следовал инструкциям в этом сообщении поиск фильтра x++ в диалоговом окне и получаю Ошибка трассировки стека — объект FormRun не инициализирован — когда я запускаю свой код.

То, что я пытаюсь сделать, это отфильтровать lookup() для EDT ConfigId на основе выбора из EDT ItemId. У меня есть пользовательский lookup(), готовый к работе и работающий правильно, я просто не могу вызвать его из своего диалогового окна.

public Object dialog(DialogRunbase _dialog, boolean _forceOnClient)
{
    DialogRunBase   dialog;
    ;

    dialog = super(_dialog, true);

    dialog.caption('@RID2885');

    dfItem = dialog.addField(typeid(ItemId));
    dfInventLoc = dialog.addField(typeid(InventLocationId));
    dfReplaceCost = dialog.addField(typeid(PdsCost));
    dfItemConfig = dialog.addField(typeid(ConfigId));
    dfColorId = dialog.addField(typeid(InventColorId), '@RID101');

    return dialog;
}

Вот вызов функции поиска():

void Fld_7_lookup()
{
    Formrun fr = this.dialogModify().parmDialog();
    Object control = fr.controlCallingMethod();    
    ;

    ConfigTable::lookupConfigIdSimple(control, dfItem.value());    
}

И здесь он продолжает получать ошибку трассировки стека:

public void dialogPostRun(DialogRunbase _dialog)
{
    ;
     super(_dialog);
    **_dialog.formRun().controlMethodOverload(true);** // Causes Stack Trace error
    _dialog.formRun().controlMethodOverloadObject(this);       
}

Я пробовал несколько конфигураций с диалоговым окном. Когда код достигает этой точки, он все еще имеет информацию, переданную из метода dialog(), но когда он переходит к получению FormRun, этот объект остается пустым.

Может ли кто-нибудь помочь мне понять, почему нет объекта FormRun, связанного с переданным DiaglogRunBase?

Спасибо.


person Chris Fair    schedule 09.06.2011    source источник
comment
У меня нет ошибки времени выполнения с вашим кодом.   -  person 10p    schedule 09.06.2011
comment
Значит, я где-то еще что-то делаю не так. Я не получаю, чтобы FormRun был действительным.   -  person Chris Fair    schedule 10.06.2011
comment
Может быть, вы вызываете dialogPostRun вручную или делаете что-то еще неправильно? Можете ли вы предоставить код, который вы используете для открытия диалогового окна, или любой другой фрагмент кода, который может иметь отношение к проблеме?   -  person 10p    schedule 17.06.2011


Ответы (2)


Возможно, вам следует вызывать super(_dialog) последним в методе dialogPostRun.

Посмотрите на похожее решение. и еще один.

person Jan B. Kjeldsen    schedule 10.06.2011
comment
Я тоже пробовал это, и я все еще получаю сообщение об ошибке. Я даже пытался не включать вызов super(), но все равно получаю ошибку трассировки стека. Я тоже видел эти ссылки раньше, но они не помогли. - person Chris Fair; 10.06.2011

Вы проверили, настроен ли ваш класс для запуска «Вызывается из»?

Вот пример кода для переопределения модифицированного метода. Возможно, поиск имеет те же требования:

public void dialogPostRun(DialogRunbase _dialog)
{
// Must be overriden to enable overriding modified method
;
    _dialog.dialogForm().formRun().controlMethodOverload(true);
    _dialog.dialogForm().formRun().controlMethodOverloadObject(this);
    _dialog.formRun().controlMethodOverload(true);
    _dialog.formRun().controlMethodOverloadObject(this);

    super(_dialog);
}

И для пользовательского метода:

boolean Fld2_1_modified()
{
    FormStringControl c = dialog.formrun().controlCallingMethod();
    boolean ret;
    ;

    ret = c.modified(); // Super() Call the FormControl ->modified

    dlgCustomField.value(MyClass::someMethod(dlgCustomField.value())); // example

    return ret;
}
person Skaue    schedule 15.06.2011
comment
К сожалению, мой класс уже настроен на запуск в Called from. Здесь есть другой код, который делает то же самое, и он работает. Я скопировал этот код и просто заменил его своими переменными, и он ВСЕ ЕЩЕ не работает. Почему у него пустой FormRun, мне не понятно. Это не должно. Это даже null, когда я вхожу в метод DialogPostRun. Самого диалога нет, но FormRun диалога есть. Разве это не должно быть установлено при создании диалога? - person Chris Fair; 16.06.2011