Errore di aggiornamento del pannello: controllo con l'ID “xxx” non è stato trovato nel UpdatePanel

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

Domanda

Ho una goccia composito verso il basso il controllo dell'utente calendario che è costituito da una casella di testo e immagini e il calendario e di un controllo di convalida. Espongo una proprietà chiamata "TextBox" sulla UserControl che restituisce un riferimento alla casella di testo utilizzato all'interno del controllo. Questo è il testo che l'utente inserisce la data in.

Nella pagina ASPX, ho un'istanza di questo UserControl:

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

Nel mio codice dietro, voglio rilevare quando un utente ha a schede fuori della casella di testo e, utilizzando un UpdatePanel, referesh un messaggio appropriato a seconda della data che è stato specificato.

Nel resto della pagina ASPX ho questo:

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

Ecco quello che faccio nel codice dietro:

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

Durante l'esecuzione della pagina e ho vista la fonte, vedo qualcosa di simile:

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

Quando l'eseguo, ottengo questo errore:

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

non pensavo che il controllo di innesco doveva essere all'interno del UpdatePanel. Ho pensato che era il punto di aggiungere il grilletto.

Come faccio rinfresco Questo aggiornamento modifica del pannello al testo in data UserControl. Successivo dovrò aggiungere altri trigger per attivare il rinfresco del pannello di aggiornamento da altri controlli sparsi in tutta la pagina, così chiaramente tutte le fonti di innesco non può essere all'interno del UpdatePanel.

Per provare un semplificare la situazione, ho aggiunto una casella di testo di prova, TextBox1 al pannello di aggiornamento:

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

Allora ottengo l'errore:

Impossibile trovare un evento denominato 'onchange' sul controllo associato 'TextBox1' per il trigger in 'upIntendedStay' UpdatePanel.

OK, ho aggiunto una casella di testo, TextBox1, all'interno del UpdatePanel, cambiamento "ClientId" per "ID" e "OnChange" a "TextChanged" e funziona. Ma ho ancora lo stesso errore, se la casella di testo non è all'interno del UpdatePanel.

deve la casella di testo innescando essere all'interno del pannello di aggiornamento? Questo è un requisito paralizzante.

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

OK..When mi muovo athe UserControl calendario nel pannello di aggiornamento, ottengo questo errore:

Un controllo con ID 'txtDate' non è stato trovato per il trigger in UpdatePanel 'upIntendedStay'.

Hmmm. E 'a quanto pare avere problemi a trovare il controllo incorporato anche se è all'interno del pannello di aggiornamento, ma non ha alcun problema a trovare una casella di testo semplice che non è incorporato all'interno di un UserControl !!

È stato utile?

Soluzione

Secondo quello che ho capito la casella di testo è incorporato il controllo utente dtmDateFirstEntry. Non è possibile utilizzare direttamente un controllo contenuta da un controllo utente. Il controllo utente deve esporre le vicende dei suoi controlli figlio se si desidera utilizzarli come trigger.

<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 sarebbe un evento esposto da dtmDateFirstEntry. Sapete come fare questo?

Altri suggerimenti

Si consiglia di provare:

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

che è, utilizzare l'ID al posto del ClientID per il ControlID e non usare il "On" prefisso per l'EventName.

ASPX Pagina:

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

Codice dietro:

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

E aggiungere questo evento per il controllo utente:

Festività pubblica DateChanged (ByVal sender As Object, ByVal e come System.EventArgs)

.. e viola!

Aggiungi The Trigger Prima Page Load, es. Page_Init.

Per un server runat controllo HTML all'interno di un pannello di aggiornamento è necessario dereference il pannello di aggiornamento per ottenere un handle per il controllo sul lato server:

utilizzando System.Web.UI.HtmlControls;

HtmlControl x = (HtmlControl)this.MyUpdatePanel.FindControl("MyHtmlControl");
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top