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

时间:2010-03-30 02:17:02

标签: asp.net vb.net ajax updatepanel

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

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

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

在我的代码中,我希望检测用户何时从文本框中删除标签,并使用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>

以下是我在后面的代码中所做的事情:

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

当页面运行并且我查看源代码时,我看到类似这样的内容:

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

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

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

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

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

为了简化这种情况,我在测试文本框中添加了一个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>

然后我得到错误:

无法在关联控件'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)

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

在UpdatePanel'uopIntendedStay'中找不到触发器ID为“txtDate”的控件。

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

5 个答案:

答案 0 :(得分: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>

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

答案 1 :(得分:2)

您可能想尝试:

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

即,使用ID而不是ControlID的ClientID,并且不要为EventName使用“On”前缀。

答案 2 :(得分:2)

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>

代码背后:

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

并将此事件添加到您的用户控件:

公共事件DateChanged(ByVal sender As Object,ByVal e As System.EventArgs)

..和中提琴!

答案 3 :(得分:1)

在Page_Load之前添加触发器,例如Page_Init。

答案 4 :(得分:0)

对于更新面板内的html控件runat服务器,您需要取消引用更新面板以获取服务器端控件的句柄:

使用System.Web.UI.HtmlControls;

HtmlControl x = (HtmlControl)this.MyUpdatePanel.FindControl("MyHtmlControl");