[Es ist wichtig zu verstehen, dass die unten beschriebene ISite-Technik nur zur Entwurfszeit funktioniert. Da ContainerControl öffentlich ist und einen Wert zugewiesen bekommt, wird VisualStudio Initialisierungscode schreiben, der ihn zur Laufzeit festlegt. Site wird zur Laufzeit gesetzt, aber man kann ContainerControl nicht von ihr abrufen]
Hier ist ein Artikel in dem beschrieben wird, wie man dies für eine nicht-visuelle Komponente tut.
Grundsätzlich müssen Sie eine Eigenschaft ContainerControl zu Ihrer Komponente hinzufügen:
public ContainerControl ContainerControl
{
get { return _containerControl; }
set { _containerControl = value; }
}
private ContainerControl _containerControl = null;
und die Eigenschaft Site außer Kraft setzen:
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;
}
}
}
}
Wenn Sie dies tun, wird das ContainerControl initialisiert, um das enthaltende Formular durch den Designer zu referenzieren. Der verlinkte Artikel erklärt dies im Detail.
Ein guter Weg, um zu sehen, wie man Dinge tut, ist, sich die Implementierung von Typen im .NET Framework anzusehen, die ein ähnliches Verhalten haben, wie das, was Sie mit einem Werkzeug wie Lutz Reflector wollen. In diesem Fall ist System.Windows.Forms.ErrorProvider ein gutes Beispiel: eine Komponente, die ihr enthaltendes Formular kennen muss.