Есть ли способ создать экран поиска в Lightswitch на основе раскрывающегося списка?

Я хочу поместить раскрывающийся список, где окно поиска находится на экране поиска, и каждая запись будет связана с другим запросом. Это для базы данных, используемой в моем бизнесе, и в настоящее время у нас слишком много экранов, таких как:

  • Все оборудование
  • Новое оборудование
  • Доступное оборудование
  • Проданное оборудование
  • Неоплаченное оборудование
  • Невыплаченные комиссии

Я использую Lightswitch V2 от RC 2012 года.


person Mike B    schedule 14.07.2012    source источник


Ответы (3)


Сначала нажмите «Добавить элемент данных» и добавьте локальное свойство типа String. Ради обсуждения назовите его SearchType. В окне свойств SearchType щелкните Список выбора. Заполните список выбора значениями, указанными выше (например, Все оборудование, Новое оборудование и т. д.). Перетащите это в дерево элементов управления, и оно станет AutoCompleteBox.

Щелкните правой кнопкой мыши то, что я собираюсь назвать вашей таблицей Equipment, и нажмите «Добавить запрос». Дайте этому имя, например EquipmentSearch. Настройте запрос, аналогичный тому, который показан на шаге 2 ссылки Янна:

введите здесь описание изображения

Добавьте параметр, но не добавляйте фильтр. Вместо TownId назовем его SearchParam и сделаем типом String.

Вернувшись в конструктор экрана, используйте команду «Добавить элемент данных», чтобы добавить запрос EquipmentSearch на экран. Перетащите его на дерево, чтобы оно стало представлением сетки.

Нажмите EquipmentSeach в левом списке, чтобы он развернулся. Затем щелкните SearchParam и в окне свойств щелкните поле под привязкой параметров и выберите SearchType.

Снова откройте EquipmentSearch в конструкторе запросов. В правом верхнем углу конструктора запросов щелкните стрелку рядом с надписью «Написать код» и выберите EqupimentSearch_PreprocessQuery.

Теперь добавьте код, подобный следующему:

ВБ.NET

    Private Sub EquipmentSearch_PreprocessQuery(SearchParam As System.Nullable(Of String), ByRef query As System.Linq.IQueryable(Of LightSwitchApplication.Equipment))
        Select Case SearchParam
            Case "New Equipment"
                query = From es In query
                        Where es.EquipStatus = "New"
                        Select es
            Case "Available Equipment"
                query = From es In query
                        Where es.EquipStatus = "Available"
                        Select es
            Case "Sold Equipment"
                query = From es In query
                        Where es.EquipStatus = "Sold"
                        Select es
            Case "Unpaid Equipment"
                query = From es In query
                        Where es.EquipStatus = "Unpaid"
                        Select es
            Case "Unpaid Commission"
                query = From es In query
                        Where es.EquipCommission = "Unpaid"
                        Select es
        End Select
    End Sub

C#

private void EquipmentSearch_PreprocessQuery(System.Nullable[] SearchParam, void Of, void String) {
    ((System.Linq.IQueryable[])(query));
    Of;
    LightSwitchApplication.Equipment;

    switch (SearchParam) {
        case "New Equipment":
            query = From es In query
                    Where es.EquipStatus = "New"
                    Select es
            break;
        case "Available Equipment":
            query = From es In query
                    Where es.EquipStatus = "Available"
                    Select es
            break;
        case "Sold Equipment":
            query = From es In query
                    Where es.EquipStatus = "Sold"
                    Select es
            break;
        case "Unpaid Equipment":
            query = From es In query
                    Where es.EquipStatus = "Unpaid"
                    Select es
            break;
        case "Unpaid Commission":
            query = From es In query
                    Where es.EquipCommission = "Unpaid"
                    Select es
            break;
    }

Пусть «Все оборудование» и все остальные просто провалятся. Если он провалится, то в представлении «Сетка» будет отображаться полное, нефильтрованное представление всей таблицы, что, как я полагаю, вам нужно в случае «Все оборудование». В других случаях используйте LINQ для настройки возвращаемых результатов по своему усмотрению.

person embedded.kyle    schedule 16.07.2012
comment
Бонусные баллы за возможность использовать LINQ. Сейчас попробую, спасибо за подробный ответ!!! - person Mike B; 16.07.2012
comment
Все это прекрасно работает, за исключением одной странности. Я получаю сообщение о невозможности загрузки данных. проверьте свою сеть... ошибка при использовании: query = from es в запросе, где (DateTime.Now - es.DatePurchased). Days ‹ 32 выберите es в операторе switch - person Mike B; 17.07.2012
comment
Есть много вещей, которые вызывают это. Другие запросы работают и только этот выдает ошибку? Это правильно во время выполнения? Это настольное приложение или веб-приложение? Используете ли вы внутреннюю базу данных, SQL Server или службу WCF/RIA? Также есть это: social.msdn.microsoft.com/Forums/en-US/lightswitchgeneral/ Хотя я не уверен, что это актуально. Однако, просто чтобы исключить это, установите «DateTime.Now» равным локальной переменной и выполните расчет для этого. - person embedded.kyle; 17.07.2012
comment
Все мои другие запросы в порядке. Я попытался создать вычисляемое поле в таблице как логическое значение, а затем сделать простой оператор where es isNew, и у меня все еще есть та же проблема. Это двухуровневая настольная программа, и, поскольку я занимаюсь отладкой в ​​VS, я думал, что база данных — это SQLExpress. Я публикую в SQL Server 2008 на другом компьютере, но не пробовал публикацию с этой ошибкой. Для этого я добавил поле для даты покупки в таблицу и задался вопросом, связана ли проблема с изменением данных. Я изменил все даты 1-1-1900 на действительные даты в моих тестовых данных. - person Mike B; 17.07.2012
comment
Я собираюсь разработать теорию о том, что проблема связана с тем, что я добавил в таблицу обязательный столбец (дата покупки) и согласно blogs.msdn.com/b/lightswitch /archive/2010/11/30/ при управлении версиями схемы это является неразвертываемым критическим изменением схемы. Я попробую сделать значение необязательным и посмотрю, поможет ли это. - person Mike B; 17.07.2012
comment
Проблема будет заключаться в том, что вы не сможете использовать DateTime.Now в запросе LINQ в методе PreProcessQuery. Укажите значение в переменной вне запроса, затем используйте переменную вместо нее, и все будет в порядке. - person Yann Duran; 03.04.2013

Вы можете поместить несколько сеток данных на один и тот же экран, добавив на экран свойства запроса экрана, а затем перетащив их из левой части конструктора в дерево управления экраном.

Это то, что вы спрашиваете?

Редактировать:

"каждая запись связана с отдельным запросом" наводит меня на мысль, что вам нужно несколько объектов на одном экране.

Это помогает? Создание экрана поиска с фильтрацией ComboBox

person Yann Duran    schedule 16.07.2012

Что вы также можете сделать в Lightswitch, так это определить дополнительное свойство на экране, назначенное запросу, которое определяется свойством, отображаемым на экране.

В редакторе запросов назначьте свойство полю в таблице, как обычно.

Теперь с другим свойством, используемым для отображения, выберите событие Property_Changed и используйте используемый случай переключения (как в примере embedded.kyle), чтобы назначить свойство, используемое в запросе, на основе их выбора. Затем вы можете назначить значение по умолчанию в событии создания экрана.

Это сохраняет код вне запроса предварительной обработки и в коде экрана. Это может быть предпочтением, но мне нравится использовать предварительный запрос только тогда, когда мне это нужно, например, таблицы перекрестных ссылок, которые не связаны отдельной таблицей для его обработки.

person Mark    schedule 28.08.2013