UML软件工程组织

使用 Visual Studio 2005 设计设备应用程序的用户界面和数据
作者:Maarten Struys
本页内容
简介 简介
设计基于 Windows Mobile 5.0 的 Pocket PC 的简单用户界面 设计基于 Windows Mobile 5.0 的 Pocket PC 的简单用户界面
停靠和定位控件 停靠和定位控件
拆分器控件 拆分器控件
设置 Tab 键顺序 设置 Tab 键顺序
更改设备外观设置 更改设备外观设置
更改目标平台 更改目标平台
可视窗体继承 可视窗体继承
使用 Visual Studio 数据库工具 使用 Visual Studio 数据库工具
结论 结论

简介

每个 Visual Studio 的新版本都会提高开发人员的效率,因为可视设计器工具越来越多,为开发人员生成的代码也越来越多。此代码具有巨大优势,因为您无需将精力集中在编写各种探测代码,而可以将精力几乎完全集中在应用程序所需的功能上。由于市场上有许多设备,所有设备的外观设置都不同,因此拥有真正的所见即所得 (WYSIWYG) 用户界面设计工具(即使用这种工具设计的用户界面与最终用户界面尽可能匹配)是至关重要的。随着将大量数据存储在本地设备上所需的应用程序越来越多,在开发环境内直观地为 SQL Server Mobile 数据库设计表和数据库的功能将会对您有所帮助。Visual Studio 2005 提供了功能强大的设计工具,这些工具减少了设计用户界面和数据所涉及到的许多工作。

通过阅读本文,您将了解到如何创建无需自己编写一行代码就能够在纵向模式和横向模式之间进行动态更改的用户界面。如果要创建的应用程序使用多个窗体且每个窗体都具有许多共同的特征,则可以使用窗体继承和完整的设计器支持来限制必须为各个窗体提供的代码数。最后,如果要在应用程序内使用本地数据库,则可以使用 Visual Studio 2005 设计器工具创建数据库,甚至填充该数据库。

设计基于 Windows Mobile 5.0 的 Pocket PC 的简单用户界面

要开始开发新的设备应用程序,首先需要在 Visual Studio 2005 创建一个新项目。该项目应为 C# 或 Visual Basic .NET(将运行 Windows Mobile 5.0 的 Pocket PC 作为目标)中的智能设备项目。虽然与 Windows 窗体设计器本身无关,但本文通篇还是以 C# 显示了所有代码示例。然而,所有代码示例也能够以 Visual Basic .NET 下载。

创建新设备应用程序时,Visual Studio 2005 按目标设备的正确尺寸显示一个空窗体,包括与真实设备尽可能贴近的设备外观。使用图 1 中显示的 Device Controls(设备控件)工具箱,可以将控件拖到应用程序的窗体中。

图 1:Visual Studio 2005 设计器视图

如果将工具箱中设备控件的数量与 Microsoft Visual Studio .NET 2003 中设备控件的数量相比,您会发现 Visual Studio 2005 中的可用控件更多。如果您对新的控件并不熟悉,那么最好使用新控件创建一个简单的应用程序,了解每个控件的属性及其行为。当然,还应该查看特定控件的联机帮助。开始设计用户界面时,立即引起您注意的是 Windows 窗体设计器如何帮助您对齐控件并建议各个控件之间的最小距离。自动显示的参考线(如图 2 所示)对您在短时间内创建组织结构良好的用户界面有很大帮助。

图 2:参考线有助于布局用户界面

停靠和定位控件

要确保窗体在纵向模式和横向模式下都能正确显示,可以将控件停靠和定位到容器内的指定位置。停靠和定位之间的差别虽然很细微,但却很重要。将控件定位到容器的一个或多个边缘时,要确保设备的显示方向改变时到定位边缘的相对位置保持不变。停靠控件时,则要指定要定位的控件所停靠的容器的边缘。甚至可以指定控件停靠到所有边缘,也就是说该控件将填充容器的整个空间。容器是控件的宿主,或者说是控件的父级。例如,容器可以是整个窗体,也可以是 GroupBox 或者 Panel。

要说明定位和停靠之间的差别以及以不同显示方向说明定位控件和停靠控件的行为,可以创建一个包含许多标签控件的简单用户界面(各个控件的背景色不同),然后就可以清楚地查看定位、停靠的行为以及方向的变化。用户界面设计没有特别的意义,只是有助于您了解停靠和定位之间的差别。它还将显示对从纵向模式改为横向模式的影响。假设您已创建了一个用户界面,如图 3 所示。

图 3:纵向模式的 Pocket PC,其用户界面包含既未停靠也未定位的多个标签和一个面板

上面的三个标签位于面板上,下面的两个标签位于窗体本身上。对于添加到窗体上的所有控件,请确保明确消除定位。默认情况下,Visual Studio 2005 将所有控件定位到上边缘和左边缘或它们的宿主容器中。处于纵向模式时,用户界面看起来很正常,但是如果将方向改为横向模式,就会出现问题,如图 4 所示。

图 4:横向模式的 Pocket PC,其用户界面包含既未停靠也未定位的控件

您马上会看到,并非纵向模式中显示的所有标签在横向模式中都能显示。部分面板(包括 label1)未显示在屏幕上。label5 也未显示在屏幕上,在横向模式下,显示屏的左右两侧未被填充。横向模式似乎只能显示纵向模式用户界面的部分内容。

要解决这个问题,无需编写实际代码,可以利用 .NET Compact Framework 2.0 应用程序的新增功能:停靠和定位。通过设置 Anchor 属性,可以轻松地将控件定位到屏幕的一个或多个边缘。定位控件意味着到定位边缘的相对位置始终保持不变,与显示方向无关。通过使用 Dock 属性,可以指定特定控件与其父控件边缘的对齐方式或填充屏幕区域的方式。将多个控件停靠到其父控件的同一边缘会导致这些控件彼此堆叠。查看图 5,您会发现其与图 3 略有不同。但是,此时控件已被定位和停靠。

图 5:纵向模式的 Pocket PC,其用户界面包含停靠和定位控件

在图 5 中,标签指明了它们的停靠方式。上面的三个标签都属于面板控件。最上面的标签未被停靠,但是定位到了面板控件的左边缘、上边缘和右边缘,面板控件又停靠到窗体的上边缘。左边缘、上边缘、右边缘与该标签之间的距离与显示方向无关,始终保持不变。用户界面以横向模式显示时,该标签的大小将被调整。面板控件中的其他两个标签显示在彼此的上边缘;二者都停靠到面板控件的下边缘。Tab 键顺序决定了这些标签的显示方式。如果现在将显示方向改为横向模式,窗体上的所有控件仍将显示,整个窗体都用来填充控件,如图 6 所示。

图 6:横向模式的 Pocket PC,其用户界面包含停靠和定位控件

图 6 中显示的用户界面比图 4 中显示的用户界面的效果要好得多,因为各个控件的大小已经调整,能够在横向模式中正确显示。要想真正了解停靠和定位对纵向模式和横向模式中控件位置的影响,应当花些时间来尝试一下。

在 Visual Studio 2005 中,在纵向和横向模式(甚至设计器视图)中查看用户界面十分简单。要更改设计器视图中设备的方向,只需从快捷菜单中选择整个窗体 [右键单击未放置任何控件的窗体的任意位置,再右键单击窗体的标题栏或设备外观,然后选择 Select <form class name>(选择 <form class name>)]。如果应用程序中只有一个窗体,并且使用 Visual Studio 2005 指定给该窗体的默认名称,则 <form class name> 将为 Form1。选择整个窗体后,通过右键单击设备外观显示的快捷菜单将包含不同项,包括 Rotate Left(向左旋转)和 Rotate Right(向右旋转)。您可以使用这些项更改显示方向,如图 7 所示。此外,选择整个窗体后,也可以使用工具栏按钮更改方向。


图 7:更改设计器视图中的显示方向

拆分器控件

.NET Compact Framework 2.0 中有一个新控件并不容易理解,并且不能直观使用。运行时,可以使用新的拆分器控件和停靠控件来更改那些控件的大小,类似于完整 .NET Framework 中的拆分器控件。

设计过程中,可以添加拆分器控件,还可以设置它们的大小。您向窗体添加停靠控件和拆分器控件的顺序决定了拆分器运行于哪个停靠控件,还决定了拆分器控件对于用户的显示方式。根据 Visual Studio 联机帮助,使用拆分器控件可以调整停靠顺序中在它前面的那个停靠控件的大小。因为无法手动设置停靠顺序,所以必须在添加完要调整其大小的停靠控件后立即添加拆分器控件。还必须确保将拆分器控件停靠到要调整其大小的停靠控件的边缘,如图 8 所示。

图 8:设计器视图中的拆分器控件

图 8 中的用户界面是按以下方式创建的。所有三个图片框逐个添加到窗体中,并停靠到窗体的上边缘和右边缘,图 8 中窗体左下部显示的最后一个图片框停靠为填充。创建图片框后,将两个拆分器拖到左下部的图片框中,并分别停靠到该图片框的上边缘和右边缘。

查看设计器视图中的用户界面,您可能认为窗体右侧的那个图片框的大小只能进行水平调整,左侧的那个图片框的大小可以进行水平和垂直调整。但是,如图 9 所示,移动水平拆分器时,所有控件都将根据拆分器的位置进行修改。出现这种情况的原因是因为右下部的那个图片框停靠到窗体的右边缘 — 始终尽可能占用和窗体右边缘的可用空间一样多的空间。此示例表明与拆分器不直接关联的控件仍可以影响它们的大小。虽然此示例对演示拆分栏和停靠控件之间的关系很有用,但并不建议通过这么复杂的方式创建用户界面。

图 9:使用拆分器控件调整停靠控件的大小

为了向用户更直观地表明拆分器控件影响停靠控件的方式,应考虑停靠控件的顺序。在将其他控件添加到常用停靠区域之前,必须添加会影响停靠控件的拆分器控件,如图 10 所示。

图 10:设计器视图中紧跟需要调整大小的停靠控件创建的拆分器控件

如果以不同顺序创建相同的用户界面,就会出现不同的结果。创建顶部图片框后立即创建水平拆分器控件。然后,创建右侧图片框,接着创建垂直拆分器控件,最后创建最后一个图片框。尽管运行时调整大小的方式未更改,但是图片框和拆分器的创建顺序却改变了,这让用户更好地了解拆分器如何调整不同控件的大小,如图 11 所示。

图 11:使用按正确顺序创建的拆分器控件来调整停靠控件的大小

设置 Tab 键顺序

要确定哪个控件获得焦点(即,哪个控件可以接受键盘输入),将使用 Tab 键顺序。之所以称为 Tab 键顺序,是因为您可以通过使用键盘(甚至 Pocket PC 的软输入面板)上的 TAB 键把焦点从一个控件改到另一个控件。

在 Visual Studio .NET 2003 中,可以接受键盘输入的那些控件的 Tab 键顺序是固定的,只是程度不同。Tab 键顺序影响设计过程中控件的创建顺序,除非删除控件并以不同顺序重新添加控件,否则该顺序不会改变。在 Visual Studio 2005 中,创建用户界面的所有控件后可以更改 Tab 键顺序,这为用户提供了更大的灵活性,因为用户在设计用户界面时不必考虑 Tab 键顺序。例如,图 12 中显示的设计器视图中具有原始 Tab 键顺序的项目。

图 12:原始 Tab 键顺序

该项目的用户界面非常简单,仅用于演示。窗体上的控件是按特定顺序创建的。首先创建按钮,然后创建 DateTime 控件,最后创建两个文本框。创建控件的顺序决定了初始的 Tab 键顺序。通过单击“Layout”(布局)工具栏上的 TabOrder(Tab 键顺序)按钮(图 12 中所圈的那个按钮),可以查看和修改 Tab 键顺序。

如果保持此特定应用程序的 Tab 键顺序不变,则运行应用程序时您将发现在控件中导航不是最佳体验。起初,输入焦点设置为用户界面上的按钮。按 TAB 键将输入焦点改为 DateTime 控件。再次按 TAB 键输入焦点将改为 tBox1,最后改为 tBox2。对用户而言,从上至下导航到所有控件更加自然。在 Visual Studio .NET 2003 中,若想让用户从上至下导航用户界面,则只能通过按您希望用户导航控件的这一顺序创建控件来实现。

在 Visual Studio 2005 中,选择“Layout”(布局)工具栏上的 TabOrder(Tab 键顺序)按钮后,只需单击能够接收输入焦点的每个控件就可以更改其 Tab 键顺序。这意味着您只需将控件添加到窗体中,而无需考虑 Tab 键顺序,因为您稍后可以修改 Tab 键顺序,如图 13 所示。

图 13:设计器视图中修改过的 Tab 键顺序

如果现在运行应用程序,您会发现在控件间导航比较自然,因为输入焦点从用户界面顶部开始逐个控件更改并依次轮流下去。也可以使用 TabIndex 属性设置各个控件的 Tab 键顺序。也可以指定用户是否可以通过设置 TabStop 属性在窗体中进行切换来导航到控件。这些属性仅可以对那些能够接受键盘输入的控件执行。

更改设备外观设置

原始 Pocket PC 的屏幕分辨率为 240 x 320 像素。现在,许多 Pocket PC 都有着不同的屏幕分辨率,甚至有正方形屏幕。要确保应用程序在所有这些设备上都能正常显示,可以设置 FormFactor 属性。FormFactor 属性只是一个设计时值。也就是说,它本身不会影响应用程序。您可以使用 FormFactor 属性来为设备设置多个不同的屏幕尺寸,以便确保在设计过程中用户界面能够在外观设置不同的设备上正常显示。图 14 中显示了一个在 Pocket PC 上运行的简单文本编辑器。如果查看下载代码示例,使用 .NET Compact Framework 2.0 编写托管代码时,您会感激为您所提供的强大功能。此示例编辑器的整个功能大约采用了 30 行源代码,包括能够打开现有文件和保存文件。当然,此示例的功能非常有限,没有任何拼写或语法检查功能或者典型编辑功能(如查找和替换),但是此示例功能完善。

图 14:具有简单文本编辑器用户界面的 Pocket PC 应用程序

假设您要在屏幕为正方形的 Pocket PC 上运行此应用程序。由于定位控件,很容易保持同样的用户界面,而无需编写任何代码。使用新的仅设计时属性 FormFactor 可以验证 Visual Studio 2005 设计器中应用程序的外观。图 15 中显示了一个新外观,应用程序的用户界面已根据新设备外观设置进行了调整。

图 15:具有以正方形屏幕外观设置显示的简单文本编辑器用户界面的 Pocket PC 应用程序

在 Visual Studio 2005 中更改外观设置十分容易,甚至不需要重新编译应用程序。毕竟,设备仍是 Pocket PC 设备,因此您仍可以使用所有 Pocket PC 的特定控件。设计过程中,唯一发生变化的是窗体的布局。

但是如果要改为完全不同的设备该怎么办?设想您要在 Smartphone 设备上使用同一应用程序。

更改目标平台

Visual Studio .NET 2003 实际上不支持更改特定应用程序的目标平台。例如,如果创建了一个 Pocket PC 的应用程序,Visual Studio .NET 2003 不支持更改项目以将 Smartphone 作为目标。最好的方法是将所有业务逻辑与用户界面逻辑相分离,将业务逻辑重用于新目标平台,然后手动重新设计用户界面。

在 Visual Studio 2005 中,则可以更改目标平台。当然,从软件开发人员的角度来看,将业务逻辑与用户界面逻辑相分离仍是个不错的主意,但是使用 Visual Studio 2005 重新将其他平台作为目标可以提高修改应用程序用户界面以支持不同硬件的效率。实际上,更改目标平台后,只有用户界面将会更改。该项目生成的应用程序的所有其他方面保持不变。因为有几个控件在 Pocket PC 上有效但在 Smartphone 上无效,设计器将这些控件转换为在 Smartphone 上有效的最匹配的替代控件。

使用 Visual Studio 2005,可以更改特定项目的目标平台。设计器将尽量帮助您转换用户界面以满足新目标平台的要求。在 Visual Studio 2005 中,可以通过选择 Project(项目)菜单上的 Change Target Platform(更改目标平台)来更改为新目标平台。选择此命令后,对话框将显示当前目标平台和一个列表,从该列表中可以选项新目标平台,如图 16 所示。

图 16:将目标平台从 Pocket PC 改为 Smartphone

单击 OK(确定),Visual Studio 将更改目标平台。在更改过程中,它将关闭并重新打开项目。区别是现在窗体设计器以 Smartphone 外观设置显示应用程序。Visual Studio 未更改任何代码,所有原始控件在该窗体上仍然有效,但是您可能需要调整这些控件的大小以适应 Smartphone 的较小屏幕。

图 17 显示了许多 Smartphone 不支持的控件。您可以区分目标平台不支持的控件,因为它们显示在窗体上时会有一个警告指示器(中间有感叹号的三角形),并且其属性都灰显。Visual Studio 2005 可以帮助您将不受支持的控件转换为支持控件。选择窗体中不支持的控件并单击控件顶部显示的箭头后,将显示一个带有支持控件的弹出菜单,这些支持控件的功能与不受支持的控件的功能相当。如果是按钮(如图 17 所示),Visual Studio 帮助您将它们转换为文本框或菜单项。将按钮转换为菜单项后,该菜单项将与原始 button_Click 事件相连接,这意味着该菜单项将获得与 Pocket PC 上的按钮相同的功能。在图 17 中,还可以看到 Smartphone 不支持 SaveFileDialog 控件和 OpenFileDialog 控件。但是这些组件与按钮不同 — 无法将这些组件简单地转换为替代 Smartphone 控件,因此必须执行一些操作来更改这些控件。在此下载代码示例中,最可能执行的操作就是提供自己的对话框来打开并保存文件。在下载代码示例中,不会显示这些对话框,但愿您能够找到解决的方法。

图 17:已转换为 Smartphone 应用程序的 Pocket PC 应用程序

将所有按钮转换为菜单项并删除 OpenFileDialog 组件和 SaveFileDialog 组件后,只需创建并运行项目。如图 18 所示,现在相同的应用程序在 Smartphone 上运行。更改目标平台的操作为不可逆操作。虽然 Visual Studio 不会更改应用程序代码,但是将更改用户界面的布局。

图 18:现在在 Smartphone 上运行的简单文本编辑器

虽然您必须执行一些操作才能将应用程序改为不同的目标设备,但是在大多数情况下,工作量小于您为另一个目标设备创建整个用户界面所需的工作量。

可视窗体继承

在过去几年中,许多设备开发人员都请求了窗体继承的可视支持。在 Visual Studio .NET 2003 中,智能设备项目不支持可视窗体继承,尽管从另一个窗体继承一个窗体时您可以使用 C# 预处理器进行条件编译来提供相当有限的设计器支持(如果您很有创意)。相反,Visual Studio 2005 对可视窗体继承提供了完全设计器支持。这是一个优秀的新增功能,使您可以重用和扩展窗体,而无需不断地从头开始创建新窗体。

要显示可视窗体继承,请从您以后能够使用其派生其他窗体的简单基本窗体开始。虽然这不是必须的,但是对创建承载基本窗体的单独类库很有用。如果将基本窗体创建为项目的一部分,则该窗体不是在其他应用程序中重用的理想对象。此外,Visual Studio 中的窗体设计器必须能够读取基本窗体的元数据才能够显示从其派生的窗体,也就是说如果基本窗体与派生窗体包含在同一项目中,则必须进行额外的编译才能将基本窗体用于继承。在单独的库中创建基本窗体时,则无需执行此操作。

请务必提早考虑基本窗体,尤其应该了解哪些控件可以在继承的窗体中修改,哪些控件不可以修改。为了能够修改控件或控件的行为,必须确保将特定控件的访问修饰符设置为 private 之外的值。派生窗体中专用控件的属性无法更改。图 19 显示了以后可以在应用程序中使用的简单基本窗体。


图 19:存储在单独类库中的基本窗体

基本窗体包含一个专用按钮,单击该按钮时它将对每个派生窗体执行同一操作。由于此按钮是 private 的,因此在派生窗体中无法访问该按钮及其成员。基本窗体还包含一个受保护的按钮,具有一个作为虚方法实现的事件处理程序。和其他虚方法一样,事件处理程序也可以在各个派生窗体中被替换。因为第二个按钮是受保护的,所以在派生窗体中可以访问该按钮及其成员。您甚至可以决定在派生窗体中创建单独的单击事件处理程序,生成正在执行的基本窗体和派生窗体的事件处理程序。最后,基本窗体还包含一个受保护的标签,表明可以从所有派生窗体中访问该标签。请注意,图 19 中的基本窗体不包含菜单。默认情况下,设计器在每个新创建的窗体上都创建一个名为 mainMenu1 的菜单控件。可以在基本窗体中创建一个菜单,甚至可以在派生窗体中扩展该菜单。但是,在删除派生窗体上的菜单以及将基类中菜单的访问属性设置为 ProtectedPublic 时要谨慎。

基本窗体中包含能够在派生窗体间共享的一些常用功能,如下面的代码示例所示。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace BaseFormLibrary
{
public partial class BaseForm :Form
    {
public BaseForm()
        {
InitializeComponent();
        }

private void button1_Click(object sender, EventArgs e)
        {
label1.Text = "所有窗体上的相同操作";
        }

protected virtual void button2_Click(object sender, EventArgs e)
        {
label1.Text = "默认操作";
        }
    }
} 

BaseForm 方法包含两个按钮单击事件处理程序。button1_Click 处理程序是 private 方法,不能替换。如果将 button1_click 作为 private 方法实现,在单击 button1 时,将导致始终对每个派生窗体执行同一操作。但是,可以将 button1_Click 事件处理程序创建为受保护虚方法。在那种情况下,可以替换派生窗体中的 button1_Click 事件处理程序 — 使其具有对该特定窗体的特定功能。

button2_Click 事件处理程序的修饰符更加有趣。虽然窗体设计器生成的代码创建了访问修饰符设置为 privatebutton2_Click 事件处理程序,但是您可以在源文件中修改事件处理程序声明。通过将 button2_Click 事件处理程序声明为受保护虚方法,可以在派生窗体中替换该程序,从而导致单击 button2 时执行它们的事件处理程序。如果派生窗体中未替换 button2_Click 事件处理程序,将执行基本窗体的 button2_Click 事件处理程序。这正是从基类派生类时的预期行为。因为 button2 声明受保护,所以在以后的代码示例中更有可能不显示。Button2 声明受保护后,派生窗体可以访问其属性和事件,包括单击事件。因此,还可以向单击事件添加另一个事件处理程序,从而导致执行基本窗体的事件处理程序和派生窗体的事件处理程序。

要使用基本窗体,可以创建一个新的智能设备项目,然后向其中的 BaseFormLibrary 程序集添加引用。如果创建的新智能设备项目为 Device Application 类型,则设计器将自动向该项目添加窗体。此窗体是从 System.Windows.Forms.Form 派生的。要从基本窗体派生,请向窗体的源文件添加“BaseFormLibary”命名空间的 using 声明,然后只修改窗体源代码中窗体的声明,例如将

    public partial class Form1 :Form

更改为

    public partial class Form1 :BaseForm

时,将从以前创建的基本窗体中派生应用程序中的窗体。查看设计器视图中的窗体时,您将看到基类中所有控件以及专门为此特定窗体添加的控件,如图 20 所示。

图 20:包含基本窗体中的控件且具有完全设计器支持的派生窗体

派生窗体中继承了基本窗体中的控件。您能够认出继承的控件,因为控件的左上角会显示一个符号,如图 21 所示。

图 21:继承符号

您还能够认出中间按钮是基本窗体的 private 按钮(表明该按钮无法替换),因为该按钮的左上角还有一个锁符号。另外,因为中间按钮的属性在派生窗体中无法修改,所以其属性灰显。当然,可以向继承窗体中添加其他控件。

图 20 中的第一个按钮是添加到继承窗体中的新按钮。整个应用程序在下载代码示例中称为 VisualInheritance,包含两个窗体,这两个窗体均继承自基本窗体。主窗体将替换 Overridable action 按钮单击事件处理程序以显示第二个继承窗体。第二个窗体不替换 Overridable action 按钮的单击事件处理程序,所以单击该按钮时将仅执行基本窗体中提供的默认事件处理程序。下面的代码示例显示了应用程序主窗体的源代码。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using BaseFormLibrary;

namespace VisualInheritance
{
public partial class Form1 :BaseForm
    {
public Form1()
        {
InitializeComponent();
        }

protected override void button2_Click(object sender, EventArgs e)
        {
Form2 form = new Form2();
form.ShowDialog();
        }
    }
}

在上面的代码示例中,您应当注意以下几点。首先,通过查看类声明,您会发现该窗体是从 BaseForm 派生的。第二,替换了 button2 的事件处理程序。如果想用派生窗体中的新功能替换事件处理程序的功能,必须替换 button2_Click 事件处理程序,而不是向其附加新的事件处理程序。Form2 的代码甚至比您在下面的代码示例中所看到的更简单,仅包含窗体上新创建的 button3 的事件处理程序。如果单击 Form2 中的 button1 或 button2,将执行 BaseForm 中找到的事件处理程序,如下面的代码示例所示。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using BaseFormLibrary;

namespace VisualInheritance
{
public partial class Form2 :BaseForm
    {
public Form2()
        {
InitializeComponent();
        }

private void button3_Click(object sender, EventArgs e)
        {
label1.Text = "单击了本地按钮";
        }
    }
}

现在,您应当相当了解如何将可视窗体继承与 Windows 窗体设计器结合使用。当然,您可以将任何控件宿主在基本窗体中,只要您想在派生窗体中重用该控件。如果想在派生窗体中修改特定控件的行为,只需确保将控件的 Modifiers 属性更改为 protectedpublic。将 Modifiers 属性设置为 private 之外的值后,您甚至可以在派生窗体上隐藏控件、停靠控件或者调整控件的大小。

使用 Visual Studio 数据库工具

SQL erver 2005 Mobile Edition (SQL Mobile) 是 SQL Server CE 的新名称。如果您打算使用 SQL Mobile 数据库,Visual Studio 2005 将为您提供强大的功能。首先,您可以在 Visual Studio 中创建数据库。使用 Visual Studio 2005 之前的版本,只能以代码或使用设备上的 QueryAnalyzer 版本在本地设备上创建 SQL Server CE 数据库。通过 Visual Studio 2005,可以使用集成的 Visual Database Tools 创建数据库。还可以使用数据填充数据库并创建类型化数据集。

这一部分将概述如何使用 Visual Studio 2005 来处理数据。本文不详细介绍如何使用 SQL Mobile,只说明如何使用 Visual Studio 数据库工具。但是,纵观所有内容,您将了解如何在 Visual Studio 中创建 SQL Mobile 数据库,如何在简单的应用程序中使用该数据库,以及如何通过使用数据绑定创建类型化数据集来填充控件。

要在 Visual Studio 2005 中创建 SQL Mobile 数据库,可以使用 Visual Studio 2005 ServerExplorer(服务器资源管理器)。使用 ActiveSync 4.0 可以向现有项目添加新的 SQL Mobile 数据库,修改现有 SQL Mobile 数据库的架构,用数据填充 SQL Mobile 数据库,以及检查设备上已部署的数据库。

应该从新项目开始,创建一个在应用程序内使用的简单数据库。要创建的数据库是简单的 DVD 集合数据库。为举例起见,该数据库非常简单,仅包含 DVD 标题和类别。数据库由以下两个不同的表组成:DVD_Titles 和 DVD_Categories。使用 ServerExplorer(服务器资源管理器),可以在本地开发计算机上创建数据库。稍后,您将明白如何能够将数据库添加到项目中,以便该数据库随应用程序一起部署到设备。

在 Visual Studio 2005 中创建 SQL Mobile 数据库的方法有若干种。要通过向项目中添加新的数据连接来创建数据库,请右键单击 ServerExplorer(服务器资源管理器)中的 Data Connections(数据连接),然后选择 Add Connection(添加连接),如图 22 所示。

注意:如果 Visual Studio 2005 中未显示 Server Explorer(服务器资源管理器),请将其打开,方法是单击 View(视图),然后单击 Visual Studio 2005 菜单上的 ServerExplorer(服务器资源管理器)。

图 22:向智能设备项目中添加数据库连接

Visual Studio 显示一个用于添加连接的对话框,如图 23 中左侧图形所示。在此对话框中,可以附加到现有 SQL Mobile 数据库,也可以创建一个新的数据库。只要通过 ActiveSync 连接了设备,就可以在连接的设备上创建数据库,甚至可以附加到该设备上的现有数据库。如果要创建新的数据库,首先要在本地开发计算机上创建数据库,然后将其作为应用程序的一部分部署到设备。

图 23:使用 Add Connection(添加连接)对话框(左)和 Create New SQL Server 2005 Mobile Edition Database(创建新 SQL Server 2005 Mobile Edition 数据库)对话框(右)来创建新的本地 SQL Mobile 数据库

Add Connection(添加连接)对话框中,可以浏览现有数据库,也可以创建新数据库。单击 Create(创建)按钮后,将显示 Create New SQL Server 2005 Mobile Edition Database(创建新 SQL Server 2005 Mobile Edition 数据库)对话框。图 23 中,新数据库创建在桌面计算机的“我的文档”文件夹中。此外,在此对话框中,还可以加密数据库并添加密码以确保安全。在本文中,唯一要执行的操作是指定数据库名称 MyDVDCollection。单击 OK(确定)后,Visual Studio 2005 将创建数据库。可以通过单击 Test Connection(测试连接)按钮来验证到数据库的连接。

假设已有工作连接,下一步将在数据库中创建表。Server Explorer(服务器资源管理器)的 Data Connections(数据连接)下将显示新创建的数据库。如果展开该数据库,将找到 Tables(表)项。要创建新表,请右键单击 Tables(表),然后单击 Create Table(创建表),将显示 NewTable(新建表)对话框,如图 24 所示。


图 24:创建要添加到数据库中的表

可以创建要添加到数据库中的表,并设置特定表的列名、数据类型以及其他列特定属性。单击 OK(确定)后,新表即添加到数据库中。可以使用此对话框创建多个表。

到目前为止,您尚未为应用程序编写一行代码,却已使用 Visual Studio 的数据设计器工具创建了包含许多表的数据库。您可以在 ServerExplorer(服务器资源管理器)的 Visual Studio 中向新创建的数据库输入数据。要在表中输入数据,请在 ServerExplorer(服务器资源管理器)中选择并展开数据库,展开 Tables(表)节点,并打开 ServerExplorer(服务器资源管理器)中的各个表 [右键单击某个表,然后单击 Open(打开)],然后开始向表中添加数据,如图 25 所示。


图 25:向表中添加数据

要在应用程序中使用新创建的数据库,需要向应用程序中添加数据源。在 Visual Studio 2005 中,选择 Data(数据)菜单上的 Add New Data Source(添加新数据源)项。此操作将激活 Data Source Configuration Wizard(数据源配置向导),如图 26 所示。


图 26:通过使用 Data Source Configuration Wizard(数据源配置向导)来选择数据源类型

该向导中的第一页用于选择数据源类型。此数据源类型指明是从数据库、Web 服务还是从应用程序对象中检索数据。在图 26 中,数据源类型是数据库。接着,您需要选择数据连接。该向导将显示您可以选择的现有连接,如图 27 所示。您也可以在该向导中创建新的数据连接。如果需要创建新的数据连接,可以单击 New Connection(新建连接)按钮。您没有现有数据库或者首次使用特定数据库时,您将需要一个新连接。单击此按钮将打开 Add Connection(添加连接)对话框,如图 23 所示。因为您的开发计算机上已有现有数据库 MyDVDCollection,所以您可以在 Data Source Configuration Wizard(数据源配置向导)中选择该数据库。该向导将询问是否将数据库添加到当前项目中,如图 27 所示。如果单击 Yes(是),Visual Studio 2005 将采用该数据库的副本,将其添加到项目中,并在您从 Visual Studio 2005 中运行应用程序时一起部署该数据库和应用程序。


图 27:消息提示您决定是否将选择的数据库添加到连接中

Data Source Configuration Wizard(数据源配置向导)将创建类型化数据集,您可以使用该数据集将数据绑定到应用程序中的控件。也可以使用其他数据绑定选项。但是,本文未介绍那些选项。因此,在此示例中,您将使用数据集。数据集是包含数据表的对象,可暂时存储数据以供应用程序使用。创建数据集后,Visual Studio 将生成访问数据集中数据的代码,编辑数据集中数据的代码,以及在数据库和数据集间来回传输数据的代码。这将限制您需要编写的代码量。因为此应用程序仅显示数据库中已有的数据,所以您不需要编写任何代码。整个应用程序与生成的代码一起运行。

最后,您需要选择哪些数据库对象属于该向导将创建的数据集,如图 28 所示。


图 28:通过使用 Data Source Configuration Wizard(数据源配置向导)来选择数据库对象

要使用数据集中的所有数据,只需选择所有表。单击 Finish(完成)后,该向导将创建一个类型化数据集,您可以使用该数据集显示应用程序数据库中的数据,该应用程序使用数据绑定将各个数据项绑定到用户界面控件。将使用 MyDVDCollection 数据库的应用程序只显示了一列数据网格控件中可用的 DVD 标题,并使用父子关系显示相应类别。

您需要定义包含 DVD 标题的列表与包含数据集中类别的表之间的关系。同样,此操作您也可以使用 Visual Studio 2005 设计器完成,在本示例中是 DataSet Designer(数据集设计器),如图 29 所示。


图 29:DataSet Designer(数据集设计器)

打开 DataSet Designer(数据集设计器)的方法有两种:右键单击 Solution Explorer(解决方案资源管理器)中的 MyDVDCollectionDataSet.xsd 文件,然后选择 View Designer(视图设计器);或者右键单击 DataSources(数据源)窗格中显示的某一项,然后选择 Edit DataSet with Designer(使用设计器编辑数据集),如图 29 所示。如果 DataSources(数据源)窗格未显示,可以通过选择 Data(数据)菜单上的 Data Sources(数据源)将其打开。

在 DataSet Designer(数据集设计器)中,您将看到数据集所包含的表的可视化表示形式。要创建不同表之间的关系,请选择某个表中的一个字段(该字段将表连接在一起),然后将该字段拖到需要建立关系的另一个表中。执行此操作将显示 Relation(关系)对话框。在此对话框中,您可以指定与数据集中的表相关的字段。在此示例中,DVDTitles 是父表,DVDCategories 是子表,它们通过 DVD_CategoryID 字段连接在一起,如图 30 所示。打开 Relation(关系)对话框的另一种方法是:右键单击其中某个表,指向 Add(添加),然后单击 Relation(关系)。


图 30:定义两个表之间的关系

项目中有了数据库、为数据库创建了数据集并在数据集中定义了关系后,剩下的唯一要做的事情就是使数据显示在应用程序中。因为此示例非常简单,并且是为了显示帮助您创建使用 SQL Mobile 数据库的应用程序的 Visual Studio 设计器,所以用户界面本身没有什么特别之处。它仅包含数据网格控件(包含 DVD 标题)和文本框控件(显示每个 DVD 标题的相应类别)。在 DataSources(数据源)窗格中,可以为每列或整个表选择特定用户界面控件。要执行此操作,请单击要在窗体上显示的列或表。之后,可以通过单击向下箭头按钮来展开可用于显示数据的用户界面控件。然后,选择要在窗体上显示的用户界面控件,将其拖到窗体中,如图 31 所示。使用此方式添加到窗体中的控件会自动绑定到基础数据,因此您不需要编写任何代码来显示当前数据库中已有的数据的内容。


图 31:向应用程序中添加数据绑定控件

为了能够使用 DVDTitles 和 DVDCategories 之间的现有关系,可以从子表中拖出 DVD Category(DVD 类别)字段,子表显示在 DVDTitles 表的下面。编译和部署此应用程序时,数据库将随该应用程序部署到设备,您可以立即使用它,如图 32 所示。


图 32:完成的 DVD 集合应用程序

当然,如果您要添加新记录、删除或修改数据库中的记录,就需要添加一些代码 — 本文对这些操作不做说明。

结论

Visual Studio 2005 和 .NET Compact Framework 2.0 提供了许多即装即用的控件,这会立即提高您的工作效率。新用户界面设计器可以帮助您创建功能强大的用户界面。由于可以在设计器中使用外观,因此您会立即获得用户界面在实际设备上的真实外观。您甚至可以在纵向模式和横向模式(如果适用)中测试用户界面的外观,而无需编写一行代码。使用数据设计器可以在开发计算机上创建和维护 SQL Mobile 数据库,然后将它们部署到设备。本文提供了 Visual Studio 2005 关于设计工具的一些功能的示例。还有更多功能有待探索,希望您有足够的热情来亲自探索 Visual Studio 2005 的许多其他功能。

 

版权所有:UML软件工程组织