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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.06.2014, 17:56   #9  
Hyper is offline
Hyper
Участник
Соотечественники
 
163 / 29 (1) +++
Регистрация: 09.10.2003
Решил задачу с помощью JavaScript. С .NET не сложилось.

Проблема, как я сейчас понимаю, заключалась в том, что событие onchange не вызывается, если содержимое объекта изменяется программно. В нашем случае при выборе даты в стандартном всплывающем окошке календаря дата вставляется в текстовый контрол программно, и постбэка не происходит.

Мне постбэк был необходим на одном поле типа AxBoundField, условно назовем его TerminationDate.

Вначале я добавил следующие элементы на страницу:
PHP код:
<asp:HiddenField ID="PrevTerminationDate" runat="server" />
<
input type="hidden" id="PrevTerminationDateElementId" value="<%=PrevTerminationDate.ClientID%>" />
<
input type="hidden" id="TerminationDateElementId" /> 
Первый - для отслеживания, поменялось ли значение TerminationDate. Второй и третий - для хранения идентификаторов элементов PrevTerminationDate и TerminationDate.

После этого в начале страницы я добавил блок JavaScript:
PHP код:
<script type="text/javascript" language="javascript">
    
// <!CDATA[
    
Sys.Application.add_load(load);
    function 
load() {
        
addOnChangeEvents();
    }
    function 
addOnChangeEvents() {
        var 
regex = new RegExp("^.*AxFormName.AxGroupName.*$");
        var 
els document.getElementsByTagName("INPUT");
        for (var 
0els.lengthi++) {
            if (
els[i].getAttribute('AxCtrlType') == 'AxDTD' && regex.test(els[i].id)) {
                
els[i].onchange onTermDateChange;
                
els[i].onfocus onTermDateFocus;
                
document.getElementById('TerminationDateElementId').value els[i].id;
                break; 
//interested only in TerminationDate - first element in group
            
}
        }
    }
    function 
onTermDateChange() {
        var 
prevTermDateElId document.getElementById('PrevTerminationDateElementId').value;
        var 
termDateElId document.getElementById('TerminationDateElementId').value;
        
document.getElementById(prevTermDateElId).value document.getElementById(termDateElId).value;
    }
    function 
onTermDateFocus() {
        var 
prevTermDateElId document.getElementById('PrevTerminationDateElementId').value;
        var 
termDateElId document.getElementById('TerminationDateElementId').value;
        var 
termDateEl document.getElementById(termDateElId);
        if (
termDateEl.value != document.getElementById(prevTermDateElId).value) {
            if (
"createEvent" in document) {
                var 
evt document.createEvent("HTMLEvents");
                
evt.initEvent("change"falsetrue);
                
termDateEl.dispatchEvent(evt);
            }
            else 
termDateEl.fireEvent("onchange");
        }
    }
    
// ]]>
</script> 
Функция addOnChangeEvents запускается сразу после загрузки страницы. В ней мы находим требуемый элемент (аттрибут AxCtrlType для даты в utcDateTime всегда установлен в AxDTD). Наш элемент первый в группе, найти его не составляет труда.

Перехватываем события onchange и onfocus - используем функции onTermDateChange и onTermDateFocus.

В функции onTermDateChange (вызывается всегда, когда значение даты изменяется вручную) мы записываем введенное значение даты в элемент PrevTerminationDate. AutoPostBack="true" при этом также срабатывает без проблем.

В функции onTermDateFocus (вызывается, когда наш элемент получает фокус) мы проверяем, изменилось ли значение даты. Для сравнения используем значение, сохраненное в PrevTerminationDate. При выборе даты в окошке календаря проверка срабатывает сразу, т.к. фокус автоматически переходит на наш элемент. Итак, если дата поменялась, мы программно вызываем событие onchange. При этом:
а) вызывается onTermDateChange, новое значение даты сохраняется в PrevTerminationDate.
б) срабатывает postback (очевидно, AutoPostBack="true" также привязан к onchange).

Работает.
За это сообщение автора поблагодарили: Dreadlock (3).
Теги
ax2012, enterprise portal, utcdatetime

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
emeadaxsupport: AxUpdatePortal.exe does not update Enterprise Portal when not running from an elevated command prompt Blog bot DAX Blogs 0 26.07.2009 15:07
Solutions Monkey: Microsoft Dynamics AX 2009 Enterprise Portal / Role Centers - Deployment Tips-n-Tricks – 3 Blog bot DAX Blogs 0 27.10.2008 08:05
Solutions Monkey: Enterprise Portal Screencasts at Channel9.msdn.com Blog bot DAX Blogs 6 01.07.2008 19:38
jinx: Microsoft Dynamics AX 2009 Enterprise Portal Entwicklung Samples Blog bot DAX auf Deutsch 0 27.06.2008 04:06
JOPX: Integrating MOSS 2007 and Dynamics AX Part II - installing and configuring Dynamics AX Enterprise Portal Blog bot DAX Blogs 0 02.03.2008 06:42

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

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

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