Mise à jour du panneau erreur: avec l'ID « xxx » n'a pas été trouvé dans le UpdatePanel

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

Question

I présentent une chute composite vers le bas contrôle utilisateur de calendrier qui se compose d'une zone de texte et d'image et de calendrier et une commande de validation. J'expose une propriété appelée « zone de texte » sur le usercontrol qui renvoie une référence à la zone de texte utilisé dans le contrôle. Ceci est la zone de texte que l'utilisateur entre la date dans.

Dans la page ASPX, j'ai une instance de cette usercontrol:

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

Dans mon code derrière, je veux détecter lorsqu'un utilisateur a hors de l'onglet zone de texte et, en utilisant un UpdatePanel, referesh un message approprié en fonction de la date qui a été spécifiée.

Ailleurs dans la page ASPX J'ai ceci:

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

Voici ce que je fais dans le code sous-jacent:

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

Lors de l'exécution de la page et je l'ai vue la source, je vois quelque chose comme ceci:

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

Quand je cours, je reçois cette erreur:

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

Je ne pensais pas que le contrôle de déclenchement devait être dans le UpdatePanel. Je pensais que tout était le point d'ajouter le déclencheur.

Comment puis-je rafraîchir ce panneau de mise à jour des modifications du texte à la date usercontrol. Ensuite, je dois ajouter d'autres déclencheurs pour déclencher le rafraîchissement du panneau de mise à jour d'autres contrôles dispersés à travers la page, si clairement toutes les sources de déclenchement ne peuvent pas être dans le UpdatePanel.

Pour essayer une simplifier la situation, j'ai ajouté une zone de texte de test, textbox1 au panneau de mise à jour:

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

J'obtiens alors l'erreur:

Impossible de trouver un événement nommé « onchange » sur le contrôle associé « TextBox1 » pour la détente dans « upIntendedStay » UpdatePanel.

OK, j'ai ajouté une zone de texte, textbox1, dans le UpdatePanel, le changement "ClientId" à "ID" et "OnChange" à "TextChanged" et cela fonctionne. Mais je reçois toujours la même erreur si la zone de texte ne relève pas de l'UpdatePanel.

doit être le champ de déclenchement dans le panneau de mise à jour? Cette exigence est rédhibitoire.

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

OK..When je déplace athe usercontrol calendrier dans le panneau de mise à jour, je reçois cette erreur:

Un contrôle avec l'ID « txtDate » n'a pas pu être trouvée pour la détente dans UpdatePanel « upIntendedStay ».

Hmmm. Il est apparemment avoir un problème à trouver le contrôle intégré, même si elle est dans le panneau de mise à jour, mais il n'a pas de problème à trouver une zone de texte simple qui n'est pas incorporé dans un usercontrol !!

Était-ce utile?

La solution

D'après ce que je comprends la zone de texte est intégré sur le contrôle utilisateur dtmDateFirstEntry. Vous ne pouvez utiliser directement un contrôle contenu par un contrôle utilisateur. Le contrôle utilisateur doit exposer les événements de ses contrôles enfants si vous voulez les utiliser comme déclencheurs.

<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 serait un événement exposé par dtmDateFirstEntry. Savez-vous comment faire?

Autres conseils

Vous pouvez essayer:

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

qui est, utilisez l'ID au lieu du ClientID pour la ControlID et ne pas utiliser le préfixe « on » pour le EventName.

ASPX Page:

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

Code de derrière:

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

Et ajouter cet événement à votre contrôle utilisateur:

Événement public DateChanged (sender ByVal comme objet, ByVal e comme System.EventArgs)

.. et alto!

Ajouter le déclencheur Avant Page_Load, ex. Page_Init.

Pour un serveur runat de contrôle HTML à l'intérieur d'un panneau de mise à jour vous devez déréférencer le panneau de mise à jour pour obtenir une poignée à la commande du côté du serveur:

en utilisant System.Web.UI.HtmlControls;

HtmlControl x = (HtmlControl)this.MyUpdatePanel.FindControl("MyHtmlControl");
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top