更新パネルのエラー:ID「xxx」のコントロールがUpdatePanelで見つかりませんでした
-
23-09-2019 - |
質問
テキストボックス、カレンダー画像、検証コントロールで構成される複合ドロップダウンカレンダーユーザーコントロールがあります。ユーザーコントロール上で、コントロール内で使用されるテキストボックスへの参照を返す「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' という名前のイベントが見つかりませんでした。
OK、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によって公開されたイベントになります。あなたがこれを行う方法を知っていますか?
他のヒント
あなたは試してみたいことがあります:
... trigger.ControlID = dtmDateFirstEntry.TextBox.ID trigger.EventName = "TextChanged" ...
その、ControlIDのために代わりにClientIDのIDを使用しているとEVENTNAMEの接頭辞「ON」に使用しないでください。
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
そして、あなたのユーザーコントロールにこのイベントを追加します:
PublicイベントDateChanged(オブジェクトとしてByVal送信者、System.EventArgsとしてByVal e)の
..とビオラ!
をPage_Load、元の前にトリガーを追加します。 Page_Init。
あなたは、サーバー側のコントロールのハンドルを取得するには、更新パネルを逆参照する必要があり、更新パネルのHTMLコントロールにrunatサーバー内部の場合:
System.Web.UI.HtmlControlsを使用して、
HtmlControl x = (HtmlControl)this.MyUpdatePanel.FindControl("MyHtmlControl");