|
|
|
|
Автор:
|
Faust Faust
|
|
Тема:
|
RE[4]: Список компонентов формы
|
|
Дата:
|
12/16/2008 10:51: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)
>>>>{//~~~ ваш код}
>>>>
>>>>А если передать форму как параметр в функцию не принадлежащую этой форме то получить список компонент указанным выше способом неполучится.
>>>>
>>>>Внимание вопрос - что делать, как все-таки получить список компонент, а потом
>>>>обратится к опредленным свойствам компонеты?
>>>>
>>>>
|
|
|
|