2

ComboBox から継承するオーナー描画ユーザー コントロールを作成しました。

コントロールは特殊な項目を格納しますが、Items コレクションは引き続き Object 型の項目を受け入れて返します。このコレクションをオーバーライドしてタイプセーフにする最善の方法に関するヒントはありますか?

私が考えることができる唯一の方法は、独自のコレクション クラスを作成することです。クラスは真のコレクションではありません。コンストラクターへの引数として ObjectCollection を取り、そのメソッドを拡張するだけです。

ユーザー コントロールは、元の Items コレクションを新しいクラスのコンストラクターに渡します。次に、Items プロパティをオーバーライドして、代わりに新しいクラスのインスタンスを返します。

これはやや複雑なようです。より良い方法はありますか?

4

1 に答える 1

1

いくつかの異なる方法でそれを行うことができます。まず、ComboBox から継承する「ユーザー コントロール」を作成することについて、少し混乱しています。ComboBox から継承するカスタムコントロールを作成できますが、UserControl (「ユーザー コントロール」の通常の定義) と ComboBox の両方から継承することはできません。

真の UserControl 派生物を定義すると、これは少し簡単になります。私が言ったように、UserControl は ComboBox にすることはできません、ComboBox を持つことはできます。そのため、ComboBox をドロップして UserControl サーフェスにドッキングし、使用できるようにする必要があるプロパティ (Items など) を再実装できます。これにより、アイテムを選択したコレクション (おそらく厳密に型指定されたリスト) として再作成できます。唯一の問題は、何を再実装したいかを正確に知ることです。UserControl 内に含まれる ComboBox を変更する「パススルー」プロパティを実装しない限り、デザイナーまたはコードでアクセスできない ComboBox の便利なプロパティが多数あります。

ComboBox から直接継承すると、いくつかの点で少しトリッキーになりますが、他の点ではより簡単になります。独自に定義し、newキーワード。これを行うと、可視性、タイプ、およびその他の修飾子を変更できます。これにより、コントロールを CustomComboBox (または任意の名前) として処理するコードが、基本クラスのオブジェクト配列を使用できなくなります。厳密に型指定された Items 配列を使用する必要があります。新しいプロパティは引き続き古いプロパティにアクセスできます (機能させるために必要になります)。ComboBox の他のすべてのパブリック プロパティも無料で取得できます。変更したいものを再実装するだけです。ただし、カスタム ComboBox を基本クラスとして参照すると、ランタイムはそのクラスに有効なバージョンのアイテムを使用します。つまり、厳密に型指定されたものではなく、オブジェクト配列です。

于 2011-02-11T01:02:59.097 に答える