خطأ في لوحة التحديث: لا يمكن العثور على التحكم في المعرف "xxx"

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

سؤال

لديّ عنصر تحكم مستخدم تقويمي مركب يتكون من مربع نص وصورة تقويمية والتحكم في التحقق من الصحة. أعرض خاصية تسمى "مربع النص" على USERCONTROL التي تُرجع مرجعًا إلى مربع النص المستخدم داخل عنصر التحكم. هذا هو مربع النص الذي يدخل المستخدم التاريخ فيه.

في صفحة 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" />&nbsp;

عندما أقوم بتشغيله ، أحصل على هذا الخطأ:

A control with ID 'ctl00_phPageContent_dtmDateFirstEntry_txtDate' could not be found for the trigger in UpdatePanel 'upIntendedStay'. 

لم أكن أعتقد أن التحكم في الزناد يجب أن يكون ضمن UpdatePanel. اعتقدت أن هذا هو الهدف الكامل لإضافة الزناد.

كيف أقوم بتحديث لوحة التحديث هذه إلى النص في تاريخ USERCONTROL. بعد ذلك ، سيتعين علي إضافة مشغلات أخرى لإحداث تحديث لوحة التحديث من عناصر تحكم أخرى منتشرة عبر الصفحة ، لذلك من الواضح أن جميع مصادر الزناد لا يمكن أن تكون ضمن تحديث Panel.

لتجربة تبسيط الموقف ، أضفت مربع نص اختبار ، 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>

ثم أحصل على الخطأ:

لم تستطع العثور على حدث يسمى "OnChange" على Controld Control "TextBox1" للمشغل في UpdatePanel 'UpIntendedStay'.

حسنًا ، لقد أضفت مربعًا نصًا ، TextBox1 ، ضمن UpdatePanel ، قم بتغيير "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)

حسنًا .. عندما أقوم بنقل ATHE CALENDAR USERCONTROL إلى لوحة التحديث ، أحصل على هذا الخطأ:

لا يمكن العثور على عنصر تحكم مع معرف "txtdate" للمشغل في UpdatePanel 'UpIntendedStay'.

أمم. يبدو أن هناك مشكلة في العثور على عنصر تحكم مضمن على الرغم من أنه داخل لوحة التحديث ، ولكن ليس لديه مشكلة في العثور على مربع نص عادي غير مضمن داخل UserControl !!

هل كانت مفيدة؟

المحلول

وفقًا لما أفهمه ، يتم تضمين مربع النص على التحكم في المستخدم 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 لـ ControlId ولا تستخدم بادئة "ON" لـ EventName.

صفحة 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 Sender ككائن ، Byval e كـ system.eventargs)

.. وفيولا!

أضف المشغل قبل page_load ، على سبيل المثال. page_init.

حلها أخيرا.كانت الاشتراكات قائمة انتظار قائمة انتظار و "الإخطارات" يستخدم في قائمة الانتظار على خادم التقارير.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top