Erro do painel de atualização: Controle com o ID “XXX” não pôde ser encontrado no UpdatePanel

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

Pergunta

Eu tenho um controle de usuário de calendário suspenso composto que consiste em uma caixa de texto e e imagem do calendário e um controle de validação. Exponho uma propriedade chamada "TextBox" no UserControl que retorna uma referência à caixa de texto usada no controle. Esta é a caixa de texto em que o usuário insere a data.

Na página ASPX, tenho uma instância deste UserControl:

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

No meu código por trás, quero detectar quando um usuário abaixou a caixa de texto e, usando um UpdatePanel, refere -se a uma mensagem apropriada, dependendo da data especificada.

Em outros lugares da página ASPX, tenho isso:

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

Aqui está o que eu faço no código atrás:

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

Quando a página é executada e eu vejo a fonte, vejo algo assim:

<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 eu o executo, recebo este erro:

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

Eu não achei que o controle do gatilho tivesse que estar dentro do UpdatePanel. Eu pensei que esse era o objetivo de adicionar o gatilho.

Como faço para atualizar o painel de atualização muda para o texto na data UserControl. Em seguida, terei que adicionar outros gatilhos para acionar a atualização do painel de atualização de outros controles espalhados pela página, portanto, claramente todas as fontes de gatilho não podem estar dentro do UpdatePanel.

Para tentar simplificar a situação, adicionei uma caixa de texto de teste, TextBox1 no painel de atualização:

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

Eu então recebo o erro:

Não foi possível encontrar um evento chamado 'OnChange' no controle associado 'TextBox1' para o gatilho no UpdatePanel 'upintetendedstay'.

OK, adicionei uma caixa de texto, TextBox1, dentro do UpdatePanel, altere "ClientID" para "ID" e "OnChange" para "TextChanged" e funciona. Mas ainda recebo o mesmo erro se a caixa de texto não estiver dentro do UpdatePanel.

A caixa de texto de acionamento deve estar dentro do painel de atualização? Este é um requisito incapacitante.

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

Ok ... quando eu movo o calendário UserControl para o painel de atualização, recebo este erro:

Um controle com o ID 'txtdate' não pôde ser encontrado para o gatilho no UpdatePanel 'UpIntendendedstay'.

Hmmm. Aparentemente, está tendo um problema em encontrar o controle incorporado, mesmo que esteja dentro do painel de atualização, mas não tem problema em encontrar uma caixa de texto simples que não esteja incorporada em um UserControl !!

Foi útil?

Solução

De acordo com o que entendo, a caixa de texto está incorporada ao controle do usuário dtmdatefirstentry. Você não pode usar diretamente um controle contido por um controle do usuário. O controle do usuário deve expor os eventos de seus controles filhos, se você quiser usá -los como gatilhos.

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

O Datechanged seria um evento exposto pelo dtmdatefirstentry. Você sabe como fazer isso?

Outras dicas

Você pode querer tentar:

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

Ou seja, use o ID em vez do cliente para o ControlId e não use o prefixo "on" para o nome do evento.

Página 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>

Código por trá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

E adicione este evento ao seu controle de usuário:

Public Event Datechanged (Remetente Byval como objeto, ByVal E como System.EventarGs)

..e viola!

Adicione o gatilho antes da Page_load, Ex. Página_init.

finalmente resolvido.As assinaturas estavam esperando a fila e a tabela "notificações" estão usando a fila no servidor de relatórios.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top