我有一个复合下拉日历用户控件,由文本框和日历图像以及验证控件组成。我在用户控件上公开了一个名为“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”的控件。
嗯。显然在查找嵌入式控件时存在问题,即使它位于更新面板内,但查找未嵌入用户控件中的纯文本框却没有问题!