[以下の ISite 手法は設計時にのみ機能することを理解することが重要です。ContainerControl は公開されており、値が割り当てられるため、VisualStudio は実行時に値を設定する初期化コードを記述します。サイトは実行時に設定されますが、そこから ContainerControl を取得できません]
非ビジュアル コンポーネントに対してそれを行う方法を説明する記事を次に示します。
基本的に、プロパティ ContainerControl をコンポーネントに追加する必要があります。
public ContainerControl ContainerControl
{
get { return _containerControl; }
set { _containerControl = value; }
}
private ContainerControl _containerControl = null;
Site プロパティをオーバーライドします。
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 はデザイナーによって含まれているフォームを参照するように初期化されます。リンクされた記事では、より詳細に説明しています。
実行方法を確認する良い方法は、Lutz Reflector などのツールで必要な動作と同様の動作をする .NET Framework の型の実装を調べることです。この場合、System.Windows.Forms.ErrorProvider は注目すべき良い例です。フォームを含むことを知る必要があるコンポーネントです。