2010-06-03 4 views
0

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

Мне нужно найти все BindingSources в UserControl программно.

Поскольку источник BindingSource не добавлен в коллекцию ControlControl Controls, я не могу выполнить поиск там.

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

ответ

0

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

Поскольку я не знаю, как использовать конструктор в классе, который не является результатом 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(); 
       } 
      } 
     } 
    } 
} 
2

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

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

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

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

+0

у меня есть выбор использовать отражение, потому что я не знаю, каким образом я могу использовать конструктор WinForms из VS на класс, который не делает напрямую вытекает из UserControl, и мне нужен этот метод для доступа ко всем моим UserControls. Мое решение состояло в том, чтобы заставить UserControls реализовать интерфейс, IBusinessEntityEditorView и создать метод расширения для этого интерфейса, который получает все BindingSources. – Emanuel

Смежные вопросы