Ошибка панели обновления:Элемент управления с идентификатором «xxx» не найден в UpdatePanel.

StackOverflow https://stackoverflow.com/questions/2542469

Вопрос

У меня есть составной раскрывающийся пользовательский элемент управления календарем, который состоит из текстового поля и изображения календаря, а также элемента управления проверкой.Я предоставляю свойство 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" />&nbsp;

Когда я запускаю его, я получаю эту ошибку:

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");
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top