【问题标题】:Is there a way to create a search screen in Lightswitch based on a dropdown有没有办法根据下拉菜单在 Lightswitch 中创建搜索屏幕
【发布时间】:2012-07-14 17:45:21
【问题描述】:

我想在搜索屏幕上的搜索框所在的位置放置一个下拉菜单,并使每个条目与不同的查询相关联。这是用于我的业务中使用的数据库,我们目前有太多屏幕,例如:

  • 所有设备
  • 新设备
  • 可用设备
  • 出售设备
  • 未付费设备
  • 未付佣金

我正在使用 2012 RC 的 Lightswitch V2

【问题讨论】:

    标签: visual-studio-lightswitch


    【解决方案1】:

    首先单击添加数据项并添加一个字符串类型的本地属性。为了讨论起见,称之为SearchType。在SearchType 的属性窗口中单击选择列表。使用您在上面列出的值(即所有设备、新设备等)填充选择列表。将它拖到控件树上,它将成为一个 AutoCompleteBox。

    右键单击我将调用您的Equipment 表,然后单击添加查询。给它起一个名字,比如EquipmentSearch。设置类似于 Yann 链接的第 2 步中所见的查询:

    添加参数但不添加过滤器。代替TownId,我们将其命名为SearchParam,并将其设为String 类型。

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

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

    再次在查询设计器中打开EquipmentSearch。在查询设计器的右上角,单击 Write Code 旁边的箭头并选择 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 自定义返回的结果。

    【讨论】:

    • 能够使用 LINQ 的奖励积分。我现在就试试这个,谢谢你的详细回复!!!
    • 这一切都很好,除了一个奇怪的地方。使用时出现“无法加载数据。请检查您的网络...”错误:query = from es in query where (DateTime.Now - es.DatePurchased).Days
    • 造成这种情况的原因有很多。其他查询是否有效,仅此一个给出错误?这在运行时正确吗?这是桌面应用程序还是 Web 应用程序?您使用的是 Intrinsic 数据库、SQL Server 还是 WCF/RIA 服务?还有这个:social.msdn.microsoft.com/Forums/en-US/lightswitchgeneral/… 虽然我不确定它是否相关。然而,为了排除它,将“DateTime.Now”设置为一个局部变量并对其进行计算。
    • 我的所有其他查询都很好。我尝试在表上创建一个计算字段作为布尔值,然后制作一个简单的“where es isNew”语句,但仍然有同样的问题。这是一个 2 层桌面应用程序,因为我在 VS 中调试,所以我认为数据库是 SQLExpress。我正在另一台机器上发布到 SQL Server 2008,但没有尝试发布此错误。为此,我已将购买日期字段添加到表中,并想知道问题是否与数据更改有关。我已将测试数据中的所有 1-1-1900 日期更改为有效日期。
    • 我将提出一个理论,即问题与我在表中添加了一个必需列(购买日期)这一事实有关,并且根据架构版本控制下的blogs.msdn.com/b/lightswitch/archive/2010/11/30/…,这样做是非- 架构中可部署的重大更改。我会尝试将值设为可选,看看是否有帮助。
    【解决方案2】:

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

    这就是你要问的吗?

    编辑:

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

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

    【讨论】:

    • 我想做的是在屏幕顶部有一个带有预设条目的下拉菜单,每个条目都与不同的查询相关联,所以我不必有这么多屏幕来显示相同数据的不同结果集。
    • 适用于遇到相同问题的任何人。除了 Kyle 的出色建议之外,还有两个链接也可能有所帮助。 LightSwitch – dotnettim.wordpress.com/2011/03/20/… & msdn.microsoft.com/en-us/vstudio/hh499661.aspx 希望对您有所帮助。
    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-02
      • 2014-02-09
      • 2022-07-19
      • 2012-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多