コンパクト フレームワークでは、フォームのコンポーネントはメンバー コンテナー変数内に含まれています。フォームがインスタンスを作成したという事実以外に、そのコンテナとフォーム自体の間に直接的な関係はありません。そのインスタンスは、他のフォームまたはフォーム以外のクラスに簡単に渡すことができ、元の親は Disposed です。
これが意味することは、コンポーネントの「フォームを含む」を決定する方法がないということです。その情報は単純にどこにも保存されません (GC はルートを認識しますが、それは少し異なり、とにかくクエリできません)。
IContainerへのインスタンスを保持するフォームではなく、IContainerへの参照のみが必要な場合は、クエリを実行できますcomponent.Site.Container
が、それでも潜在的な穴がたくさんあります。
たとえば、SerialPort コンポーネントをフォームにドロップすると、デザイナによってコンポーネント コレクションに追加され、serialPort.Site.Container
設定されます。ただし、Timer コンポーネントを Form にドロップすると、Timer はComponents コレクションに追加されずtimer.Site
、実際null
には追加されるため、Container にクエリを実行しようとしても NullReferenceException がスローされます。
より楽しくするために、SerialPort のようなコンポーネントには、IContainer なしで作成できるコンストラクターもあります。したがって、デザイナーで SerialPort をフォームにドロップすると、フォームのコンポーネントに追加されますが、開発者が SerialPort を手動で作成する場合、それはかなりまれです。 Components コレクションに追加されることを確認します。
基本的に、意図したアーキテクチャを再考する必要があると思います。親コンテナに依存しないメカニズムを考え出す必要があります。