有没有办法根据下拉列表在Lightswitch中创建搜索屏幕

时间:2012-07-14 17:45:21

标签: visual-studio-lightswitch

我想在搜索框上显示搜索框的下拉列表,并让每个条目与不同的查询相关联。这适用于我的业务中使用的数据库,我们目前有太多的屏幕,例如:

  • 所有设备
  • 新设备
  • 可用设备
  • 已售设备
  • 无偿装备
  • 无偿佣金

我正在使用2012 RC中的Lightswitch V2

3 个答案:

答案 0 :(得分:3)

首先单击Add Data Item并添加String类型的Local属性。为了讨论,请称之为SearchType。在SearchType的“属性”窗口中,单击“选择列表”。使用上面列出的值(即所有设备,新设备等)填充选项列表。将其拖到控制树上,它将成为一个AutoCompleteBox。

右键单击我要调用的Equipment表,然后单击“添加查询”。给它一个像EquipmentSearch这样的名字。设置类似于Yann链接的第2步中所见的查询:

enter image description here

添加参数但不添加过滤器。而不是TownId让我们称之为SearchParam并使其成为String类型。

返回屏幕设计器,使用“添加数据项”将EquipmentSearch查询添加到屏幕。将其拖到树上,使其成为网格视图。

点击左侧列表中的EquipmentSeach,使其展开。然后单击SearchParam并在其属性窗口中,单击参数绑定下面的框并选择SearchType

再次在Query Designer中打开EquipmentSearch。在查询设计器的右上角,单击“编写代码”旁边的箭头,然后选择EqupimentSearch_PreprocessQuery

现在添加类似于以下内容的代码:

VB.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自定义返回的结果。

答案 1 :(得分:1)

您可以将多个数据网格放在同一屏幕上,方法是在屏幕上添加屏幕查询属性,然后将它们从设计器的左侧拖到屏幕控制树上。

这就是你问的问题吗?

编辑:

让每个条目与不同的查询相关联”让我相信您想要在一个屏幕上显示多个实体。

这有帮助吗? Creating a ComboBox filtered Search Screen

答案 2 :(得分:1)

您还可以在Lightswitch中执行的操作是在屏幕中定义分配给查询的额外属性,该属性由屏幕上显示的属性决定。

在查询编辑器中,将属性分配给表中的字段,就像通常一样。

现在使用用于显示的其他属性,选择Property_Changed事件,并使用所使用的switch case(如embedded.kyle的示例中)根据其选择分配查询中使用的属性。然后,您可以在屏幕的创建事件中指定默认值。

这使代码保留在预处理查询之外和屏幕代码中。它可能是一个偏好的东西,但我喜欢在我需要时只使用预处理查询,例如交叉引用不受单独表约束的表来处理它。