...

И снова выпадающий список (значение по умолчанию)

Тема в разделе "Разработчикам", создана пользователем inteco, 24 окт 2017.

  1. inteco

    inteco Member

    Есть выпадающий список на форме задачи context.StatjyaZatrat типа "Объект".
    На этот объект ставлю фильтр:
    var contactSettings = (EntitySettings)context.GetSettingsFor(c => c.StatjyaZatrat);
    contactSettings.FilterQuery = "NazvanieStatji like 'Командировки%'";
    contactSettings.Save();
    Фильтр - работает.
    Как в выпадающем списке установить как выбранное значение из отобранных фильтром?
     
  2. Riket Contraption

    Riket Contraption New Member

    Необходимо в контекстную переменную context.StatjyaZatrat подставить любое из отобранных значений?
     
  3. inteco

    inteco Member

    Именно, первое попавшееся из отобранных фильтром.
     
  4. Riket Contraption

    Riket Contraption New Member

    Тогда надо отдельно выбрать какой-нибудь экземпляр объекта по тем же условиям и подставить в переменную:

    context.StatjyaZatrat = EntityManager<ИмяКласса>.Instance.Find(c => c.Name.StartsWith("Командировки")).FirstOrDefault();

    С синтаксисом мог ошибиться немного, но, надеюсь, принцип понятен.
     
  5. inteco

    inteco Member

    Принцип понятен, но:
    фильтр у меня такой: "NazvanieStatji like 'Командировки%'", или такой "NazvanieStatji like '%гсм%'" или еще какой.
    Добывать из него слово для "c.Name.StartsWith("Командировки")", используя методы работы со строками - не хочется.
    Я точно знаю, что список будет не пустой.
    А можно как-то получить из списка первый элемент и его подставить в значение по умолчанию?
    Что-то типа context.StatjyaZatrat[0]?
     
  6. arkarimov

    arkarimov Member

    Вы можете смело строку фильтра передавать в метод Find EntityManager-а. Он принимает как лямбда-выражения, так и EQL запросы.
     
  7. inteco

    inteco Member

    Пробовал, возвращает NULL.
    Сделал фильтр:
    var filter = PublicAPI.Objects.UserObjects.UserStatjiDohodovZatrat.Filter().Query("NazvanieStatji like 'Командировки%'").Filter;
    Применил:
    context.StatjyaZatrat = EntityManager<StatjiDohodovZatrat>.Instance.Find(filter, null).FirstOrDefault();
    Заработало.

    Но как-то все это "криво".
    1. Сначала накладываем фильтр на справочник.
    2. Потом с этим же фильтром ищем "первое попавшееся"
    3. Потом присваиваем.
    А хочется:
    1. Сначала накладываем фильтр на справочник.
    2. Присваиваем первую запись из п.1.

    Хотя, может все потому что я не понимаю область действия этой конструкции:
    var contactSettings = (EntitySettings)context.GetSettingsFor(c => c.StatjyaZatrat);
    contactSettings.FilterQuery = "NazvanieStatji like 'Командировки%'";
    contactSettings.Save();
    Этот фильтр действует пока не переназначить?
    Или до выхода из процедуры?
    Или это фильтр выпадающего списка, а сам объект не фильтруется?
     
  8. arkarimov

    arkarimov Member

    Вы его возможно неправильно готовите.
    Вот пример работающий (как раз под рукой был объект пользовательский)
    Код:
            
    public void TestFilters(Context context)
            {
                var Settings = (EntitySettings)context.GetSettingsFor (c => c.Servis);
                Settings.FilterQuery = "BiznesServis =true";
                Settings.Save ();
                var allServices = EntityManager<ITServis>.Instance.FindAll();
                Console.WriteLine("all services list");
                foreach(var item in allServices)
                {
                    Console.WriteLine(string.Format("Id= {0} BS= {1}", item.Id, item.BiznesServis));               
                }
                Console.WriteLine("filtered services list");
                var filteredServices = EntityManager<ITServis>.Instance.Find(Settings.FilterQuery);
                foreach(var item in filteredServices)
                {
                    Console.WriteLine(string.Format("Id= {0} BS= {1}", item.Id, item.BiznesServis));
                }
                context.Servis = filteredServices.FirstOrDefault();
            }
    all services list
    Id= 1 BS= True
    Id= 2 BS= True
    Id= 3 BS= False
    Id= 4 BS= True
    Id= 5 BS= True
    Id= 6 BS= True
    filtered services list
    Id= 1 BS= True
    Id= 2 BS= True
    Id= 4 BS= True
    Id= 5 BS= True
    Id= 6 BS= True
    Как видно во втором выводе отфильтрован 1 объект.
    Касательно кривизны -вкусовщина. Фильтр это не выбранные объекты, это именно фильтр. Для облегчения понимания представьте себе что вы поставили сеть в реке которая отберет вам рыбу нужного размера. Сеть есть, река есть, известно даже какая попадется первой если есть точная модель реки, но это не значит что у вас есть рыба. Если это надо можно принудительно её засунуть в сеть что мы и делаем вторым кусочком кода.
    Фильтр действует пока не измените его в другом участке кода.
     
  9. inteco

    inteco Member

    Аrkarimov,
    Огромное спасибо вам за код!

    Мне не хватало именно:
    var filteredServices = EntityManager<ITServis>.Instance.Find(Settings.FilterQuery);

    В итоге у меня получилась такая конструкция:

    var contactSettings = (EntitySettings)context.GetSettingsFor(c => c.StatjyaZatrat);
    contactSettings.FilterQuery = context.VidOperacii.FiljtrDlyaStateyZatrat;
    contactSettings.Save();
    //тут нужно выбрать значение по умолчанию в списке context.StatjyaZatrat
    context.StatjyaZatrat = EntityManager<StatjiDohodovZatrat>.Instance.Find(contactSettings.FilterQuery).FirstOrDefault();

    А "объектные" выпадающие списки индексы не поддерживают?
    типа context.StatjyaZatrat.Items[0]
     
  10. arkarimov

    arkarimov Member

    Пожалуйста.
    "объектные выпадающие списки" это не классические выпадающие списки из winforms если вы об этом. У них нет свойства Items и в принципе это ссылка на конкретный экземпляр объекта если выбрано условие тип связи одиночная. А организованы как выпадающий список просто для удобства ввода. Но он не заполняется а подтягивается из БД при обращении пользователя.
    Может это облегчит понимание - наложите фильтр на поле в задаче.
    Не завершая задачу, создайте еще один экземпляр объекта который гарантированно попадает в фильтр.
    Откройте выпадающий список в задаче - этот объект будет в списке, хотя на момент формирования списка его просто не существовало.
     
  11. arkarimov

    arkarimov Member

    Пожалуйста.
    "объектные выпадающие списки" это не классические выпадающие списки из winforms если вы об этом. У них нет свойства Items и в принципе это ссылка на конкретный экземпляр объекта если выбрано условие тип связи одиночная. А организованы как выпадающий список просто для удобства ввода. Но он не заполняется а подтягивается из БД при обращении пользователя.
    Может это облегчит понимание - наложите фильтр на поле в задаче.
    Не завершая задачу, создайте еще один экземпляр объекта который гарантированно попадает в фильтр.
    Откройте выпадающий список в задаче - этот объект будет в списке, хотя на момент формирования списка его просто не существовало.
     
  12. inteco

    inteco Member

    Да, я об этом.

    "Объект" в моем понимании - это таблица(цы - если есть свойство типа "блок") в базе данных.
    А "экземпляр объекта" в вашем ответе - это строка этой таблицы?
    Если это так, то такой выпадающий список это просто динамическая выборка из БД,
    пропущенная через фильтр, - либо "пустой" (все строки),
    либо "заполненный" (какое-то количество строк).

    Теперь в этой области стало немного яснее.

    Всем огромное спасибо за помощь!
     
  13. svergay

    svergay New Member

    Вопрос по теме: Каким образом мне выбрать одно из значений выпадающего списка в сценарии, перепробовал все, ничего не получается. Пример: есть выпадающий список context.Type , значения: 1) Договор 2) Доп.соглашение, код типа context.Type.Value = "Договор" выдает ошибку, на Key тоже ругается...
     
  14. inteco

    inteco Member

    Попробуйте:
    var settings = (DropDownListSettings)context.GetSettingsFor (c => c.Type);
    context.Type = settings.Items.Find(s=>s.Value =="Договор");

    и, если после этого context.Type != null, значит получилось.
     
    1 это нравится
  15. svergay

    svergay New Member

    Большое спасибо, помогло!
     
  16. Юлия

    Юлия Member

    или так:
    context.Type = new DropDownItem ("Договор")
     

Поделиться: