У меня есть составной выпадающий пользовательский элемент управления календаря, который состоит из текстового поля, изображения календаря и элемента управления проверки. Я выставляю свойство с именем «TextBox» в usercontrol, которое возвращает ссылку на текстовое поле, используемое в элементе управления. Это текстовое поле, в которое пользователь вводит дату.
На странице ASPX у меня есть экземпляр этого usercontrol:
<uc1:DropDownCalendar ID="dtmDateFirstEntry" runat="server" Required="True" />
В своем коде я хочу определить, когда пользователь закрыл текстовое поле, и с помощью UpdatePanel обновить соответствующее сообщение в зависимости от указанной даты.
В другом месте страницы ASPX у меня есть это:
<asp:UpdatePanel ID="upIntendedStay" runat="server">
<ContentTemplate>
<asp:Label ID="Label4" runat="server" Text="Update this text from server" CssClass="ErrorText"></asp:Label>
</ContentTemplate>
</asp:UpdatePanel>
Вот что я делаю в коде:
If Not Me.IsPostBack Then
dtmDateFirstEntry.TextBox.AutoPostBack = True
Dim trigger As New AsyncPostBackTrigger
trigger.ControlID = dtmDateFirstEntry.TextBox.ClientID
trigger.EventName = "onChange"
upIntendedStay.Triggers.Add(trigger)
End If
Когда страница запускается и я просматриваю источник, я вижу что-то вроде этого:
<input id="ctl00_phPageContent_dtmDateFirstEntry_txtDate" class="DefaultTextBox" name="ctl00$phPageContent$dtmDateFirstEntry$txtDate" onchange="javascript:setTimeout('__doPostBack(\'ctl00$phPageContent$dtmDateFirstEntry$txtDate\',\'\')', 0)" onkeypress="if (WebForm_TextBoxKeyHandler(event) == false) return false;" style="width: 112px;" type="text" value="Mar-29-2010" />
<input id="ctl00_phPageContent_dtmDateFirstEntry_imgDate" name="ctl00$phPageContent$dtmDateFirstEntry$imgDate" src="images/calendar.JPG" style="border-width: 0px;" type="image" />
Когда я запускаю его, я получаю эту ошибку:
A control with ID 'ctl00_phPageContent_dtmDateFirstEntry_txtDate' could not be found for the trigger in UpdatePanel 'upIntendedStay'.
Я не думал, что управление триггером должно быть в UpdatePanel. Я думал, что в этом весь смысл добавления триггера.
Как мне обновить это обновление панели изменений, чтобы текст в дате usercontrol. Затем мне нужно будет добавить другие триггеры, чтобы инициировать обновление панели обновления из других элементов управления, разбросанных по всей странице, поэтому очевидно, что все источники триггеров не могут находиться в UpdatePanel.
Чтобы упростить ситуацию, я добавил тестовое поле Textbox1 на панель обновления:
<asp:UpdatePanel ID="upIntendedStay" runat="server">
<ContentTemplate>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Label ID="Label4" runat="server" Text="Update tHis text from server" CssClass="ErrorText"></asp:Label>
</ContentTemplate>
</asp:UpdatePanel>
Я тогда получаю ошибку:
Не удалось найти событие с именем «onchange» в связанном элементе управления «TextBox1» для триггера в UpdatePanel «upIntendedStay».
ОК, я добавил текстовое поле TEXTBOX1 в UpdatePanel, изменил «ClientId» на «ID» и «OnChange» на «TextChanged», и это работает. Но я все еще получаю ту же ошибку, если текстовое поле не в UpdatePanel.
Должно ли всплывающее текстовое поле находиться на панели обновлений? Это серьезное требование.
Dim trigger As New AsyncPostBackTrigger
'trigger.ControlID = dtmDateFirstEntry.TextBox.ID '<<<<<<<<<<<<<<<<<<<<<
trigger.ControlID = TextBox1.ID
trigger.EventName = "TextChanged"
upIntendedStay.Triggers.Add(trigger)
ОК. Когда я перемещаю элемент управления пользователя календаря на панель «Обновления», я получаю эту ошибку:
Не удалось найти элемент управления с идентификатором 'txtDate' для триггера в UpdatePanel 'upIntendedStay'.
Хм. У него, очевидно, есть проблема с поиском встроенного элемента управления, даже если он находится на панели обновления, но у него нет проблем с поиском простого текстового поля, которое не встроено в пользовательский элемент управления !!