2011-06-20 18 views
1

私は、コレクションプロパティを持つUserControlを持っています。私の要件の一部は、コントロールのGUIがコレクションの内容に基づいてDesignModeで変更されることです。リストボックスを考える、例えば。UserControlコレクションプロパティがデザイン時に変更されたことを確認する方法?

私のコードは、(追加のオーバーライドが単なる実験です)次のようになります。

public partial class MyControl: UserControl 
{ 
    public class StringCollection : List<string> 
    { 
     public new void Add(string item) 
     { 
      Console.Beep(); 
      base.Add(item); 
     } 
    }  

    [Category("Data")] 
    [Description("The items to be displayed in the Control.")] 
    [Editor("System.Windows.Forms.Design.StringCollectionEditor, System.Design", typeof(System.Drawing.Design.UITypeEditor))] 
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
    public StringCollection Items 
    { 
     get 
     { 
      return mItems; 
     } 
    } 

すべてがコレクションStringCollectionEditor経由で変更された設計時に見つけ出すを除き、[OK]を動作します。コントロールの作成時に「ビープ音」が鳴り、コードからコレクションに追加した場合。

ListBoxがそうしているので、とすることができます。誰もどのようなアイデアを持っている?前もって感謝します。

答えて

2

これは新しいキーワードの問題です。魔法のようにメソッドを仮想にすることはできません。 StringCollectionEditorは項目を追加するためにIList.Add()を呼び出します。それはあなたのバージョンではなく、リスト<> .Add()を呼び出します。 List <>をあきらめてIListから継承した独自のコレクションクラスを実装する必要があります。これはほとんど退屈な作業ですが、リスト<を使用して実装します。このように:

class StringCollection : System.Collections.IList { 
     private List<object> impl = new List<object>(); 
     public int Add(object value) { 
      Console.Beep(); 
      impl.Add(value); 
      return Count; 
     } 

     public void Clear() { 
      impl.Clear(); 
     } 

     // etc... 
    } 

ListBoxもこのようにして、ObjectCollectionを使用しています。たぶんあなたもそれを使うことができます。 WinFormsはジェネリックが利用可能になる前に作成されたことに注意してください。

+0

THANKS - 顔から大量の卵を拭く:-) – John66NY

関連する問題