سؤال

لدي مكون قمت بإنشائه في C # الذي كان سابقا يستخدم المنشئ الافتراضي، ولكن الآن أود أن يكون لديك نموذج الأم الخاص به إنشاء الكائن (في المصمم)، عن طريق تمرير مرجع إلى حد ذاته.

بمعنى آخر، بدلا من ما يلي في المصمم.

        this.componentInstance = new MyControls.MyComponent();

أرغب في توجيه مصمم النموذج لإنشاء ما يلي:

        this.componentInstance = new MyControls.MyComponent(this);

هل من الممكن تحقيق ذلك (يفضل أن يكون ذلك من خلال بعض السمة / التوضيحية أو أي شيء)؟

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

المحلول

لا يمكنك ببساطة استخدام السيطرة خاصية؟ منحت، لن يتم تعيينها في منشئ سيطرتك، ولكن الطريقة النموذجية للتغلب عليها عن طريق التنفيذ isupportinitialize. والقيام بالعمل في الإندينيت طريقة.

لماذا تحتاج إلى المرجع مرة أخرى إلى عنصر التحكم بسبب

هنا، إذا قمت بإنشاء تطبيق وحدة تحكم جديدة، ولصقه في هذا المحتوى لاستبدال محتويات البرامج .CS، وتشغيله، ستلاحظ ذلك .endinit., ، ال الأبوين يتم تعيين الخاصية بشكل صحيح.

using System;
using System.Windows.Forms;
using System.ComponentModel;
using System.Drawing;

namespace ConsoleApplication9
{
    public class Form1 : Form
    {
        private UserControl1 uc1;

        public Form1()
        {
            uc1 = new UserControl1();
            uc1.BeginInit();
            uc1.Location = new Point(8, 8);

            Controls.Add(uc1);

            uc1.EndInit();
        }
    }

    public class UserControl1 : UserControl, ISupportInitialize
    {
        public UserControl1()
        {
            Console.Out.WriteLine("Parent in constructor: " + Parent);
        }

        public void BeginInit()
        {
            Console.Out.WriteLine("Parent in BeginInit: " + Parent);
        }

        public void EndInit()
        {
            Console.Out.WriteLine("Parent in EndInit: " + Parent);
        }
    }

    class Program
    {
        [STAThread]
        static void Main()
        {
            Application.Run(new Form1());
        }
    }
}

نصائح أخرى

لا أعرف أي طريقة وجود رمز EMIT المصمم في الواقع يدعو منشئ غير افتراضي، ولكن إليك فكرة للدخول حولها. ضع رمز التهيئة الخاص بك داخل المنشئ الافتراضي للنموذج الأصل واستخدام Form.DesignMode لمعرفة ما إذا كنت بحاجة إلى تنفيذه.

public class MyParent : Form
{
    object component;

    MyParent()
    {
        if (this.DesignMode)
        {
            this.component = new MyComponent(this);
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top