【问题标题】:How to make a UserControl with a Collection that can be edited at design time?如何使用可以在设计时编辑的集合制作用户控件?
【发布时间】:2010-11-22 22:01:35
【问题描述】:

我正在创建一个名为PanelsList 的类,它基本上是一个顶部没有标题的TabControl,因此只能以编程方式更改页面。每个“选项卡”都将是一个名为PanelsListItem 的类的实例,该类派生自Panel。我还创建了一个实现ICollectionICollection<PanelsListItem> 的类PanelsListItemCollection。所以我在我的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 上的“...”按钮时,Object Collection Editor 打开,但 Add em> 和 Remove 按钮被禁用。

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

编辑:我刚刚也尝试实现IList<PanelsListItem>,但没有解决。

【问题讨论】:

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


    【解决方案1】:

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

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

    [Editor(typeof(MyCustomCollectionEditor), typeof(UITypeEditor))] 
    public PanelsListItemCollection Items { /* ... */ }
    

    您还可以扩展现有的 CollectionEditor 类,但该类仅向派生类公开非常有限的功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-25
      • 2012-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-18
      相关资源
      最近更新 更多