基于记录类型来使用不同的编辑屏幕(表继承)

[原文发表地址]  Using Different Edit Screens Based on Record Types (Table Inheritance)

[原文发表时间] 2012-01-20 2:59 PM

这周一位读者询问我怎样使用Visual Studio LightSwitch 来基于记录类型打开不同的编辑详细信息屏幕。这是一个很常见的问题,尤其对使用表继承(或子表)的数据模型来说。例如说我们正在构建一个应用程序,该程序是用于宠物商店管理库存动物的。我们需要在Animal表中收集所有动物的共有属性,但是我们也想设置一些表继承到鱼,猫和狗的表中,这些表存放这些动物的特有的属性。当用户在搜索屏幕中选择一个动物时,我们需要显示一个屏幕来让用户使用来自特定表的正确数据。LightSwitch提供一个 “显示为链接”的标签,它可以为该实体自动打开默认的详细信息屏幕,但是在我们的例子中,我们有多个屏幕。当处理LightSwitch中不同类型的关系时,你也需要了解其他的一些技术,特别是关于插入管道。在这篇文章中我会给你演示怎样可以实现这个功能。

创建数据模型

首先让我们从给宠物商店创建一个简单的继承数据模型开始。我们会创建一个保存商店中所有动物共有属性的Animal表。然后我们会创建关于猫,狗和鱼的表来保存这些动物类型的特有属性。Animal表和其他动物表的关系是“一对0或1”的关系。

在这个例子中,Animal表有两个必要的属性,名字和类型。类型是一个有“猫”,“狗”,“鱼”等静态值来对应于动物的选择列表。我们将使用该类型来控制哪些记录应被插入到特定的表中,我们也用它来决定显示哪个屏幕。

image

接下来,创建一个猫,狗和鱼的表来记录这些动物类型的特有属性。

image

最后,使用一个“级联删除”的删除行为,设置从Animal表到这些表的“1对0或1”的关系。

image

现在我们的数据模型看上去像这样。

image

创建屏幕

接下来我们需要在系统中输入一些新的动物。创建一个New Data屏幕,然后选择Animal作为屏幕数据。当你这样设置时,LightSwitch会在屏幕上显示所有的一对一关联表中的字段。然而,我们只要求用户在该屏幕上输入动物的一般属性,一旦他们保存了,我们会指导他们到正确的猫, 狗或鱼的详细信息屏幕。因此首先删除屏幕设计器的目录树中除名字和类型外的所有项。

image

接下来,创建一个编辑详细信息屏幕,再次选择Animal屏幕数据。将屏幕命名为CatDetail,然后取消选中“设置为默认详细信息屏幕”。

image

你会再次看到LightSwitch读取这些特定关系,并将四个表中的所有字段添加到屏幕上。我们需要做些修改。首先,将“类型”从自动完成框修改为标签(Label)。一旦用户在New Data屏幕上输入了动物类型,它就不能被修改了。接下来,从屏幕上删除所有与狗和鱼有关的所有字段。

image

重复上述步骤来创建DogDetail和FishDetail屏幕,从屏幕中移除不应显示的字段。

最后,添加一个Search Data屏幕,并再次选择Animal作为屏幕数据。选择“名字”内容项,然后在属性窗口中取消选中“显示为链接”。

image

与其使用内置的“显示为链接”功能,不如创建我们自己的命令行。我们可以在屏幕的任何地方输入命令行,然后将它们显示为按钮或链接。(想了解更多信息,请看:“我命令你!” - LightSwitch 屏幕命令提示和技巧)例如我们可以在屏幕命令条,网格命令条,甚至在行本身上放置一个编辑按钮。让我们向行本身中添加一个命令行。

右击目录树中的数据网格行命令条,选择“添加按钮…”。创建一个新的名为“Edit”的方法。

image

我们想要将命令行显示为链接而不是按钮,因此在内容目录上选择按钮,然后更改为链接。

image

编写代码

现在我们需要编写一些代码来将它们放在一起,右击刚才所创建的按钮,然后选择“编辑执行代码”来打开代码编辑器。这里我们要检查哪种动物类型需要打开相应的屏幕。

    1: Private Sub Edit_Execute()
    2:     If Me.Animals.SelectedItem IsNot Nothing Then
    3:         Select Case Me.Animals.SelectedItem.Type
    4:             Case "Cat"
    5:                 Me.Application.ShowCatDetail(Me.Animals.SelectedItem.Id)
    6:             Case "Dog"
    7:                 Me.Application.ShowDogDetail(Me.Animals.SelectedItem.Id)
    8:             Case "Fish"
    9:                 Me.Application.ShowFishDetail(Me.Animals.SelectedItem.Id)
   10:         End Select
   11:     End If
   12: End Sub

接下来我们需要在New Data屏幕上编写类似的代码,这样,当用户保存一个新的动物记录时,它会打开正确的详细信息屏幕。打开CreateNewAnimal屏幕,在右上方的“编写代码”下拉列表中选择CreateNewAnimal_Saved方法。

首先注释掉ShowDefaultScreen 的调用,然后编写代码来决定我们应显示哪个屏幕来代替:

    1: Private Sub CreateNewAnimal_Saved()
    2:     Me.Close(False)
    3:     'Application.Current.ShowDefaultScreen(Me.AnimalProperty)
    4:  
    5:     Select Case Me.AnimalProperty.Type
    6:         Case "Cat"
    7:             Me.Application.ShowCatDetail(Me.AnimalProperty.Id)
    8:         Case "Dog"
    9:             Me.Application.ShowDogDetail(Me.AnimalProperty.Id)
   10:         Case "Fish"
   11:             Me.Application.ShowFishDetail(Me.AnimalProperty.Id)
   12:     End Select
   13: End Sub

最后,我们需要在保存管道中对Animal执行一个业务规则。这个规则非常重要,一旦执行完,一个基于动物类型的新的纪录会被添加到正确的表中。这样当用户保存CreateNewAnimal屏幕后,纪录将被写入正确的表中,同时详细信息屏幕会被打开,并允许用户编辑猫,狗或鱼表中的特定字段。双击解决方案资源管理器中数据源/ ApplicationData 节点下方的Animals,来打开数据设计器。下拉编写代码按钮,选择Animals_Inserting方法然后编写下列代码:

    1: Private Sub Animals_Inserting(entity As Animal)
    2:     Select Case entity.Type
    3:         Case "Cat"
    4:             If entity.Cat Is Nothing Then
    5:                 entity.Cat = New Cat()
    6:             End If
    7:         Case "Dog"
    8:             If entity.Dog Is Nothing Then
    9:                 entity.Dog = New Dog()
   10:             End If
   11:         Case "Fish"
   12:             If entity.Fish Is Nothing Then
   13:                 entity.Fish = New Fish()
   14:             End If
   15:     End Select
   16: End Sub

运行程序 !

在创建新动物屏幕中输入新的动物,当你点击保存时,相应的详细信息屏幕会打开,并允许你输入更多相关动物的特定信息。

image

在我们的搜索屏幕上,我们可以点击任意行上的编辑链接,它也会打开相应的屏幕。

image

总结

我希望这篇文章回答了读者的问题,关于如何基于纪录类型打开不同的详细信息屏幕,所需的只是执行自己的命令。我也讲述了1对1关系及怎样设置基本的表继承。我鼓励大家去实践更多类似的关系类型。当你需要用其他属性来扩展外部数据源,或你需要设置继承层次结构时,它们用起来特别方便。这个技巧是当你插入主要的/父纪录时,确保该纪录被插入正确的表中。 在以后的文章中我会讲述一些其他的技术。

希望你们喜欢!