当前位置: 首页 > 知识库问答 >
问题:

C#Winforms Designer:如何在设计时复制和粘贴集合?

舒俊雄
2023-03-14

假设我已经创建了以下自定义控件:

public class BookshelfControl : Control
{
    [Editor(typeof(ArrayEditor), typeof(UITypeEditor)),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public Book[] Books { get; set; }

    ...
}
public class Book : Component
{
    public string Author { get; set; }
    public string Genre { get; set; }
    public string Title { get; set; }
}

但是,如果创建BookShelfControl的一个实例,然后在设计器中复制和粘贴,则不会复制Books集合,而是第二个控件引用第一个控件集合中的所有项(例如,BookShelfControl1.book[0]等于BookShelfControl2.book[0])。

因此,我的问题是,在设计时复制和粘贴控件实例时,如何告诉Visual Studio设计器复制我的books集合?

共有1个答案

洪俊捷
2023-03-14

经过许多小时的研究,我相信我已经找到了需要做什么,以便指示设计器在设计时使用复制和粘贴操作复制集合项。

使用BookShelfControl的自定义设计器类,我可以重写ComponentDesigner.Associatedcomponents属性。根据MSDN文档:

ComponentDesigner.AssociatedComponents属性指示在复制、拖动或移动操作期间要与设计器管理的组件一起复制或移动的任何组件。

[Designer(typeof(BookshelfControl.Designer))]
public class BookshelfControl : Control
{
    internal class Designer : ControlDesigner
    {
        private IComponent component;

        public override void Initialize(IComponent component)
        {
            base.Initialize(component);
            this.component = component;
        }

        //
        // Critical step getting the designer to 'cache' related object
        // instances to be copied with this BookshelfControl instance:
        //
        public override System.Collections.ICollection AssociatedComponents
        {
            get
            {
                return ((BookshelfControl)this.component).Books;
            }
        }
    }

    [Editor(typeof(ArrayEditor), typeof(UITypeEditor)),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public Book[] Books { get; set; }

    ...
}

在测试中,我确定在设计时发出复制命令(即Ctrl+C)后立即读取AssociatedComponents属性。

我希望这有助于其他想要节省时间跟踪这个相当晦涩的特性!

 类似资料:
  • 问题内容: 我的.emacs中有(cua-mode t),因此Cc是复制的,而Cv是粘贴的,就像桌面上的其他大多数程序(Ubuntu,Gnome,Linux)一样。但是,Emacs似乎并未与其他程序共享剪贴板/复制缓冲区。 例如,如果我在Firefox中使用Cc,则可以将SCv粘贴到终端中,或者将Cv粘贴到gedit中。但是,如果我在emacs中使用Cv(或Cy),则无法获得从Firefox复制的

  • 下面列出了完整的代码,我正在将数据透视表中DB10单元格的数据复制到Checklist表中的第N列--还要注意Checklist表中的行是动态的,每周增长3018行...这是减慢处理时间的部分(我对其进行了计时,在运行代码时完成处理需要大约8分钟)这部分是减慢处理速度的地方: 完整代码:

  • 问题内容: 当我尝试使用粘贴到单元格时,我要粘贴的单元格保持空白,但setValueAt()似乎可以正常工作。另外,当我尝试从一个单元格剪切或复制JPopupMenu时,如果要粘贴到另一个单元格,则我的“粘贴”选项将保持禁用状态。我不知道为什么。我的代码如下。 Here’s my code for 问题答案: 根据您的示例代码,并且必须填写空白,它对 我有用… Now, maybe you’d l

  • 我面临一个问题,当用户试图复制和粘贴到poco和redmi设备应用程序崩溃。提供堆栈跟踪。 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)在java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java

  • 注意: Adobe Muse 不再添加新增功能,并将于 2020 年 3 月 26 日停止支持。有关详细信息和帮助,请参阅 Adobe Muse 服务结束页面。 对于网站设计人员来说,一致的设计和样式可能是网站最重要的要求之一。为实现这一目标,您可以重复使用样式,或者通过控件栏手动调整格式。手动设置仅适用于小型网站,重复次数受到限制。但是,手动设置格式或使用样式面板复制样式都要耗费时间和精力。此外