|
|
|
|
Автор:
|
Шмачилин Павел
|
|
Тема:
|
RE[5]: Список компонентов формы
|
|
Дата:
|
12/18/2008 7:54:00 PM
|
Для какой каждой формы? А классы на что? Сделать единого предка всех форм с этим методом и никакого CPP-программирования.
>Тогда получается для каждой формы придется прописывать этот метод, это же какой-то получается какой-то злостный копи-паст, кто увидит сразу руки оторвет глазки выколит ((((.
>
>>Так пусть тогда форма сразу выдаёт массив всех своих дочерних элементов управления. Извлечь-то этот массив из контейнера не составляет проблем, не так ли?
>>
>>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)
>>>>>{//~~~ ваш код}
>>>>>
>>>>>А если передать форму как параметр в функцию не принадлежащую этой форме то получить список компонент указанным выше способом неполучится.
>>>>>
>>>>>Внимание вопрос - что делать, как все-таки получить список компонент, а потом
>>>>>обратится к опредленным свойствам компонеты?
>>>>>
>>>>>
|
|
|
|