更新面板错误:在UpdatePanel中找不到ID为"xxx"的控件

Cha*_*adD 5 vb.net asp.net ajax updatepanel

我有一个复合下拉日历用户控件,它包含一个文本框和日历图像以及一个验证控件.我在usercontrol上公开了一个名为"TextBox"的属性,该属性返回对控件中使用的文本框的引用.这是用户输入日期的文本框.

在ASPX页面中,我有一个这个usercontrol的实例:

   <uc1:DropDownCalendar ID="dtmDateFirstEntry" runat="server"  Required="True" />
Run Code Online (Sandbox Code Playgroud)

在我的代码背后,我想检测用户何时从文本框中删除选项卡,并使用UpdatePanel根据指定的日期引用相应的消息.

在ASPX页面的其他地方我有这个:

   <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>
Run Code Online (Sandbox Code Playgroud)

这是我在后面的代码中做的事情:

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
Run Code Online (Sandbox Code Playgroud)

当页面运行并且我查看源代码时,我看到如下内容:

<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;
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我收到此错误:

A control with ID 'ctl00_phPageContent_dtmDateFirstEntry_txtDate' could not be found for the trigger in UpdatePanel 'upIntendedStay'. 
Run Code Online (Sandbox Code Playgroud)

我不认为触发器控件必须在UpdatePanel中.我认为这是添加触发器的重点.

如何刷新此更新面板更改日期usercontrol中的文本.接下来,我将不得不添加其他触发器来触发从页面中分散的其他控件刷新更新面板,因此显然所有触发源都不在UpdatePanel中.

为了简化这种情况,我在更新面板中添加了一个测试Textbox,textbox1:

 <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>
Run Code Online (Sandbox Code Playgroud)

然后我得到错误:

无法在关联控件'TextBox1'上找到名为'onchange'的事件,以便在UpdatePanel'upIntendedStay'中触发.

好的,我在UpdatePanel中添加了一个文本框TEXTBOX1,将"ClientId"更改为"ID",将"OnChange"更改为"TextChanged"并且它可以正常工作.但是如果文本框不在UpdatePanel中,我仍会得到相同的错误.

触发文本框必须在更新面板中吗?这是一个严峻的要求.

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

好的..当我将日历用户控件移动到更新面板时,我收到此错误:

在UpdatePanel'uedIntendedStay'中找不到触发器ID为"txtDate"的控件.

嗯.它显然在查找嵌入式控件时遇到问题,即使它位于更新面板中,但是找到一个未嵌入到用户控件中的纯文本框也没有问题!

Cla*_*edi 4

据我了解,文本框嵌入在用户控件 dtmDateFirstEntry 中。您不能直接使用用户控件包含的控件。如果您想将其子控件用作触发器,则用户控件必须公开其子控件的事件。

<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>
Run Code Online (Sandbox Code Playgroud)

DateChanged 将是 dtmDateFirstEntry 公开的事件。你知道该怎么做吗?