23.12.2008, 15:59 | #1 |
Участник
|
Как отреагировать на активацию дейтасоурсов.
Ситуация такая - есть на форме 2 ДС. Нажимается кнопка. При нажатии отрабатывается метод того ДС, на котором последним был остановлен фокус.
Для данной цели Active на DataSourcе не подходит, так как, если рекорд уже был выбран, при переходе на другой датасоурс и возврате на ЭТОТ ЖЕ рекорд, ничего не произойдет, ибо новая запись на данном дейтасоурсе не была выбрана. И если, допустим, в случае грида можно просто перегрузить gotFocus, то как быть с отдельными контролами, разбросанными по group?. Неужели перегружать gotFocus на каждом из них?
__________________
Axapta has seduced me deadly! |
|
23.12.2008, 16:07 | #2 |
Участник
|
Ну, у контейнерных элементов тоже есть gotFocus()
|
|
23.12.2008, 16:22 | #3 |
MCITP
|
Цитата:
Сообщение от HorrR
Ситуация такая - есть на форме 2 ДС. Нажимается кнопка. При нажатии отрабатывается метод того ДС, на котором последним был остановлен фокус.
Для данной цели Active на DataSourcе не подходит, так как, если рекорд уже был выбран, при переходе на другой датасоурс и возврате на ЭТОТ ЖЕ рекорд, ничего не произойдет, ибо новая запись на данном дейтасоурсе не была выбрана. И если, допустим, в случае грида можно просто перегрузить gotFocus, то как быть с отдельными контролами, разбросанными по group?. Неужели перегружать gotFocus на каждом из них? Если вы подразумеваете под "на котором последним был остановлен фокус" - тот, на который последний раз тыркнул пользователь - то да, придётся на все контролы вешать, иначе не знаю как. Естественно не на каждый стринг-эдит, а более оптимально - на группы При этом с gotFocus вы явно намучаетесь, т.к. его срабатываение - вещь не тривиальная - например при открыти формы он не отработает на вашем первом гриде, как наверное хотелось бы.
__________________
Zhirenkov Vitaly |
|
23.12.2008, 16:23 | #4 |
Участник
|
Пробовал до того, как создать пост.
Не реагирует сей метод на перемещение фокуса в один из контролов, входящий в контейнерный элемент(как минимум не работает с группой).
__________________
Axapta has seduced me deadly! |
|
23.12.2008, 16:23 | #5 |
MCITP
|
Вы что имеете ввиду под контейнерными элементами?
Группы, ТабПэйджи?
__________________
Zhirenkov Vitaly |
|
23.12.2008, 16:25 | #6 |
MCITP
|
Вот и я это хотел сказать... Метод то есть, но на группах и табПэйджах он почему-то не отрабатывает.
__________________
Zhirenkov Vitaly |
|
23.12.2008, 16:29 | #7 |
Участник
|
Так что пока что весьма грустно получается. Прийдется развешивать GotFocus"ы по контроллам. Или проще будет создать две кнопки)
__________________
Axapta has seduced me deadly! |
|
23.12.2008, 16:34 | #8 |
Участник
|
|
|
23.12.2008, 16:36 | #9 |
Участник
|
|
|
23.12.2008, 16:48 | #10 |
Участник
|
Да задача вылезла в рамках апгрейд проекта одного, там подобный ф-ционал был реализован в другой системе(XAL) и соответственно необходимо реализовать подобное в Аксапте, при чем с утвержденным дизайном, как в старой системе. Вот так вот, отсюда и задачи такие неплепые. А проще, и наиболее рационально, конечно, создать 2 кнопки разные для 2х групп. Но дизайн уже утвержден и там 1на кнопка)))))) Так что моветон, не моветон, а видимо, единственно возможный солюшн)
__________________
Axapta has seduced me deadly! |
|
23.12.2008, 17:00 | #11 |
Участник
|
|
|
23.12.2008, 18:25 | #12 |
Участник
|
2 HorrR:
Для случая с 1 кнопкой на вскидку могу предложить на рассмотрение еще вариант как получить последний активный DS - правда решение красотой не отличается. Суть примерно в следующем: на форме через element.selectedControl() можно получить контрол на котором находится фокус, далее проверить у этого контрола свойство DataSource. По полученному id() источника данных выбрать нужный DS на форме. Первая проблема такого решения: в момент нажатия на кнопку метод element.selectedControl() вернет контрол нажатой кнопки, поэтому придется сохранять предыдущий выбранный элемент формы и анализировать его. Второе над чем придется подумать - как анализировать контролы на которых не был указан источник данных (unbounded элементы), что в этом случае считать активным DS? Возможно вылезет еще что-то. P.S. Набросал примерный вариант реализации: Последний раз редактировалось petergunn; 23.12.2008 в 18:52. Причина: Добавлен проект |
|
24.12.2008, 06:47 | #13 |
Участник
|
Цитата:
Содаем на форме метод 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 X++: public class FormRun extends ObjectRun { ... // --> get last active formDataSource int lastDataSourceId ; // <-- get last active formDataSource } 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; } 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). |