سؤال

أرجوك سامح الرمز 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.

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