Form
或UserControl
的组件未在任何集合中公开。你必须自己做这个。
首先,声明你UserControl
旨意实现一个接口:
public interface IComponentList
{
List<Component> Components
{
get;
}
}
接下来,在你的UserControl
,组件在构造函数中添加到列表中,并公开这份名单通过接口属性Components
:
public partial class UserControl1 : UserControl, IComponentList
{
private List<Component> _components = new List<Component>();
public UserControl1()
{
InitializeComponent();
_components.Add(errorProvider1);
}
List<Component> IComponentList.Components
{
get
{
return _components;
}
}
}
现在,下面的函数应该让你的ErrorProvider
个列表中的所有UserControl
s表示实现IComponentList
接口:
public List<ErrorProvider> GetErrorProviders(Control myControl)
{
List<ErrorProvider> foundErrorProviders = new List<ErrorProvider>();
GetErrorProviders(myControl, foundErrorProviders);
return foundErrorProviders;
}
protected void GetErrorProviders(Control myControl, List<ErrorProvider> foundErrorProviders)
{
if (foundErrorProviders == null)
{
throw new ArgumentNullException("foundErrorProviders");
}
if (myControl is IComponentList)
{
foreach (Component component in ((IComponentList) myControl).Components)
{
if (component is ErrorProvider)
{
foundErrorProviders.Add((ErrorProvider) component);
}
}
}
foreach (Control control in myControl.Controls)
{
GetErrorProviders(control, foundErrorProviders);
}
}
呼叫这样的方法:
GetErrorProviders(myUserControl);
注:一个在.designer.cs
文件名为components
变量 Windows窗体设计器将所有的组件。你可以选择只在components
集合中添加的所有成分的_components
名单,但我阅读下列here:
[...]我已经意识到 components
件实际使用 只当具有 特定构造函数的组件被放置到 表单上时。 [...]如果 组件暴露构造 与特定签名的Public Sub 新(BYVAL c以的IContainer),那么 components
成型构件实例化 并传递到组件的 构造
...这就是为什么我在使用components
集合时犹豫不决,因为它不一定包含所有组件。但是,它将与ErrorProvider
一起工作。
您可能也想看看this forum post。
感谢您的示例。我开始走这条路线,但不想要联结。不过,它看起来可能是最好的选择。我也知道.Desinger.cs文件中的私人组件集合,但不想反映到私人领域。 – 2009-08-04 21:13:31