Ошибка панели обновления:Элемент управления с идентификатором «xxx» не найден в UpdatePanel.
-
23-09-2019 - |
Вопрос
У меня есть составной раскрывающийся пользовательский элемент управления календарем, который состоит из текстового поля и изображения календаря, а также элемента управления проверкой.Я предоставляю свойство TextBox в пользовательском элементе управления, которое возвращает ссылку на текстовое поле, используемое внутри элемента управления.Это текстовое поле, в которое пользователь вводит дату.
На странице ASPX у меня есть экземпляр этого пользовательского элемента управления:
<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.Я думал, что в этом весь смысл добавления триггера.
Как обновить эту панель обновления, чтобы изменить текст в пользовательском элементе управления датой.Далее мне придется добавить другие триггеры, чтобы инициировать обновление панели обновлений из других элементов управления, разбросанных по странице, поэтому очевидно, что все источники триггеров не могут находиться в пределах 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».
Хм.Очевидно, возникла проблема с поиском встроенного элемента управления, хотя он находится на панели обновления, но у него нет проблем с поиском простого текстового поля, которое не встроено в пользовательский элемент управления!
Решение
Насколько я понимаю, текстовое поле встроено в пользовательский элемент управления 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" ...
то есть используйте идентификатор вместо 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
И добавьте это событие в свой пользовательский элемент управления:
Открытое событие DateChanged (отправитель ByVal как объект, ByVal e As System.EventArgs)
..и альт!
Добавьте триггер перед Page_Load, например.Страница_Инит.
Для сервера Runat элемента управления HTML внутри панели обновления вам необходимо разыменовать панель обновления, чтобы получить дескриптор элемента управления на стороне сервера:
использование System.Web.UI.HtmlControls;
HtmlControl x = (HtmlControl)this.MyUpdatePanel.FindControl("MyHtmlControl");