MyUserControl.List <nestedcontrol>和MyUserControl.Panel.Controls </nestedcontrol>之间的最佳“连接”

时间:2009-07-15 11:33:50

标签: c# .net winforms .net-3.5 user-controls

实际上我写了一个UserControl,它充当其他(让我们称之为)NestedUserControls的容器。

我以编程方式实现了将这样的NestedUserControls添加到我的UserControl中(通过App(string name)函数)。但实际上我更喜欢将某种List作为UserControl的公共属性。

但问题是,我的NestedUserControl需要放入private UserControl.panel.Controls列表。在我自己编写的Add()函数中,这不是什么大问题。但是,当我使用List<NestedUserControl>属性时,如何才能解决这个问题?当列表以任何方式改变时,我都没有得到任何信息。

我实际发现的唯一想法是创建某种EventList<>,只要列表发生变化就会抛出一个事件。那么这将是“正确的”方式还是你有更好的方法(或者在.Net框架中已经存在某种EventList?

哦,在我忘记之前:我正在使用VS2008,C#,WinForms,.Net 3.5 SP1

2 个答案:

答案 0 :(得分:1)

如果我正确理解你的问题,你要么必须使用一个可观察的集合来存储嵌套的用户控件,不幸的是我所知道的唯一一个是在WPF程序集中: http://msdn.microsoft.com/en-us/library/ms668604.aspx 或者,最好只向用户控件的用户公开IList<NestedUserControl>,并以将大部分工作委派给UserControl.panel.Controls的方式实现此接口。如何实现IList:http://damieng.com/blog/2006/06/14/Observing_change_events_on_a_ListT

答案 1 :(得分:0)

所以为了在这个问题中更清楚,我的解决方案是:

我喜欢做的是,在我的UserControlContainer中添加一个List,可以在运行时或设计时轻松更改 。为了正确地处理设计时间,我不得不继承CollectionBase而不是List&lt;&gt;并添加了DesignerSerializationVisibility(DesignerSerializationVisibility.Content)attribut。 CollectionBase本身为Insert,Remove和Clear提供了一些事件。

在实现这些函数并将我自己定义的事件ListChangedEvent的激活添加到外部世界之后,我能够获得有关任何列表更改的信息。

您唯一的问题是,CollectionEditor不会从列表中删除任何对象。相反,它似乎与第二个内部列表一起使用。点击确定后,您的列表将被清除并填写其他事件。所以不要错过处理CollectionBase.OnClear或CollectionBaseOnClearComplete函数!