Я ' 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
}