如何使用可在设计时编辑的Collection创建UserControl?

时间:2010-11-22 22:01:35

标签: c# .net visual-studio winforms user-controls

我正在创建一个名为PanelsList的类,它基本上是TabControl,顶部没有标题,因此页面只能以编程方式更改。每个“标签”都是PanelsListItem派生的名为Panel的类的实例。我还创建了一个实现PanelsListItemCollectionICollection的课程ICollection<PanelsListItem>。所以我在PanelsList添加了以下内容:

    private PanelsListItemCollection _Items;

    public PanelsListItemCollection Items
    {
        get { return _Items; }
        set { SetItems(value); }
    }

    private void SetItems(PanelsListItemCollection value)
    {
        if (_Items != value)
        {
            if (_Items != null) _Items.PanelsList= null;
            _Items = value;
            if (_Items != null) _Items.PanelsList= this;
        }
    }

我认为在为表单构建并添加PanelsList后,我可以在设计时编辑PanelsListItemCollection。但是当我点击 Proeprties 编辑器中属性Items上的“...”按钮时,对象集合编辑器会打开,但添加删除按钮被禁用。

当我向List<Control> Stuff { get; set; }添加了一个属性PanelsList时,我可以在设计时添加和删除Stuff中的控件。我想知道是否需要实施IList而不是ICollection

修改:我刚刚尝试实施IList<PanelsListItem>,但它没有修复它。

1 个答案:

答案 0 :(得分:1)

为了让设计人员自动支持集合,它必须实现非通用IList接口 - IList<T>将不会自动运行。这是因为默认的集合编辑器依赖于知道每个项目的索引。与设计器兼容的另一个要求(您的代码已经满足)是暴露您的集合的属性必须同时具有getset方法;设计人员在编辑期间制作集合的临时副本,然后在用户单击“确定”时将其分配给属性。

如果默认值不够好,您可以通过扩展UITypeEditor类(在System.Drawing.Design名称空间中)并使用{{1}在代码中修饰属性来实现自己的集合编辑器。 },例如

EditorAttribute

您还可以扩展现有的[Editor(typeof(MyCustomCollectionEditor), typeof(UITypeEditor))] public PanelsListItemCollection Items { /* ... */ } 类,但该类仅向派生类公开非常有限的功能。