2011-06-20 54 views
1

我有一個UserControl它有一個集合屬性。我的部分要求是,控件的GUI根據集合的內容在DesignMode中修改自己。例如,想想ListBox。如何確定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修改設計時查不到。我在控件創建時收到「嗶嗶聲」,如果我從代碼中添加到集合中。

我知道這個可以做,因爲ListBox做到了。任何人有任何想法如何?提前致謝。

回答

2

這就是關鍵字的問題,它不能神奇地使方法變爲虛擬。 StringCollectionEditor將調用IList.Add()添加一個項目。這將調用列表<> .Add(),而不是您的版本。你必須放棄列表<>並實現從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

謝謝 - 從臉上抹大量的雞蛋:-) – John66NY

相關問題