WinForms: как найти все источники привязки в UserControl - PullRequest
0 голосов
/ 03 июня 2010

В программе, над которой мы работаем, пользовательские данные собираются в UserControls, который является привязкой данных к бизнес-объекту с использованием BindingSources.

Мне нужно программно найти все источники привязки в UserControl.

Так как источник BindingSource не добавлен в коллекцию элементов управления UserControl, я не могу искать там.

Можно ли это сделать?

Ответы [ 2 ]

2 голосов
/ 03 июня 2010

BindingSource - это Component, а не Control, так что вы действительно не можете найти его в коллекции Controls. Однако, когда вы добавляете компоненты с конструктором, он создает поле с именем components типа IContainer и добавляет к нему компоненты. Поле является закрытым, поэтому вы можете получить к нему доступ только из класса, в котором оно объявлено (если только вы не используете отражение).

Я думаю, что самый простой способ добиться того, чего вы хотите - это добавить GetBindingSources метод ко всем вашим элементам управления:

public IEnumerable<BindingSource> GetBindingSources()
{
    return components.Components.OfType<BindingSource>();
}

Конечно, он будет работать только для BindingSources, созданного в конструкторе, а не для тех, которые вы создаете динамически (если вы не добавите их в контейнер)

0 голосов
/ 04 июня 2010

Самой большой проблемой было найти решение, чтобы мой метод был доступен для всех элементов управления UserControls и при этом можно было использовать конструктор WinForms из Visual Studio.

Поскольку я не знаю никакого способа использования конструктора в классе, который не является производным от UserControl, я создал интерфейс без каких-либо методов, IBusinessEntityEditorView и метод расширения, который принимает такое представление, использует отражение для поиска поле компонентов, в котором я ищу свои источники привязки:

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();
                }
            }
        }
    }
}
...