[Важно понимать, что приведенная ниже методика ISite работает только во время разработки. Поскольку ContainerControl является общедоступным и ему присваивается значение, VisualStudio напишет код инициализации, который устанавливает его во время выполнения. Сайт настроен во время выполнения, но вы не можете получить от него ContainerControl]
Вот статья , в которой описывается, как это сделать для невизуального компонента.
По сути, вам нужно добавить свойство ContainerControl к вашему компоненту:
public ContainerControl ContainerControl
{
get { return _containerControl; }
set { _containerControl = value; }
}
private ContainerControl _containerControl = null;
и переопределить свойство сайта:
public override ISite Site
{
get { return base.Site; }
set
{
base.Site = value;
if (value == null)
{
return;
}
IDesignerHost host = value.GetService(
typeof(IDesignerHost)) as IDesignerHost;
if (host != null)
{
IComponent componentHost = host.RootComponent;
if (componentHost is ContainerControl)
{
ContainerControl = componentHost as ContainerControl;
}
}
}
}
Если вы сделаете это, ContainerControl будет инициализирован для ссылки на содержащую форму разработчиком. Связанная статья объясняет это более подробно.
Хороший способ понять, как это сделать, - взглянуть на реализацию типов в .NET Framework, поведение которых схоже с желаемым с помощью такого инструмента, как Lutz Reflector. В этом случае System.Windows.Forms.ErrorProvider является хорошим примером для рассмотрения: Компонент, которому необходимо знать содержащую его форму.