在设计器中手动删除子控件时更新父控件

时间:2013-08-16 15:51:12

标签: c# compact-framework design-time

我正在使用C#中的Compact Framework 3.5为Windows Mobile 6设备编写自定义控件。我正在编写的控件代表一个按钮列表,我们称之为 ButtonList ,按钮 ButtonListItem

ButtonListItem列表可以通过集合编辑器在设计器中编辑:

Visual Studio Designer Items Collection

我进行了设置,以便在集合编辑器中添加或删除ButtonListItem时更新并重新绘制ButtonList。

以下是问题:

当我通过鼠标选择ButtonListItem并按设计器中的删除按钮手动删除ButtonListItem时,ButtonList的内部状态不会更新。

我的目标是让设计器中的手动删除行为类似于集合编辑器中的删除。

一个示例是TabControl类,其中集合编辑器和手动删除中的标签页的删除行为完全相同。

你将如何实现这一目标?


编辑1:用于向ButtonList添加和删除ButtonListItem的简化代码

class ButtonList : ContainerControl
{        
    public ButtonListItemCollection Items { get; private set; } // Implements IList and has events for adding and removing items

    public ButtonList()
    {
        this.Items.ItemAdded += new EventHandler<ButtonListItemEventArgs>(
            delegate(object sender, ButtonListItemEventArgs e)
            {
                // Set position of e.Item, do more stuff with e.Item ...

                this.Controls.Add(e.Item);   
            });

        this.Items.ItemRemoved += new EventHandler<ButtonListItemEventArgs>(
            delegate(object sender, ButtonListItemEventArgs e)
            {
                this.Controls.Remove(e.Item); 
            });
    }
}

1 个答案:

答案 0 :(得分:0)

为了把它包起来,我找到了解决问题的方法。像TabControl一样,我的ButtonList包含两个集合:

  1. ControlCollection继承自Control类
  2. ButtonListItemCollection(TabControl具有TabPageCollection)
  3. 添加ButtonListItems是通过属性中的集合编辑器完成的。删除可以在集合编辑器中完成,也可以通过在设计器中选择ButtonListItem并按键盘上的 DEL 按钮(手动删除)来完成。

    使用集合编辑器时,ButtonListItems被添加到/从ButtonListItemCollection中移除,然后移入/移出ControlCollection。

    但是,当手动删除ButtonListItem时,它仅从ControlCollection 中删除,而不是从ButtonListItemCollection 中删除。所以需要做的是检测ButtonListItemCollection何时保存不在ControlCollection中的ButtonListItem。

    不幸的是,在Compact Framework中,Control类中没有ControlRemoved事件。所以一个解决方案看起来像这样:

    class ButtonList : ContainerControl
    {
        // ...
    
        public ButtonListItemCollection Items { get; private set; }
    
        protected override void OnPaint(PaintEventArgs pe)
        {
            if (this.Site.DesignMode)
            {
                this.Items.RemoveAll(x => !this.Controls.Contains(x));
            }
        }
    
        // ...
    }
    

    希望能帮助任何使用紧凑框架的人。