AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.12.2008, 15:59   #1  
HorrR is offline
HorrR
Участник
 
340 / 30 (2) +++
Регистрация: 18.02.2008
Адрес: Киев
Как отреагировать на активацию дейтасоурсов.
Ситуация такая - есть на форме 2 ДС. Нажимается кнопка. При нажатии отрабатывается метод того ДС, на котором последним был остановлен фокус.

Для данной цели Active на DataSourcе не подходит, так как, если рекорд уже был выбран, при переходе на другой датасоурс и возврате на ЭТОТ ЖЕ рекорд, ничего не произойдет, ибо новая запись на данном дейтасоурсе не была выбрана.

И если, допустим, в случае грида можно просто перегрузить gotFocus, то как быть с отдельными контролами, разбросанными по group?. Неужели перегружать gotFocus на каждом из них?
__________________
Axapta has seduced me deadly!
Старый 23.12.2008, 16:07   #2  
coolibin is offline
coolibin
Участник
 
264 / 68 (3) ++++
Регистрация: 07.04.2005
Ну, у контейнерных элементов тоже есть gotFocus()
Старый 23.12.2008, 16:22   #3  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от HorrR Посмотреть сообщение
Ситуация такая - есть на форме 2 ДС. Нажимается кнопка. При нажатии отрабатывается метод того ДС, на котором последним был остановлен фокус.

Для данной цели Active на DataSourcе не подходит, так как, если рекорд уже был выбран, при переходе на другой датасоурс и возврате на ЭТОТ ЖЕ рекорд, ничего не произойдет, ибо новая запись на данном дейтасоурсе не была выбрана.

И если, допустим, в случае грида можно просто перегрузить gotFocus, то как быть с отдельными контролами, разбросанными по group?. Неужели перегружать gotFocus на каждом из них?
Неоднозначная имхо постановка вопроса.
Если вы подразумеваете под "на котором последним был остановлен фокус" - тот, на который последний раз тыркнул пользователь - то да, придётся на все контролы вешать, иначе не знаю как. Естественно не на каждый стринг-эдит, а более оптимально - на группы

При этом с gotFocus вы явно намучаетесь, т.к. его срабатываение - вещь не тривиальная - например при открыти формы он не отработает на вашем первом гриде, как наверное хотелось бы.
__________________
Zhirenkov Vitaly
Старый 23.12.2008, 16:23   #4  
HorrR is offline
HorrR
Участник
 
340 / 30 (2) +++
Регистрация: 18.02.2008
Адрес: Киев
Пробовал до того, как создать пост.
Не реагирует сей метод на перемещение фокуса в один из контролов, входящий в контейнерный элемент(как минимум не работает с группой).
__________________
Axapta has seduced me deadly!
Старый 23.12.2008, 16:23   #5  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от coolibin Посмотреть сообщение
Ну, у контейнерных элементов тоже есть gotFocus()
Вы что имеете ввиду под контейнерными элементами?
Группы, ТабПэйджи?
__________________
Zhirenkov Vitaly
Старый 23.12.2008, 16:25   #6  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от HorrR Посмотреть сообщение
Пробовал до того, как создать пост.
Не реагирует сей метод на перемещение фокуса в один из контролов, входящий в контейнерный элемент(как минимум не работает с группой).
Вот и я это хотел сказать... Метод то есть, но на группах и табПэйджах он почему-то не отрабатывает.
__________________
Zhirenkov Vitaly
Старый 23.12.2008, 16:29   #7  
HorrR is offline
HorrR
Участник
 
340 / 30 (2) +++
Регистрация: 18.02.2008
Адрес: Киев
Так что пока что весьма грустно получается. Прийдется развешивать GotFocus"ы по контроллам. Или проще будет создать две кнопки)
__________________
Axapta has seduced me deadly!
Старый 23.12.2008, 16:34   #8  
coolibin is offline
coolibin
Участник
 
264 / 68 (3) ++++
Регистрация: 07.04.2005
Цитата:
Сообщение от ZVV Посмотреть сообщение
Вот и я это хотел сказать... Метод то есть, но на группах и табПэйджах он почему-то не отрабатывает.
Понятно. Просто сам никогда не использовал, поэтому думал, что работает.
Старый 23.12.2008, 16:36   #9  
coolibin is offline
coolibin
Участник
 
264 / 68 (3) ++++
Регистрация: 07.04.2005
Цитата:
Сообщение от HorrR Посмотреть сообщение
Так что пока что весьма грустно получается. Прийдется развешивать GotFocus"ы по контроллам. Или проще будет создать две кнопки)
А откуда задача-то вылезла? Может народ подскажет как лучше решить. Просто баловаться с gotFocus() это скорее моветон в Аксапте.
Старый 23.12.2008, 16:48   #10  
HorrR is offline
HorrR
Участник
 
340 / 30 (2) +++
Регистрация: 18.02.2008
Адрес: Киев
Да задача вылезла в рамках апгрейд проекта одного, там подобный ф-ционал был реализован в другой системе(XAL) и соответственно необходимо реализовать подобное в Аксапте, при чем с утвержденным дизайном, как в старой системе. Вот так вот, отсюда и задачи такие неплепые. А проще, и наиболее рационально, конечно, создать 2 кнопки разные для 2х групп. Но дизайн уже утвержден и там 1на кнопка)))))) Так что моветон, не моветон, а видимо, единственно возможный солюшн)
__________________
Axapta has seduced me deadly!
Старый 23.12.2008, 17:00   #11  
coolibin is offline
coolibin
Участник
 
264 / 68 (3) ++++
Регистрация: 07.04.2005
Цитата:
Сообщение от HorrR Посмотреть сообщение
Так что моветон, не моветон, а видимо, единственно возможный солюшн)
Да ладно, дизайн же не самоцель. Нужно просто с заказчиком обсудить или кто там от его имени голос (и голову) имеет. В жизни всегда есть место... где можно творчески поразмыслить.
Старый 23.12.2008, 18:25   #12  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
2 HorrR:
Для случая с 1 кнопкой на вскидку могу предложить на рассмотрение еще вариант как получить последний активный DS - правда решение красотой не отличается.
Суть примерно в следующем: на форме через element.selectedControl() можно получить контрол на котором находится фокус, далее проверить у этого контрола свойство DataSource. По полученному id() источника данных выбрать нужный DS на форме.

Первая проблема такого решения: в момент нажатия на кнопку метод element.selectedControl() вернет контрол нажатой кнопки, поэтому придется сохранять предыдущий выбранный элемент формы и анализировать его. Второе над чем придется подумать - как анализировать контролы на которых не был указан источник данных (unbounded элементы), что в этом случае считать активным DS? Возможно вылезет еще что-то.

P.S. Набросал примерный вариант реализации:
Вложения
Тип файла: zip DemoProdBOMTable.zip (12.9 Кб, 43 просмотров)

Последний раз редактировалось petergunn; 23.12.2008 в 18:52. Причина: Добавлен проект
Старый 24.12.2008, 06:47   #13  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
Цитата:
Сообщение от HorrR Посмотреть сообщение
Так что пока что весьма грустно получается. Прийдется развешивать GotFocus"ы по контроллам.
Немного модифицировал предложенный вчера вариант. Попробуйте такой сценарий:
Содаем на форме метод
X++:
//  --> get last active formDataSource
int getControlDataSourceId( FormControl _formControl = element.selectedControl() )
{
    Object          object = _formControl   ;
    SysDictClass    sysDictClass    ;
    int             dataSourceId    ;
    ;

    if( !_formControl )
        return 0 ;

    sysDictClass = new SysDictClass( classidget( object ) ) ;
    if( !sysDictClass.hasObjectMethod( identifierstr( DataSource ) ) )
        return 0 ;

    dataSourceId = object.dataSource() ;
    return dataSourceId ;
}
//  <-- get last active formDataSource
В classDeclaration заводим переменную для хранения id последнего источника данных:
X++:
public class FormRun extends ObjectRun
{
    ...
    //  --> get last active formDataSource
    int     lastDataSourceId        ;
    //  <-- get last active formDataSource
}
перекрываем на форме метод selectControl:
X++:
public boolean selectControl(FormControl _control)
{
    boolean ret ;
    //  --> get last active formDataSource
    int     dataSourceId = element.getControlDataSourceId( element.selectedControl() ) ;

    if( dataSourceId )
        lastDataSourceId = dataSourceId ;
    //  <-- get last active formDataSource

    ret = super(_control);
    return ret;
}
По клику на кнопке остается только проанализировать значение lastDataSourceId:
X++:
void clicked()
{
    ...
    //  --> get last active formDataSource
    switch( lastDataSourceId )
    {
        case <Table1>_ds.id() :
            // TODO: код для источника данных <Table1>_ds
            // info( <Table1>_ds.name() ) ;
            break ;
        case <Table2>_ds.id() :
            // TODO: код для источника данных <Table2>_ds
            // info( <Table2>_ds.name() ) ;
            break ;
        case <Table3>_ds.id() :
            // info( <Table3>_ds.name() ) ;
            break ;
        default:
            break ;
    }
    //  <-- get last active formDataSource
}
За это сообщение автора поблагодарили: Poleax (1), Sergey Petrov (1).
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 17:04.