在我们正在开发的程序中,用户数据收集在UserControls中,这是使用BindingSources绑定到业务实体的数据。
我需要以编程方式在UserControl中找到所有BindingSource。
由于BindingSource源未添加到UserControl的Controls集合中,我无法在那里搜索。
可以这样做吗?
答案 0 :(得分:2)
BindingSource
是Component
,而不是Control
,所以你确实无法在Controls
集合中找到它。但是,当您使用设计器添加组件时,它会创建一个名为components
的{{1}}类型的字段,并将组件添加到其中。该字段是私有的,因此您只能从声明它的类中访问它(除非您使用反射)。
我认为实现您想要的最简单方法是为所有使用的控件添加IContainer
方法:
GetBindingSources
当然,它仅适用于使用设计器创建的public IEnumerable<BindingSource> GetBindingSources()
{
return components.Components.OfType<BindingSource>();
}
,而不适用于您动态创建的(除非您将它们添加到容器中)
答案 1 :(得分:0)
最大的问题是为我的方法找到一个可供所有UserControl使用的解决方案,并且仍然可以使用Visual Studio中的WinForms设计器。
因为我不知道在不使用UserControl的类上使用设计器的任何方法,所以我创建了一个没有任何方法的接口,IBusinessEntityEditorView和一个采用这种视图的扩展方法,使用反射来查找我在其中搜索BindingSources的组件字段:
public interface IBusinessEntityEditorViewBase
{
}
...
public static void EndEditOnBindingSources(this IBusinessEntityEditorViewBase view)
{
UserControl userControl = view as UserControl;
if (userControl == null) return;
FieldInfo fi = userControl.GetType().GetField("components", BindingFlags.NonPublic | BindingFlags.Instance);
if (fi != null)
{
object components = fi.GetValue(userControl);
if (components != null)
{
IContainer container = components as IContainer;
if (container != null)
{
foreach (var bindingSource in container.Components.OfType<BindingSource>())
{
bindingSource.EndEdit();
}
}
}
}
}