我有一个复合下拉日历用户控件,其中包括一个文本框和日历图像以及一个验证控件。我在用户控件上公开了一个名为“ 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" />
运行它时,出现以下错误:
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”上的UpdatePanel“ upIntendedStay”中找不到触发器的名为“ 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)
OK ..当我将日历用户控件移到“更新”面板中时,出现以下错误:
在UpdatePanel’upIntendedStay’中找不到ID为’txtDate’的控件作为触发器。
嗯 即使在更新面板中,也很难找到嵌入式控件,但是找到未嵌入用户控件的纯文本框也没有问题!
据我了解,该文本框嵌入在用户控件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公开的事件。你知道怎么做吗?