خطأ في لوحة التحديث: لا يمكن العثور على التحكم في المعرف "xxx"
-
23-09-2019 - |
سؤال
لديّ عنصر تحكم مستخدم تقويمي مركب يتكون من مربع نص وصورة تقويمية والتحكم في التحقق من الصحة. أعرض خاصية تسمى "مربع النص" على 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" />
عندما أقوم بتشغيله ، أحصل على هذا الخطأ:
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.
حلها أخيرا.كانت الاشتراكات قائمة انتظار قائمة انتظار و "الإخطارات" يستخدم في قائمة الانتظار على خادم التقارير.