Решил задачу с помощью 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 i = 0; i < els.length; i++) {
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", false, true);
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).
Работает.