更新パネルのエラー:ID「xxx」のコントロールがUpdatePanelで見つかりませんでした

StackOverflow https://stackoverflow.com/questions/2542469

質問

テキストボックス、カレンダー画像、検証コントロールで構成される複合ドロップダウンカレンダーユーザーコントロールがあります。ユーザーコントロール上で、コントロール内で使用されるテキストボックスへの参照を返す「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" />&nbsp;

実行すると、次のエラーが発生します。

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");
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top