error de actualización de Panel: Control con el ID de “XXX” no se pudo encontrar en el UpdatePanel

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

Pregunta

I tiene una gota de material compuesto hacia abajo control de usuario calendario que consiste en una imagen de texto y y calendario y un control de validación. Expongo una propiedad llamada "Cuadro de texto" en el control de usuario que devuelve una referencia al cuadro de texto utilizados en el control. Este es el cuadro de texto que el usuario introduce la fecha en.

En la página ASPX, tengo una instancia de esta usercontrol:

   <uc1:DropDownCalendar ID="dtmDateFirstEntry" runat="server"  Required="True" />

En mi código detrás, quiero detectar cuando un usuario ha pestañas fuera del cuadro de texto y, utilizando un UpdatePanel, referesh un mensaje apropiado en función de la fecha en que se especificó.

En otras partes de la página ASPX tengo esto:

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

Esto es lo que hago en el código subyacente:

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

Al ejecutar la página y ver el código fuente, veo algo como esto:

<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;

Cuando corro, me sale este error:

A control with ID 'ctl00_phPageContent_dtmDateFirstEntry_txtDate' could not be found for the trigger in UpdatePanel 'upIntendedStay'. 

Yo no creía que el control de disparo tenía que estar dentro del UpdatePanel. Yo pensaba que era el punto de añadir el gatillo.

¿Cómo puedo actualizar este panel de actualización cambios en el texto en el control de usuario actualizada. A continuación voy a tener que añadir otros disparadores para activar la restauración del panel de actualización de otros controles dispersadas a través de la página, por lo que claramente todas las fuentes de disparo no pueden estar dentro del UpdatePanel.

Para probar un simplificar la situación, he añadido una prueba de cuadro de texto, TextBox1 al panel de actualización:

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

a continuación, obtener el error:

No se pudo encontrar un evento denominado 'onchange' de Control Asociado 'TextBox1' para el gatillo en UpdatePanel 'upIntendedStay'.

OK, he añadido un cuadro de texto, textBox1, dentro del UpdatePanel, el cambio "ClientId" a "ID" y "OnChange" a "TextChanged" y funciona. Pero sigo teniendo el mismo error si el cuadro de texto no está dentro del UpdatePanel.

debe desencadenar el cuadro de texto dentro del panel de actualización? Este es un requisito paralizante.

Dim trigger As New AsyncPostBackTrigger
'trigger.ControlID = dtmDateFirstEntry.TextBox.ID '<<<<<<<<<<<<<<<<<<<<<
trigger.ControlID = TextBox1.ID
trigger.EventName = "TextChanged"
upIntendedStay.Triggers.Add(trigger)

OK..When muevo athe usercontrol calendario en el panel de actualización, me sale este error:

A de control con el ID 'txtDate' no se pudo encontrar para el gatillo en UpdatePanel 'upIntendedStay'.

Hmmm. Al parecer es tener un problema para encontrar el control incrustado aunque sea dentro del panel de actualización, pero no tiene ningún problema para encontrar un cuadro de texto sin formato que no está incrustado dentro de un control de usuario !!

¿Fue útil?

Solución

Según lo que entiendo el cuadro de texto está incrustado para el Control del dtmDateFirstEntry usuario. No se puede utilizar directamente un control contenida por un control de usuario. El control de usuario debe exponer los acontecimientos de sus controles secundarios si desea utilizarlos como factores desencadenantes.

<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 sería un caso expuesto por dtmDateFirstEntry. ¿Usted sabe cómo hacer esto?

Otros consejos

Se puede intentar:

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

es decir, utilizar el ID en lugar del ClientID para la ControlID y no utilice el "On" prefijo para el eventName.

ASPX Página:

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

Código atrás:

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

y añadir a este evento para el control de usuario:

Evento Público dateChanged (remitente de ByVal como objeto, ByVal e As System.EventArgs)

.. y la viola!

Añadir el gatillo antes de Load, ex. Page_Init.

Para un servidor interior runat control HTML de un panel de actualización que necesita para eliminar la referencia al panel de actualización para obtener un identificador para el control en el lado del servidor:

usando System.Web.UI.HtmlControls;

HtmlControl x = (HtmlControl)this.MyUpdatePanel.FindControl("MyHtmlControl");
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top