1


0

MyUserControl.List <NestedControl>とMyUserControl.Panel.Controlの間の最適な '接続'

実際に私は他の(それを呼びましょう)NestedUserControlsのコンテナとして機能するUserControlを書きました。

私はそのようなNestedUserControlを自分のUserControlに追加するためのプログラム的な方法を実装しました( `App(string name)`関数を通して)。 しかし、私が実際にもっと好きなのは、私のUserControlのパブリックプロパティとしてのある種のListでしょう。

しかし問題は、私のNestedUserControlを `private UserControl.panel.Controls`リストに入れる必要があることです。 私が書いた `Add()`関数の中では、これは大きな問題ではありません。 しかし、 `List`プロパティを使うとき、どうやってこの問題を解決することができますか? リストが何らかの形で変更された場合、私は情報を取得しません。

私が実際に見つけた唯一のアイデアは、リストが変更されるたびにイベントを投げるある種の `EventList <>`を作成することです。 それで、これは「正しい」方法でしょうか、それともあなたはより良いアプローチを持っていますか(あるいは.NETフレームワークの中にはすでに何らかの種類のEventListが存在するかもしれません)

ああ、私が忘れる前に:私はVS2008、C#、WinForms、.Net 3.5 SP1を使っています。

2 Answer


1


私があなたの質問を正しく理解しているならば、入れ子になったユーザーコントロールを保存するために観察可能なコレクションを使用しなければなりません。 aspxか、できれば IList`だけをあなたのユーザーコントロールのユーザーに公開し、ほとんどの作業を UserControl.panel.Controls`に委譲するようにこのインターフェースを実装します。 IListを実装するための厳密な方法


0


この問題をより明確にするために、ここに私の解決策を示します。

私がやりたかったことは、私のUserControlContainerにListを追加することでした。これは実行時やデザイン時に簡単に変更できます。 設計時に正しく動作させるには、List <>ではなくCollectionBaseから継承し、DesignerSerializationVisibility(DesignerSerializationVisibility.Content)属性を追加する必要がありました。 CollectionBase自体は、Insert、Remove、およびClearのいくつかのイベントを提供します。

これらの関数を実装し、私自身が定義したイベントListChangedEventの起動を外部に追加した後、私はリストの変更に関する情報を得ることができました。

唯一の問題は、CollectionEditorがリストからオブジェクトを削除しないことです。 その代わりに、それは2番目の内部リストで機能するようです。 OKを押すと、あなたのリストはクリアされ、他のイベントでいっぱいになります。 それで、CollectionBase.OnClearまたはCollectionBaseOnClearComplete関数を処理するのを忘れないでください!