WinForms:如何在UserControl中查找所有BindingSources

时间:2010-06-03 16:18:15

标签: .net winforms user-controls bindingsource

在我们正在开发的程序中,用户数据收集在UserControls中,这是使用BindingSources绑定到业务实体的数据。

我需要以编程方式在UserControl中找到所有BindingSource。

由于BindingSource源未添加到UserControl的Controls集合中,我无法在那里搜索。

可以这样做吗?

2 个答案:

答案 0 :(得分:2)

BindingSourceComponent,而不是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();
                }
            }
        }
    }
}