Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何确定UserControl集合属性在设计时已更改?_C#_Winforms_User Controls_.net 2.0 - Fatal编程技术网

C# 如何确定UserControl集合属性在设计时已更改?

C# 如何确定UserControl集合属性在设计时已更改?,c#,winforms,user-controls,.net-2.0,C#,Winforms,User Controls,.net 2.0,我有一个UserControl,它有一个collection属性。我的部分要求是控件的GUI根据集合的内容在设计模式下修改自身。例如,想想ListBox 我的代码如下所示(Add的重写只是一个实验): 公共部分类MyControl:UserControl { 公共类集合:列表 { 公共新空添加(字符串项) { Console.Beep(); 基础。添加(项目); } } [类别(“数据”)] [说明(“控件中要显示的项目”)] [编辑器(“System.Windows.Forms.

我有一个UserControl,它有一个collection属性。我的部分要求是控件的GUI根据集合的内容在设计模式下修改自身。例如,想想ListBox

我的代码如下所示(Add的重写只是一个实验):

公共部分类MyControl:UserControl
{
公共类集合:列表
{
公共新空添加(字符串项)
{
Console.Beep();
基础。添加(项目);
}
}       
[类别(“数据”)]
[说明(“控件中要显示的项目”)]
[编辑器(“System.Windows.Forms.Design.StringCollectionEditor,System.Design”,类型(System.Drawing.Design.UITypeEditor))]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
公众收集物品
{
得到
{
返回斜纹螨;
}
}
一切正常,除了在设计时发现集合已通过StringCollectionEditor修改外。我在控件创建时收到“嘟嘟”声,如果我从代码添加到集合中


我知道这是可以做到的,因为ListBox可以做到。有人知道怎么做吗?提前谢谢。

这就是新关键字的问题,它无法神奇地使方法虚拟。StringCollectionEditor将调用IList.Add()来添加项。这将调用List.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...
    }
class-StringCollection:System.Collections.IList{
私有列表impl=新列表();
公共整数加法(对象值){
Console.Beep();
内含增值;
返回计数;
}
公共空间清除(){
impl.Clear();
}
//等等。。。
}

请注意ListBox也是如何做到这一点的,它使用ObjectCollection。也许您也可以使用它。请记住,Winforms是在泛型可用之前创建的。

谢谢-从脸上擦去大量鸡蛋:-)
    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...
    }