01.03.2010, 16:07 | #1 |
Участник
|
EP AX2009: сохранить параметры грида (фильтр, позиционирование)
Доброго всем дня!
делаю 2 UserControl'a для просмотра основных полей таблицы (грид) и для ввода/редактирования записи (форма), бросаю их на странички на портале, все работает. Но - встает вопрос удобства работы. Пример: пользователь отфильтровал записи в гриде (допустим, по дате, с применением фильтра) для редактирования, перешел к редактированию первой записи (т.е. на новую страничку портала), отредактировал, нажал "ОК" и редиректится на страничку с гридом и тут: 1. фильтр у грида не сохранился - заново пользователю формировать? 2. позиционирование на строке грида сбивается - активна всегда первая запись в гриде. Есть ли возможность заставить портал запоминать позицию в гриде, фильтр грида...? ...кодом (если можно - примерчик)? |
|
01.03.2010, 21:13 | #2 |
Member
|
1. Смотря как запрограммируете фильтр. Ввиду особенностей портала на Шарапоинте я, например, сохраняю примененный пользователем фильтр на списке, если делаю его в своих формах.
2. Штатно точно нет. Высока вероятность, что для решения задачи потребуется серьезная кастомизация движка портала. Я предпочитаю обходить проблему специализированными фильтрами, реализацией процессов таким образом, чтобы в ВЭБе было приемлемо работать.
__________________
С уважением, glibs® |
|
02.03.2010, 09:35 | #3 |
Участник
|
Цитата:
Если я правильно понимаю, так как идет переход между страницами портала, то следует все, что нужно, сохранять (во viewstate?) и передавать между страницами, и при необходимости - восстанавливать. да уж... непросто будет... |
|
03.03.2010, 17:10 | #4 |
Участник
|
viewstate может не помочь, т.к. у вас есть переходы по страницам.
|
|
03.03.2010, 17:23 | #5 |
Участник
|
да, спасибо
пока складываю в Session... ЗЫ А я правильно понял, что AxGridView не может создавать новые строки? |
|
04.03.2010, 00:02 | #6 |
Участник
|
С порталом в 2009-й пока не работал, но теоретически если есть возможность вклиниться в события страницы, подобные событиям ASP.Net, то можно решить проблему и с помощью viewstate. Единственное, что состояния нужно будет сериализировать.
|
|
31.03.2010, 17:40 | #7 |
Участник
|
В блоге The Microsoft Dynamics AX Enterprise Portal Blog предлагается перекрыть методы Pack() и Init() для используемого DataSet'а. Тогда при переходе между страницами и возврате на страницу с данным AxGridView, значение фильтра сохраняется и нет необходимости настраивать фильтр заново.
X++: public container pack() { container ret; SysLastValue sysLastValue; formdatasource filterDataSource; ; filterDataSource = SalesTable_ds; // Put your datasource name ttsbegin; // Delete last saved query for the current dataset delete_from sysLastValue where sysLastValue.Company == curext() && sysLastValue.UserId == curuserid() && sysLastValue.RecordType == UtilElementType::DataSet && sysLastValue.ElementName == filterDataSource.name() && sysLastValue.DesignName == filterDataSource.name(); // If there is a new queryRun() object then serialize and save it // in the sys last value table // Put your datasource name if (filterDataSource.queryRun()) { sysLastValue.RecId = 0; sysLastValue.Company = curext(); sysLastValue.UserId = curuserid(); sysLastValue.RecordType = UtilElementType::DataSet; sysLastValue.ElementName = filterDataSource.name(); sysLastValue.DesignName = filterDataSource.name(); sysLastValue.value = SysQuery::packRangeAndSortorder(filterDataSource.queryRun().query()); sysLastValue.insert(); } ttscommit; ret = super(); return ret; } X++: public void init() { SysLastValue sysLastValue; Query savedQuery; ; super(); // get the last value from the sys last value table select firstonly sysLastValue where sysLastValue.Company == curext() && sysLastValue.UserId == curuserid() && sysLastValue.RecordType == UtilElementType::DataSet && sysLastValue.ElementName == this.name() && sysLastValue.DesignName == this.name(); if (sysLastValue && sysLastValue.Value) { // If there is an unpack error delete the saved query if (!SysQuery::unpackRangeAndSortorder(this.query(), sysLastValue.value)) { ttsbegin; delete_from sysLastValue where sysLastValue.Company == curext() && sysLastValue.UserId == curuserid() && sysLastValue.RecordType == UtilElementType::DataSet && sysLastValue.ElementName == this.name() && sysLastValue.DesignName == this.name(); ttscommit; } } } |
|
31.03.2010, 19:47 | #8 |
Участник
|
Цитата:
Сообщение от LEXAR
X++: public container pack() { container ret; SysLastValue sysLastValue; ... delete_from sysLastValue where sysLastValue.Company == curext() && sysLastValue.UserId == curuserid() && sysLastValue.RecordType == UtilElementType::DataSet && sysLastValue.ElementName == filterDataSource.name() && sysLastValue.DesignName == filterDataSource.name(); ... Лучше не хардкодить, а использовать нормальный класс и нормальные штатные методы: ClassFactory.lastValueDelete ClassFactory.lastValueGet ClassFactory.lastValuePut и уж чего не стоит делать, так это обнулять recid, лучше пользоваться методом clear(). X++: public container pack() { container ret; formdatasource filterDataSource; ; filterDataSource = SalesTable_ds; // Put your datasource name ttsbegin; // Delete last saved query for the current dataset classFactory.lastValueDelete(curext(), curuserid(), UtilElementType::DataSet, filterDataSource.name() filterDataSource.name()); // If there is a new queryRun() object then serialize and save it // in the sys last value table // Put your datasource name if (filterDataSource.queryRun()) { classFactory.lastValuePut(SysQuery::packRangeAndSortorder(filterDataSource.queryRun().query(), curext(), curuserid(), UtilElementType::DataSet, filterDataSource.name(),filterDataSource.name()); } ttscommit; ret = super(); return ret; } |
|
31.03.2010, 20:59 | #9 |
Участник
|
Я сам в коде не разбирался, случайно наткнулся на ответ в блоге, написал сюда. А код этот писали индусы
|
|
01.04.2010, 09:16 | #10 |
Участник
|
Насчет сохранения выбранной строки:
http://www.eggheadcafe.com/software/...ion-after.aspx |
|