دورة حياة الأحداث ASP.NET لعناصر تحكم المستخدم الموروثة
-
22-09-2019 - |
سؤال
أرجوك سامح الرمز psuedo ، لكنه سؤال بسيط:
أقوم بإنشاء عنصر تحكم مستخدم (MyControlbase: UserControl) مع مربع نص (id = "txtbox") في ترميزه. في CodeBehind أنا أكتب طريقة sayhello (سلسلة s) {txtbox.text = s ؛ }.
أقوم بإنشاء عنصر تحكم مستخدم آخر يمتد MyControlbase (MyControl: MyControlbase). في page_load من عنصر تحكم الطفل هذا ، أسمي Sayhello ("Hello") ؛ وتلقي خطأ في وقت التشغيل يخبرني أن Txtbox فارغ (لم يتم إنشاؤه بعد ذلك بوضوح).
كيف إذن ، هل يمكنني أن أرث من عنصر تحكم المستخدم وجعل طفلي يتحكم في الوصول إلى علامة التحكم في القاعدة؟ لقد حاولت قراءة دورة حياة الحدث لهذه الضوابط ، لكنني أعتقد أنني لا أحصل عليها.
أيه أفكار؟
-تعديل-
أنا آسف ، إنه ASP.NET. إذا كان هذا الرمز يجعله أكثر وضوحًا ، فيجب أن أقوم بعمل ضعيف جدًا في وصف المشكلة.
Txtbox هو ASP: التحكم في مربع النص الموجود في علامة MyControlbase.
public partial class myControlBase : System.Web.UI.UserControl
{
protected void SayHello(string s){
txtBox.Text = s;
}
}
public partial class myControl: myControlBase
{
protected void Page_Load(object sender, EventArgs e)
{
SayHello("hello");
}
}
هذا من شأنه أن يفشل في Sayhello ("Hello") ؛ لأن txtbox عاد فارغة.
المحلول
أنا أفهم المشكلة الآن ، لكن ليس لدي حل لطيف.
عندما تقوم بتمديد عنصر تحكم مستخدم مثل هذا ، تفقد الوصول تمامًا إلى علامة التحكم في القاعدة. يتم استدعاء Page_Load للطفل من قبل (ربما بدلاً من؟) Page_Load الخاص بـ Control Control.
نصائح أخرى
بالإضافة إلى طرق مثل Page_Load
, ، هناك هي On*
الطرق ، مثل OnInit
و OnLoad
. هذه طرق افتراضية ، لذلك يمكن تجاوزها عن طريق تحكم المستخدم المشتق.
public override void OnLoad(EventArgs e)
{
base.OnLoad(e);
SayHello("hello");
}
يبدو أن CreateChildControls لم يتم استدعاؤه بعد.
حاول إضافة insurechildControls () في page_load ، أو اتصل بـ Sayhello من حدث OnPrerender.