我有一个UserControl,它有一个collection属性。我的部分要求是控件的GUI根据集合的内容在DesignMode中修改自身。例如,Think ListBox。
我的代码看起来像这样(Add的覆盖只是一个实验):
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修改了Collection之外,一切正常。我在控件创建上得到“Beeps”,如果我从代码添加到集合中。
我知道可以完成,因为ListBox可以做到。有人有什么想法吗?提前谢谢。
答案 0 :(得分:2)
这是 new 关键字的问题,它无法神奇地使方法成为虚拟。 StringCollectionEditor将调用IList.Add()来添加项。这将调用List&lt;&gt; .Add(),而不是您的版本。你必须放弃List&lt;&gt;并实现自己的继承自IList的集合类。这是一项无聊的工作,你使用List&lt;&gt;实现它。像这样:
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是在泛型可用之前创建的。