Создает ли элемент управления Winforms событие, когда он добавляется в форму

Я ' m работает с некоторыми настраиваемыми Control классами и нуждается в некоторой инициализации для них, которая зависит от их добавления в форму. Срабатывает ли событие, когда это происходит?

Я думаю, что этого примера должно быть достаточно, чтобы показать, что я пытаюсь сделать:

public interface IMyForm
{
    ISomeObject SomeObject {get; set; }
}

class MyForm : IMyForm
{
    //eg InitializeComponent() as well as several others called at later points
    private MethodThatAddsAControl()  
    {
        MyControl newControl = new MyControl();
        //other initialization as needed

        //does this raise an event in MyControl I can use to call
        //InitializationAfterBeingAddedToForm()?
        this.Controls.Add(newControl);   
    }
}


class MyControl : Control
{
    InitializationAfterBeingAddedToForm()
    {
        //can't be done in the constructor because at that point FindForm() will return null
        (FindForm() as IMyForm).SomeObject.AnEvent += new EventHandler(SomeObject_AnEvent);
    }
}

Это оказывается сложнее, чем я первоначально думал, и я думаю, что я Мне придется объединить предложения Болу и Майка Дура. Проблема в том, что некоторые MyControl добавляются непосредственно в форму, и в этом случае решение Болу работает идеально. Другие добавляются на панели, а не непосредственно в форму. Я думаю, что собрал решение, включающее решение Болу для первого случая, с несколькими модификациями для обработки случая, когда событие вызывается добавляемой панелью, не MyControl внутри него, а Майкес для обработки случая добавления MyControl в панель после завершения работы конструктора. Я должен буду протестировать это еще раз завтра утром, прежде чем я буду уверен, что это сработало.

Сообщение об ошибке, запрошенное Болу, когда я пытаюсь использовать его предложение в конструкторе:

Failed to create component 'MyControl'.  The error message follows:
 'System.MissingMethodException: Constructor on type 'MyNamespace.MyControl' not found.
   at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
   at System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
   at System.ComponentModel.Design.DesignSurface.CreateInstance(Type type)
   at Microsoft.VisualStudio.Design.VSDesignSurface.CreateInstance(Type type)
   at System.ComponentModel.Design.DesignerHost.System.ComponentModel.Design.IDesignerHost.CreateComponent(Type componentType, String name)
   at System.ComponentModel.Design.DesignerHost.System.ComponentModel.Design.IDesignerHost.CreateComponent(Type componentType)
   at System.Drawing.Design.ToolboxItem.CreateComponentsCore(IDesignerHost host)
   at System.Drawing.Design.ToolboxItem.CreateComponentsCore(IDesignerHost host, IDictionary defaultValues)
...'

И конструкторы на месте, когда я получил ошибку.

public MyControl(Form parent)
{
    _parent = parent as IMyForm;
    parent.ControlAdded += new ControlEventHandler(parent_ControlAdded);
    Initialize();  //does rest of initialization
}

public TimelineControl(Form parent, Panel container)
{
    _parent = parent as IMyForm;
    container.ControlAdded += new ControlEventHandler(parent_ControlAdded);
    Initialize();  //does rest of initialization
}
8
задан Dan Neely 12 January 2018 в 00:46
поделиться