Errore di aggiornamento del pannello: controllo con l'ID “xxx” non è stato trovato nel UpdatePanel
-
23-09-2019 - |
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" />
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 !!
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");