Ошибка панели обновления: элемент управления с идентификатором "xxx" не найден в панели обновления - PullRequest
5 голосов
/ 30 марта 2010

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

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

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'.

Хм. У него, очевидно, есть проблема с поиском встроенного элемента управления, даже если он находится на панели обновления, но у него нет проблем с поиском простого текстового поля, которое не встроено в пользовательский элемент управления !!

Ответы [ 5 ]

4 голосов
/ 30 марта 2010

В соответствии с тем, что я понимаю, текстовое поле встроено в пользовательский элемент управления dtmDateFirstEntry. Вы НЕ МОЖЕТЕ использовать непосредственно элемент управления, содержащийся в пользовательском элементе управления. Пользовательский элемент управления ДОЛЖЕН раскрывать события своих дочерних элементов управления, если вы хотите использовать их в качестве триггеров.

<code><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. Вы знаете, как это сделать?

2 голосов
/ 30 марта 2010

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 и как System.EventArgs)

.. и альт!

2 голосов
/ 30 марта 2010

Вы можете попробовать:

...
trigger.ControlID = dtmDateFirstEntry.TextBox.ID
trigger.EventName = "TextChanged"
...

то есть используйте идентификатор вместо ClientID для ControlID и не используйте префикс «On» для EventName.

1 голос
/ 27 октября 2011

Добавить триггер до Page_Load, напр. Page_Init.

0 голосов
/ 11 марта 2011

Для html-сервера элементов управления внутри панели обновлений необходимо разыменовать панель обновлений, чтобы получить дескриптор элемента управления на стороне сервера:

с использованием System.Web.UI.HtmlControls;

HtmlControl x = (HtmlControl)this.MyUpdatePanel.FindControl("MyHtmlControl");
...