【发布时间】: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" />
当我运行它时,我得到了这个错误:
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