Компоненты 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
с, которые реализуют интерфейс 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);
Примечание: Конструктор Windows Forms помещает все компоненты в переменную с именем components
в файле .designer.cs
. Вы можете просто добавить все компоненты из коллекции components
в список _components
, но я прочитал следующее здесь :
[...] Я понял, что
components
член фактически используется
только когда компонент, имеющий
конкретный конструктор помещается на
Форма. [...] Если
компонент предоставляет конструктор
с конкретной подписью Public Sub
Новый (ByVal c As IContainer), затем
components
Элемент формы создан
и передается компоненту
Конструктор
... вот почему я не решаюсь использовать коллекцию components
, поскольку она не обязательно будет содержать все ваши компоненты. будет работать с ErrorProvider
, хотя.
Возможно, вы захотите взглянуть и на это сообщение на форуме .