1

基本的には、コンポーネントの親フォームを取得するのと同じことをする必要があり ます。

ただし、コンパクトなフレームワークでは、の定義はありません

IDesignerHost

これを行う方法はありますか?

編集:一部のコントロールSystem.ComponentModel.Componentにドロップしたいのは派生コンポーネントです。System.Windows.Forms.Containerこれを参照する必要がある理由は、コンポーネントをドロップする各フォームでコンポーネントの親コンテナを手動で設定したくないからです。

4

1 に答える 1

0

コンパクト フレームワークでは、フォームのコンポーネントはメンバー コンテナー変数内に含まれています。フォームがインスタンスを作成したという事実以外に、そのコンテナとフォーム自体の間に直接的な関係はありません。そのインスタンスは、他のフォームまたはフォーム以外のクラスに簡単に渡すことができ、元の親は 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 コレクションに追加されることを確認します。

基本的に、意図したアーキテクチャを再考する必要があると思います。親コンテナに依存しないメカニズムを考え出す必要があります。

于 2013-01-31T14:59:57.933 に答える