【问题标题】:Update Panel error: Control with the ID "xxx" could not be found in the UpdatePanel更新面板错误:在更新面板中找不到 ID 为“xxx”的控件
【发布时间】:2011-02-02 07:16:40
【问题描述】:

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

在 ASPX 页面中,我有一个此用户控件的实例:

   <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 中。我认为这就是添加触发器的全部意义所在。

如何刷新此更新面板更改为日期用户控件中的文本。接下来,我将不得不添加其他触发器,以从分散在页面中的其他控件触发更新面板的刷新,因此显然所有触发器源都不能在 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>

然后我得到错误:

在 UpdatePanel“upIntendedStay”中的触发器的关联控件“TextBox1”上找不到名为“onchange”的事件。

好的,我在 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“upIntendedStay”中找不到触发器的 ID 为“txtDate”的控件。

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

【问题讨论】:

  • 你能在你的页面上显示完整的标记吗?
  • 尝试使用更新面板智能标签配置外部控件,看看标记是否有任何差异。

标签: asp.net vb.net ajax updatepanel


【解决方案1】:

你不妨试试:

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

也就是说,ControlID 使用 ID 而不是 ClientID,EventName 不使用“On”前缀。

【讨论】:

  • 当我尝试这样做时,我收到错误消息“在 UpdatePanel 'upIntendedStay' 中找不到触发器的 ID 为 'txtDate' 的控件。”请参阅我上面的编辑。
【解决方案2】:

据我了解,文本框嵌入在用户控件 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 公开的事件。你知道怎么做吗?

【讨论】:

  • 桑比奇!有效。为清楚起见,请参阅我的帖子,但我会将您的答案标记为正确答案,因为您引导我这样做。如果您将其粘贴为您自己的答案可能会更好,然后我会将您的答案标记为答案并删除我的。
  • 大声笑,我不会窃取你的代码。很高兴你终于解决了这个问题!
【解决方案3】:

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)

..还有中提琴!

【讨论】:

    【解决方案4】:

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

    使用 System.Web.UI.HtmlControls;

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多