Оптимизация выбора значения из списка, формируемого кодом ?
От: mr_smith Россия  
Дата: 03.04.08 10:39
Оценка:
к разделу "Как организовать выбор значения из выпадающего списка, формируемого программно?"
там написано что в наследнике StringConverter в GetStandardValues можно читать из базы.
а если у меня несколько элементов в свойства которых должны формироваться програмно (к примеру статьи несколько сотрудников должность которого должна браться из базы) код будет для каждого сотрудника открывать базу читать значения, так ? можно это как то оптимизировать?

и еще такой вопрос можно ли в свойстве GetStandardValues как-то получить форму на которой он находится?
(мой список — список контролов формы)
Re: Оптимизация выбора значения из списка, формируемого код
От: Pavel_Agurov Россия  
Дата: 03.04.08 13:03
Оценка:
Ну есть один способ... Не могу сказать что он очень уж прямой, но напишу.
Начну со второго вопроса

_>и еще такой вопрос можно ли в свойстве GetStandardValues как-то получить форму на которой он находится?

_>(мой список — список контролов формы)


public override TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
            IDesignerHost dh = context.Container as IDesignerHost;
            IComponent root = dh.RootComponent;


Вероятно (!!!) root и будет формой. Но может оказаться что это UserControl на котором лежит компонент. В общем это самое тонкое место я моем рассуждении.

_> к разделу "Как организовать выбор значения из выпадающего списка, формируемого программно?"

_>там написано что в наследнике StringConverter в GetStandardValues можно читать из базы.
Не знаю где написано, но почему бы не читать...

_>а если у меня несколько элементов в свойства которых должны формироваться програмно (к примеру статьи несколько сотрудников должность которого должна браться из базы) код будет для каждого сотрудника открывать базу читать значения, так ? можно это как то оптимизировать?


Можно закешировать. Вопрос только где. Вариант 1 — положить на форму какой-нить специальный компонент-кеш, сделать его свойством самого компонента и использовать. Неочень удобно, зато надежно и просто.

Вариант 2 забавнее. Так как форму мы получили (см выше), то можем получить из нее специальный сервис IDictionaryService, который и можно использовать как кеш. Он возвращает dictionary в который можно класть свои данные. Так как мы получаем его от формы, то он будет один на все компоненты этой формы (если брать его от компонента, то он будет свой на каждый компонент):


 // получили сервис
            IDictionaryService ds = (IDictionaryService)root.Site.GetService(typeof(IDictionaryService));

 // на всякий случай
            if (ds != null)
            {
// а есть там уже данные?
                if (ds.GetValue("DesignerData") == null)
                {
// нету - создаем
                    List<string> list = new List<string>();
                    if (list != null)
                    {
                      list.Add("LightGreen,DarkBlue");
                      list.Add("White,Red");
                      list.Add("White,Blue");
                    }
// сохраняем
                    ds.SetValue("DesignerData", new List<string>());
                }

// достаем и используем
                List<string> list = (List<string>)ds.GetValue("DesignerData");

            }


Думаю что вполне можно использовать. Пока больше ничего путного не придумалось.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.