У меня есть составной выпадающий календарный пользовательский элемент управления, который состоит из текстового поля и и календарное изображение и управление проверкой. Я выставляю свойство под названием "Текстовое поле" на usercontrol, который возвращает ссылку на текстовое поле, используемое в рамках управления. Это - текстовое поле, в которое пользователь вводит дату.
На странице ASPX у меня есть экземпляр этого usercontrol:
<uc1:DropDownCalendar ID="dtmDateFirstEntry" runat="server" Required="True" />
В моем коде позади, я хочу обнаружить, когда пользователь снабдил вкладками прочь текстового поля и, с помощью UpdatePanel, referesh соответствующее сообщение в зависимости от даты, которая была указана.
В другом месте на странице 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" к "идентификатору" и "OnChange" к "TextChanged", и это работает. Но я все еще получаю ту же ошибку, если текстовое поле не в UpdatePanel.
Текстовое поле инициирования должно быть в панели обновления? Это - требование нанесения вреда.
Dim trigger As New AsyncPostBackTrigger
'trigger.ControlID = dtmDateFirstEntry.TextBox.ID '<<<<<<<<<<<<<<<<<<<<<
trigger.ControlID = TextBox1.ID
trigger.EventName = "TextChanged"
upIntendedStay.Triggers.Add(trigger)
Хорошо.. Когда я перемещаю athe календарь usercontrol в панель Update, я получаю эту ошибку:
Управление с идентификатором 'txtDate' не могло быть найдено для триггера в UpdatePanel 'upIntendedStay'.
Хм. Это, по-видимому, имеет проблему, находящую встроенное управление даже при том, что это в панели обновления, но это не имеет никакой проблемы при нахождении простого текстового поля, которое не встраивается в usercontrol!!
Насколько я понимаю, текстовое поле встроено в пользовательский элемент управления dtmDateFirstEntry. Вы НЕ МОЖЕТЕ использовать непосредственно элемент управления, содержащийся в пользовательском элементе управления. Пользовательский элемент управления ДОЛЖЕН предоставлять события своих дочерних элементов управления, если вы хотите использовать их в качестве триггеров.
<asp:UpdatePanel ID="upIntendedStay" runat="server" UpdateMode="Conditional">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="dtmDateFirstEntry" EventName="DateChanged" />
</Triggers>
<ContentTemplate>
<asp:Label ID="Label4" runat="server" Text="Update tHis text from server" CssClass="ErrorText"></asp:Label>
</ContentTemplate>
</asp:UpdatePanel>
DateChanged будет событием, предоставляемым dtmDateFirstEntry. Вы знаете, как это сделать?
Вы можете попробовать:
... trigger.ControlID = dtmDateFirstEntry.TextBox.ID trigger.EventName = "TextChanged" ...
то есть использовать ID вместо ClientID для ControlID и не использовать префикс «On» для EventName.
Страница ASPX:
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:TextBox ID="TextBox3" runat="server"></asp:TextBox>
<asp:UpdatePanel ID="upIntendedStay" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<uc1:DropDownCalendar ID="DropDownCalendar1" runat="server" />
<asp:Label ID="Label4" runat="server" Text="Update tHis text from server" CssClass="ErrorText"></asp:Label>
</ContentTemplate>
</asp:UpdatePanel>
</asp:Content>
Код за спиной:
If Not Page.IsPostBack Then
Dim trigger As New AsyncPostBackTrigger
TextBox3.AutoPostBack = True
trigger.ControlID = TextBox3.ID
trigger.EventName = ""
upIntendedStay.Triggers.Add(trigger)
Dim trigger2 As New AsyncPostBackTrigger
DropDownCalendar1.TextBox.AutoPostBack = True
trigger2.ControlID = DropDownCalendar1.ID
trigger2.EventName = "DateChanged"
upIntendedStay.Triggers.Add(trigger2)
End If
Label4.Text = Now.ToString
И добавьте это событие в пользовательский элемент управления:
Дата публичного событияChanged(ByVal sender As Object, ByVal e As System.EventArgs)
.. и альт!