更新面板错误:控制与ID“XXX”不能在UpdatePanel中找到
-
23-09-2019 - |
题
我具有复合下拉日历的用户控制,它由一个文本框和和日历图像和验证控制的。余暴露称为“文本框”在其返回到控制中使用的文本框的参考用户控件属性。这是文本框,该用户输入的时间到。
在ASPX页,我这个用户控件的一个实例:
<uc1:DropDownCalendar ID="dtmDateFirstEntry" runat="server" Required="True" />
在我的代码的后面,我要检测当用户在文本框中的选项卡式断,并且使用一个UpdatePanel,这取决于指定的日期referesh相应的消息。
在别处在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>
我然后得到错误:
无法找到相关的控制“TextBox1的”用于UpdatePanel的“upIntendedStay”触发器命名为“平变化”的事件。
行,我添加的文本框,textBox1的,在UpdatePanel,变“客户端Id”到“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..When我移动athe日历用户控件进入更新面板,我得到这个错误:
ID为“txtDate” A控制无法找到用于UpdatePanel的“upIntendedStay”触发器。
嗯。它显然具有一个问题发现,即使它的更新面板内的嵌入式控制,但它没有问题发现,未嵌入一个用户控件!!
内的纯文本解决方案
据我了解文本框被嵌入在用户控制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露出的事件。你知道如何做到这一点?
其他提示
您可能也想尝试:
... trigger.ControlID = dtmDateFirstEntry.TextBox.ID trigger.EventName = "TextChanged" ...
即,而不是使用ClientID的用于控件ID的ID和不使用“开”前缀为事件名称
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发件人为对象,BYVALË作为System.EventArgs)
..和中提琴!
添加触发器的Page_Load之前,恩。 Page_Init。
有关您需要取消引用更新面板,以得到一个处理在服务器端控制一个更新面板的HTML控件RUNAT服务器内:
使用System.Web.UI.HtmlControls;
HtmlControl x = (HtmlControl)this.MyUpdatePanel.FindControl("MyHtmlControl");