|
|
|
|
Автор:
|
Шмачилин Павел
|
|
Тема:
|
RE[3]: Список компонентов формы
|
|
Дата:
|
12/16/2008 1:54:00 AM
|
Так пусть тогда форма сразу выдаёт массив всех своих дочерних элементов управления. Извлечь-то этот массив из контейнера не составляет проблем, не так ли?
List<IComponent> Components = new List<IComponent>();
foreach(IComponent Component in components.Components)
Components.Add(Component);
return Components.ToArray();
>Спасибо за помощь.
>Второй вариант не работает:
>я сделал вот так
>class BaseForm :Form
>{
> public System.ComponentModel.IContainer
> GetComponents()
> {
> return components;
> }
>}
>
>class myForm : BaseForm
>{
>
> // здесь на какое-нить событие вызываю GetComponents, но оно реботает
> // говорит что "components"(именно с маленькой буквы "c") = null
>}
>
>Попробую щас поточнее выразить для чего мне это надо:
>У меня есть класс который должен уметь получить список компонент/контролов формы и получить этот список с базы, сравнить эти два списка и проставить нужные(из базы) свойства компонентам/контролам формы. А так же есть такого компонента/контрола нет базе сохранить его(name, type, caption, text, visible, enable) в базу. Вот загвоздка пока на получении компонент формы((.
>
>>Правильным будет путь такой: объявить в классе-наследнике формы метод, которй выполняет груповую операцию над всеми элементами формы. На пример так:
>>public delegate void Action(Component component);
>>public void ForeEachItems(Action action)
>>{
>> foreach(Component comp in this.components.Components)
>> action(comp);
>>}
>>
>>Есть ещё один путь, на за такой обычно надо бить по рукам, если не отрывать их сразу: Можно на пример объёвить в наследнике формы свойство, или метод, возвращающий этот самый конейнер с компонентами:
>>
>>public System.ComponentModel.IContainer
>> GetComponents()
>>{
>> return components;
>>}
>>
>>public System.ComponentModel.IContainer
>> FormComponents
>>{
>> get { return components; }
>>}
>>
>>А руки отрывать надо за то, что в последнем случае нарушается принцип инкапсуляции объекта. Это должно быть оправдано и трижды перепроверено потому, что именно это и вличёт те самые нередсказуемые моменты в поведении приложения.
>>
>>>Столкнулся с проблеммой при получении списка компонентов на форме.
>>>
>>>Предыстория:
>>>Cписок компонет формы приватный...
>>>
>>>partial class Form1
>>>{ /// <summary>
>>> /// Required designer variable.
>>> /// </summary>
>>>private System.ComponentModel.IContainer components = null;
>>>//... - это выдержка кода формы, она генерится автоматом при созаднии
>>>//... формы в дизайн-тайм
>>>
>>>В итоге получается что у формы ты можешь спросить вот это
>>>foreach(Component comp in this.components.Components)
>>>{//~~~ ваш код}
>>>
>>>А если передать форму как параметр в функцию не принадлежащую этой форме то получить список компонент указанным выше способом неполучится.
>>>
>>>Внимание вопрос - что делать, как все-таки получить список компонент, а потом
>>>обратится к опредленным свойствам компонеты?
>>>
>>>
|
|
|
|