Visual Basic2010 入门经典(第6版)vb编程书


初识 Visual Basic 2010 本章主要内容: ● 事件驱动编程 ● Visual Basic 2010 的安装 ● Visual Basic 2010 集成开发环境(Integrated Development Environment,IDE) ● 创建简单的 Windows 程序 ● 使用集成帮助系统 用 Visual Basic 2010 和 Windows 7 进行编程是令人兴奋的。Windows 7 是微软最新发布的 Windows 操作系统,其中包含许多新功能,使得 Windows 编程非常有趣。Windows 用户界面和 Visual Basic 2010 中的重大改变,非常便于编写专业的 Windows 应用程序、Web 应用程序和 Web 服务。还 没有升级到 Windows 7?不必担心,Visual Basic 2010 也可为 Windows 的以前版本编写专业的应用 程序。 即使您以前从未编写过任何程序,通过本书的学习,也仍然可以快速掌握 Visual Basic 2010 编 程语言。我们将循序渐进地介绍 Visual Basic 2010 的基础知识,使您相信自己可以快速掌握它。 编写计算机程序非常类似于教小孩系鞋带。要想成功,必须找到给出指令的正确方式。使用 Visual Basic 2010 语言就可以告诉计算机该如何去做。但计算机像小孩子一样,只有把事情解释得非 常清楚,它才会明白。如果您以前从未编写过程序,可能学习起来会费劲些。然而,Visual Basic 2010 是一种易用的、但能解释某些复杂事件的语言。能理解最基础的知识固然很好,而 Visual Basic 2010 能把编程人员从编写复杂 Windows 程序的繁琐工作中解放出来,让他们集中精力去解决实际问题。 Visual Basic 2010 有助于创建运行在 Windows 操作系统(如 Windows 7、Windows Server 2008 和 Windows Mobile 6.1)下的应用程序。如果正在看这本书,那么你可能希望或需要创建这类程序。即 使您以前从未接触过编程,但通过阅读本书中“试一试”部分的内容,也会逐渐熟悉 Visual Basic 2010 语言的方方面面,以及 Microsoft .NET Framework 的基础知识。您会发现,其实它比我们想象的要 容易。在了解这一点之前,您将感受到可以轻松地使用 Visual Basic 2010 创建各种不同的程序。 Visual Basic 2010 也可用于创建 Web 应用程序和 Web 服务,以及可在 Pocket PC 或智能手机上 第 章 Visual Basic 2010 入门经典(第 6 版) 2 运行的移动应用程序。然而,在扩展到其他平台之前,您应该先学习 Windows 应用程序。 1.1 事件驱动编程 Windows 程序完全不同于过去的 MS-DOS 程序。DOS 程序自始至终遵循一种相对严格的路径。 虽然这不一定会限制程序的功能,但却限制了用户编程时采用的方法。编写 DOS 程序就像穿过一 条走廊,要到达终点,必须穿过整条走廊,清除途中可能遇到的所有障碍,而沿途只能打开一些特 定的门。 另一方面,Windows 提供了事件驱动编程的方法。这些事件包括:单击按钮、改变窗口大小、 改变文本框中的项等。我们编写的代码可以响应这些事件。用走廊的示例作类比就是:在 Windows 程序中,要到达走廊的终点,只需单击一下终点就行了,而不用考虑这个走廊。如果到达了终点, 却发现这不是我们想去的地方,那么可以直接奔向新的目的地,而不用返回起点。程序会对这个动 作作出反应,并且执行必要的动作来完成指定的任务。 Windows 编程的另一大优点是硬件的抽象化。这就是说,Windows 负责与硬件的通信。我们不 需要知道市场上每种激光打印机的内部工作原理,就可以输出结果;也不需要研究图形卡的原理就 可以编写游戏。Windows 提供了能与硬件制造商编写的驱动程序通信的通用例程,并封装了这个功 能。这就是为什么 Windows 如此成功的主要原因。这些通用例程称作 Windows API(应用编程接 口),.NET Framework 中的类负责与这些 API 通信。 在 1991 年 Visual Basic 1.0 问世以前,开发人员必须精通 C 和 C++编程以及 Windows 系统本身 的基本构建块(即 Windows API)。这一复杂性意味着,只有经过正规培训的专业人员才能编写出在 Windows 上运行的软件。Visual Basic 的问世改变了这一切,据估计,现在用 Visual Basic 语言编写 的代码量远高于使用其他任何一种语言编写的代码量。 Visual Basic 取消了用户界面(UI)繁琐的代码编写工作,使 Windows 编程焕然一新。它允许程序 员绘制自己的 UI,以便集中精力去解决一些业务问题。一旦创建了 UI,程序员就可向其中添加代 码来响应事件。 Visual Basic 从一开始就是可扩展的。第三方供应商很快看到了对开发人员有帮助的可复用模块 的市场。这些模块或控件原来称作 VBX(以其文件扩展名命名)。在 Visual Basic 5.0 之前,如果您不 喜欢某一按钮的使用方式,那么可以购买或自定义该按钮。但是,这些控件必须用 C 或 C++编写。 数据库访问实用程序就是这类控件中最早的一批。Visual Basic 5 版本中引入了 ActiveX 的概念,允 许开发人员创建自己的 ActiveX 控件。 Visual Basic 3.0 的出现又一次改变了编程世界。现在可以用 Visual Basic 来创建可供用户直接访 问的数据库应用程序(即所谓的前端应用程序),不再需要依赖第三方的控件。微软是使用数据访问 对象(DAO)来完成这项任务的,它允许程序员像操作用户界面那样来处理数据。 为了把开发人员吸引到 Windows 95 平台,Visual Basic 3.0 又升级为 Visual Basic 4.0 和 5.0。它 们使开发人员更容易编写代码,而这些代码又可供使用其他语言的开发人员使用。Visual Basic 6.0 集成了 ActiveX Data Objects(ADO),提供了一种访问数据库的全新方法。微软开发 ADO,是为了帮 助 Web 开发人员使用 Active Server Pages(ASP)来访问数据库。经过多年的改进后,Visual Basic 已经 在编程领域占据了主导地位。它可以帮助开发人员在数字化时代编写出健壮的、可维护的应用程序。 第 1 章 初识 Visual Basic 2010 3 2002 年 2 月随着 Visual Basic.NET 的发布,许多由来已久的局限性也被消除。过去,Visual Basic 被指责和诽谤为“玩具”语言,因为它没有提供像 C++和 Java 这类高级语言的全部功能。现在,微 软消除了这些限制,使 Visual Basic.NET 变成了一个功能非常强大的开发工具。Visual Basic 2003、 Visual Basic 2005、Visual Basic 2008 及最新版本 Visual Basic 2010 的发布继续保持了这一优势。Visual Basic.NET 编程语言的每次新发布都带来了许多新变化、新功能和新改进,使其成为各类程序员的 绝佳选择。 1.2 安装 Visual Basic 2010 Visual Basic 2010 有如下两个版本: ● 作为 Visual Studio 2010 的一部分,Visual Studio 2010 是一个套装语言软件,其中还包含 C#(读作 C-sharp)和Visual C++。Visual Studio 2010 产品系列包括 Visual Studio Professional Edition 或 Visual Studio Tools Team Edition。Team Edition 附带的工具可用于创建和管理 大型企业应用程序的开发。 ● Visual Basic 2010 Express 版本(学生和初学者的免费版本),包括 Visual Basic 2010 语言和 Visual Studio 2010 附带的一些工具和功能的简化版本。 这两个版本都可以用于创建在 Windows 平台下运行的应用程序,安装过程都非常简单。事实上, Visual Studio 安装程序可以非常智能地确定计算机需要安装什么内容。 下面的“试一试”部分基于 Visual Studio 2010 Professional Edition Beta 1 的安装过程。大多数 安装过程都十分简单,在多数环境下只需接受默认安装设置即可。不管安装的是哪一种版本,只要 接受默认的安装选项,安装过程都可顺利完成。 试一试: 安装 Visual Basic 2010 Visual Studio 2010 光盘有自动运行的功能,但如果在插入光盘后没有出现安装界面,就必须从 光盘的根目录下运行 setup.exe 文件进行安装。为此,应执行如下步骤: (1) 单击 Windows 桌面中的“开始”菜单(通常在屏幕的左下角),并选择“运行”命令或浏览 至光盘上的 Setup 程序。在“运行”对话框中,可单击“浏览”按钮,定位至光盘上的 setup.exe 程 序。然后单击“运行”对话框中的 OK 按钮启动安装程序。安装程序初始化后,会出现如图 1-1 所 示的界面。 (2) 该对话框显示了安装的顺序。为了使安装过程正常进行,Visual Studio 2010 需要根据操作 系统的不同(如 Windows XP Service Pack 3)来安装更新组件。如果计算机未安装这些更新组件,安装 程序会提示安装它们。应首先安装这些更新组件,然后返回 Visual Studio 2010 安装程序。您需要安 装的更新组件可能不同于图 1-1 中第 3 项列出的 Service Releases。安装程序的第 1 步是安装 Visual Studio 2010,因此单击图 1-1 中所示的 Install Microsoft Visual Studio 2010 链接。 Visual Basic 2010 入门经典(第 6 版) 4 图 1-1 (3) 安装过程的下一步是询问是否想把 Visual Studio 2010 安装的体验信息发给微软。这可以帮 助简化 Visual Studio 未来版本的安装过程,且不会发送个人信息。在选择或取消选择以表明是否发 送这一消息的复选框后,可单击界面中的 Next 按钮。 (4) 安装过程的第 3 步是是否同意许可协议。在阅读完许可协议,并选中接受许可条款的复选 后,单击 Next 按钮,继续安装。 (5) 与大多数安装程序一样,此时会显示一个安装选项列表,如图 1-2 所示。在此可以安装.NET Development Environment,它是使用本书所需的选项,还可以安装 C++ Development Environment。 选择了.NET Development Environment 安装选项后,单击 Install 按钮安装该功能。 (6) 要安装的第一个组件是 Microsoft .NET Framework 4.0 和 C++运行时组件。在安装此组件的 过程中,需要重启计算机。在重启计算机后,再次登录,会继续安装程序。 (7) 安装完成后,会显示一个对话框,说明安装情况。该对话框显示了安装过程中遇到的所有 问题,并提示用最新的安全补丁更新计算机,链接在 Windows Update 提示中提供。在查看完安装情 况后,单击 Finish 按钮进入下一步。 (8) 如果选择将安装体验信息发送给微软,下一步将是发送体验信息的对话框。该对话框不需 要用户做任何工作,在完成时它会自动关闭。下一对话框是图 1-1 所示的对话框,并启用了安装产 品文档的选项。单击 Install Product Documentation 链接安装 MSDN 库。 (9) 安装 MSDN 库的第 1 步是选择是否给微软发送体验信息。作出适当的选择,然后单击 Next 按钮继续。同样,建议最好发送体验信息,以简化未来 MSDN 库的安装。 注意:Windows Vista 和 Windows 7 的用户会注意到, 系统提示您安装程序需要运 行,您需要授权让安装程序继续。在安装程序继续运行后,您可以放松一下。 根据安 装功能的多少和计算机的速度,安装需要 20 分钟左右。 第 1 章 初识 Visual Basic 2010 5 图 1-2 (10) 接着阅读和接受许可协议。选中接受许可协议的复选框后,单击 Next 按钮继续。 (11) 和 Visual Studio 2010 的安装一样,MSDN 库的安装也可以选择最适合自己需求的选项。如 果选择完整的 Visual Studio 2010 产品集,那么将完全安装 MSDN 库。在选择了安装选项后,单击 Install 按钮开始安装。 (12) 在安装好 MSDN 文档后,就会出现一个说明安装情况的对话框。单击 Finish 按钮回到最 初的安装界面。此时 Check for Service Releases 选项就被激活了。 完成了更新过程后,就可以使用 Visual Studio 2010 了。现在让我们畅游 Visual Basic 2010 世界吧! 1.3 Visual Basic 2010 集成开发环境 用 Visual Basic.NET 语言编写应用程序并不需要 Visual Basic 2010,.NET Framework 具备运行 Visual Basic.NET 代码的能力。所以,使用像 Notepad 这类文本编辑器就可以编写所有的 Visual Basic.NET 代码。可以用鞋子充当锤子来敲钉子,但灵巧的气动钉枪要有效得多。同样,到目前为 止,编写 Visual Basic.NET 代码最简单的方法是使用 Visual Studio 2010 集成开发环境(IDE),即运行 Visual Basic 2010 时出现的窗口、对话框等。IDE 提供了普通文本编辑器没有的丰富功能,例如代码 检查、已完成应用程序的可视化表示,以及一个显示构成项目的所有文件的浏览器。 注意:最好选择 Check for Service Releases 选项,因为微软做了大量的工作, 可以 通过 Internet 更新软件。更新的内容包括补充的文档以及错误修正。 也可以通过 Service Pack CD 或 Internet 安装更新程序。显然,选择 Internet 方式的话需要有一个活动的网 络连接。如果更新的内容比较多,强烈建议采用快速的网络连接。 Visual Basic 2010 入门经典(第 6 版) 6 1.3.1 初始化开发环境 IDE 集成了一组工具,使开发软件变得更为简便。启动 Visual Studio 2010,如果使用默认安装 选项,就应从 Windows 的“开始”菜单中选择“所有程序”| Microsoft Visual Studio 2010 | Microsoft Visual Studio 2010。在显示一个闪屏后,会马上出现 Choose Default Environment Settings 对话框。选 择 Visual Basic Development Settings 选项,然后单击 Start Visual Studio。Visual Studio 根据所选的设 置配置环境后,会显示 Microsoft Development Environment,如图 1-3 所示。 图 1-3 1.3.2 菜单 至此,您可能希望开始编写代码。但请等一下,我们将从菜单和工具栏开始 Visual Basic 2010 探险之旅。实际上,这些菜单和工具栏与其他 Windows 应用程序中的菜单和工具栏没有太大的区别 (但与 Office 2007 的功能区和某些较新的 Windows 应用程序不同)。 Visual Studio 2010 的菜单是动态的,可以根据需要添加或删除菜单项。在浏览空的 IDE 时,菜 单栏中只有 File、Edit、View、Tools、Test、Window 和 Help 菜单。但是,当开始一个新项目时,就 会显示 Visual Studio 2010 的完整菜单,如图 1-4 所示。 图 1-4 其实没有必要详细介绍每个菜单,在学习本书的过程中,您会逐渐熟悉它们。下面简述每个菜 单的功能: ● File:大部分软件程序都有 File 菜单。它已经成为一个标准,通常可从中找到退出应用程序 的选项。这个菜单还有打开、关闭单个文件和整个项目的选项。 ● Edit:Edit 菜单提供的选项有 Undo、Redo、Cut、Copy、Paste 和 Delete。 ● View:通 过 View 菜单可以快速访问 IDE 中的窗格,如 Solution Explorer、Properties、Output 和 Toolbox(工具箱)窗格等。 第 1 章 初识 Visual Basic 2010 7 ● Project:Project 菜单允许在应用程序中添加各种文件,如窗体和类。 ● Build:当编写完应用程序后,希望在不使用 Visual Basic 2010 环境的情况下运行它时(直接 从 Windows 的“开始”菜单运行,像其他应用程序(如 Word 或 Access)那样),就应使用 Build 菜单。 ● Debug:通过 Debug 菜单可以在 Visual Basic 2010 IDE 中启动和停止运行应用程序。通过该 菜单也可以访问 Visual Studio 2010 调试器。调试器允许单步执行代码,以观察它的执行 情况。 ● Data:通过 Data 菜单可以使用数据库中的信息。该菜单允许查看、添加数据源及预览数据。 第 15 章和第 16 章将介绍如何使用数据库。 ● Tools:Tools 菜单有配置 Visual Studio 2010 IDE 的命令,以及到其他已安装的外部工具的 链接。 ● Test:Test 菜单可以创建和查看应用程序的单元测试,以在不同场景中运用源代码。 ● Window:Window 菜单也是标准的。它允许像 Word 和 Excel 那样同时打开多个窗口。通过 这个菜单中的命令可以在 IDE 中切换窗口。 ● Help:通过 Help 菜单可以访问 Visual Studio 2010 文档。访问该文档有多种方式,如通过帮 助目录、索引或搜索。Help 菜单中的选项还可以连接到微软的 Web 站点上,从而获取更新 内容或报告问题。 1.3.3 工具栏 IDE 中有许多工具栏,包括 Formatting、Image Editor 和 Text Editor,可通过 View | Toolbars 菜单 项在 IDE 中添加或删除这些工具栏。每个工具栏都提供了对常用命令的快速访问,而不必选择相应 的菜单项。例如,单击图 1-5 所示的默认工具栏(标准工具栏)最左边的图标(New Project),就相当于 选择了 File | New | Project。 图 1-5 在这个工具栏中,相关的选项被分组并用竖线分开。 ● 开始的 6 个图标可访问常用项目和文件操作选项,这些选项也可以通过 File 和 Project 菜单 得到,如打开和保存文件。 ● 接下来的一组图标用于编辑,包括 Cut、Copy 和 Paste。下一图标用于查找和替换。 ● 第 3 组图标用于注释和取消注释某段代码。在调试时,如果需要注释一段代码,以确定不 执行这些代码会有什么结果,就可以使用这组图标。 ● 第 4 组图标用于执行撤销与恢复操作,以及导航代码。 ● 第 5 组图标用于启动(绿色的三角形)、暂停和停止运行应用程序。这组图标中的后 3 个分别 可以单步执行代码、跳过整块代码和跳出过程。第 10 章将深入介绍这些图标。 Visual Basic 2010 入门经典(第 6 版) 8 ● 最后一组图标提供到 Solution Explorer、Properties、Object Browser、Toolbox、Error List、 Extension Manager 和 Immediate 窗格的快速链接。如果某个窗格关闭了,单击相应的图标就 会打开那个窗格。 如果忘了某个图标的用途,可以把鼠标指针悬停在它上面,就会出现一个工具提示,显示这个 工具栏选项的名称。 单击 View 菜单,再选择相应的窗格,就可以查看这个窗格,但此时这些窗格都是空的,因此 没有太大的意义。了解 IDE 功能的最好方法是用它来编写一些代码。 1.4 创建简单的应用程序 为了结束 IDE 发现之旅,下面创建一个项目,前面介绍的图 1-3 所示的窗口内会有一些有趣的 内容。 试一试: 创建 Hello User 项目 Hello User.zip 下面的“试一试”练习将创建一个非常简单的应用程序 Hello User,该程序允许用户输入一个 人名,并在消息框中显示对这个人的问候信息。 (1) 单击工具栏上的 New Project 按钮。 (2) 在 New Project 对话框中,选择左侧 Installed Templates 树状列表中的 Visual Basic,再选择 它下面的Windows。右边的Templates面板将显示所选项目类型的所有可用模板。选择Windows Forms Application 模板。最后,在 Name 文本框中输入 Hello User 并单击 OK 按钮。New Project 对话框如 图 1-6 所示。 图 1-6 第 1 章 初识 Visual Basic 2010 9 Visual Studio 2010 允许将应用程序面向特定版本的.NET Framework。New Project 对话框中 Templates 面板顶部的组合框中默认选择了.NET Framework 4.0,也可以将应用程序面向.NET Framework 的 3.5 版、3.0 版,甚至 2.0 版。 IDE 将创建一个空的 Windows 应用程序。目前,Hello User 程序只包含一个空窗口 Windows Form(有时只是一个窗体),其默认名称为 Form1.vb,如图 1-7 所示。 图 1-7 无论何时,不管是由 Visual Studio 2010 创建一个新文件作为项目创建过程的一部分,还是由用 户创建一个新文件,都会用一个名称来描述这个文件(此例中是 Form),并在其后加上一个数字。 Visual Studio 2010 集成开发环境中的窗格 现在,IDE 中的各种窗格开始一一亮相了。在继续上面的示例之前,先简要介绍一下这些窗格。 下面介绍最常用的窗格: ● Toolbox:Toolbox 包括可添加到应用程序的可重用控件和组件。其中包括按钮、数据连接 器、可购买也可自行开发的定制控件。 ● Design:许多操作都是在 Design 窗格中进行的。在 Design 窗格中,可以绘制用户界面。这 个窗格有时也称为设计器。 ● Solution Explorer:Solution Explorer 窗格可分级显示解决方案。一个解决方案可以包括多个 项目,而一个项目可以包含解决某个特定问题的窗体、类、模块和组件。 注意:如果某个窗格在屏幕上未出现,可以使用 View 菜单显示它。 如果对某个 窗格的位置不满意,可以单击该窗格的标题栏 (顶部的蓝条 )并将其拖到一个新的位置 。 IDE 中的窗格可以浮动,也可停靠 (正如图 1-7 中所示 )。 Visual Basic 2010 入门经典(第 6 版) 10 ● Properties:Properties 窗格显示了所选对象的可用属性。虽然可以在代码中设置这些属性, 但有时在设计应用程序时设置它们会更容易,例如,在窗体上绘制控件。注意 File Name 属 性的值为 Form1.vb,这是窗体代码和布局信息的物理文件名。 试一试: 继续创建 Hello User 项目 Hello User.zip 接下来,对窗体命名并设置一些属性。 (1) 把窗体的名称改为更能反映这个应用程序的名称。在 Solution Explorer 窗格中单击 Form1.vb,接着在 Properties 窗格中把 File Name 属性的值从 Form1.vb 改为 HelloUser.vb,然后按回 车键,如图 1-8 所示。在修改属性时,必须按下回车键或单击另一属性,才能使该属性设置发挥作用。 (2) 注意,此时 Solution Explorer 中窗体的文件名也更新为 HelloUser.vb。 (3) 单击 Design 窗格中显示的窗体。Properties 窗格就会显示窗体的 Form 属性(取代了刚才的 File 属性)。 Properties 窗格十分便于设置控件的属性。属性是某个对象的内部数据集,它们常常描述了对象 的外观或行为。在图 1-9 中,属性按字母顺序显示,属性也可以按 Accessibility、Appearance、Behavior、 Data、Design、Focus、Layout、Misc 和 Window Style 类别来显示。 (4) 现在,窗体的标题(显示在顶部,即 Text 属性)是 Form1,它的描述性不强,下面修改它,使 之反映这个应用程序的作用。选择Properties窗格中的Text 属性,将它的值改为Hello from Visual Basic 2010,并按下回车键。注意,这时窗体的标题已更新。 图 1-8 图 1-9 注意:Properties 窗格已经有了很大的不同,原因是同一文件有两个不同的视图 。 当窗体的名称在 Solution Explorer 窗格中高亮显示时, Properties 窗格显示的是窗体的 物理文件属性。当窗体的名称在 Design 窗格中高亮显示时, Properties 窗格显示的是 窗体的可视化属性和逻辑属性。 第 1 章 初识 Visual Basic 2010 11 (5) 现在就完成了应用程序的创建。单击 Visual Studio 2010 工具栏上的 Start 按钮(绿色三角形), 运行该应用程序。在阅读本书时,如果碰到“运行项目”或“启动项目”,就是指单击 Start 按钮。 此时会显示一个名为 Hello from Visual Basic 2010 的空窗口。 一切都非常简单,但此刻这个小程序什么也不能做,下面给它添加一些交互功能。为此,先在 窗体中添加一些控件:一个标签、一个文本框和两个按钮。在这些添加操作中,可以看出工具箱是 如何使添加功能变得非常简便的。此时为什么不编写一些代码呢?Visual Basic 2010 的一个优点是它 可以完成应用程序中的许多工作,却不用编写任何代码。当然,代码依旧存在,只是在后台,它们 是用 Visual Basic 2010 编写的。 1.4.1 工具箱 要访问工具箱,可以选择 View | Toolbox 菜单项,也可以单击 Standard 菜单栏中的 Toolbox 图标, 还可以按下 Ctrl+Alt+X 组合键。Toolbox 标签显示在 IDE 的左边,把鼠标指针停在这个标签上,就 会使工具箱窗格显示出来,并覆盖部分窗体。 工具箱包含以节点视图形式出现的各种控件和组件,它们都可以放到窗体中,方法是选择文本 框、按钮、单选按钮和组合框等控件,将它们拖放到窗体中。Hello User 应用程序只使用 Common Controls 节点中的控件。图 1-10 列出了 Windows Forms 应用程序中的一些常用控件。 图 1-10 注意:如果找不到属性,可单击 Properties 窗格顶部工具栏中的 AZ 按钮, 使属性 按名称而不是按类别排序。 Visual Basic 2010 入门经典(第 6 版) 12 可以按任意顺序将控件添加到窗体中,所以,在文本框控件后添加标签控件,或者在标签控件 前添加按钮都是可行的。 试一试: 向 Hello User 应用程序添加控件 Hello User.zip (1) 先停止运行该项目,因为下面要在窗体中添加一些控件。停止项目最简单的方法是单击窗 体右上角的“关闭”(X)按钮,或者单击 IDE 中的蓝色方块(如果把鼠标指针悬停在它上面,就会显 示工具提示“Stop Debugging”)。 (2) 给窗体添加一个 Label 控件。单击工具箱中的 Label,将其拖放到窗体设计器的合适位置(要 在窗体上添加控件,还可以在工具箱中双击所需的控件;或者在工具箱中单击所需的控件,然后将 其拖放到窗体上)。 (3) 如果刚才拖放的 Label 控件不在希望的位置,或者大小不合适,不必担心。将该控件拖放到 窗体中后,就可以调整它的尺寸,或者在窗体中移动它。图 1-11 所示为 Label 控件拖放到窗体中后 的样子。要移动它,可以单击该控件,将它拖到需要的位置。Label 控件会根据 Text 属性的设置自 动调整尺寸。 (4) 在窗体中绘制好一个控件后,就可以为其设定名称和要显示的文本。Designer 窗格右边的 Properties 窗格现在已经变为 Label1,说明当前正在查看它的属性。在 Properties 窗格中,将新标签 的 Text 属性设置为 Enter Your Name。注意,只有按下回车键或单击另一个属性后,窗体上的标签才 会根据 Text 属性的设置值自动调整尺寸。现在将它的 Name 属性设置为 lblName。 (5) 在标签的下面添加一个文本框,以便向其中输入人名。重复添加标签的过程,但这次是从 工具箱中选择 TextBox 控件。一旦把这个控件拖放(或双击)到合适的位置,就可以使用 Properties 窗 格,将它的 Name 属性设置为 txtName,如图 1-12 所示。注意控件左边和右边的尺寸调整句柄,它 们可以水平地调整文本框的尺寸。 图 1-11 图 1-12 (6) 在窗体的左下角,添加一个 Button 控件,方法与添加标签和文本框的方法完全相同。将它 的 Name 属性设置为 btnOK,Text 属性设置为&OK。现在窗体应如图 1-13 所示。 按钮的 Text 属性中使用了&符号,以创建键盘快捷方式(即热键)。&符号后面的字母会加上下划 第 1 章 初识 Visual Basic 2010 13 线,如图 1-13 所示,说明除了使用鼠标外,还可以同时按 Alt 和这个字母键来选择这个按钮(在一些配置中,在用户按 下 Alt 键之前,不会给该字母添加下划线)。在这个示例中, 按 Alt+O 键与单击 OK 按钮的效果相同,这一切都不需要编 写任何代码。 (7) 将 Button 控件从工具箱拖放到窗体上,在窗体的右 下角添加第 2 个按钮。注意仔细观察窗体右下角,会看到一 条蓝线,如图 1-14 所示。通过该蓝线可以将新加的 Button 控件与窗体上已有的 Button 控件对齐。根据新控件的位置, 该蓝线可以将控件彼此左、右、上或下对齐。这条蓝线还可 以使控件和窗体之间的边距保持一致。把该按钮的 Name 属性设置为 btnExit,Text 属性设置为 E&xit。 这时,窗体将如图 1-15 所示。 图 1-14 图 1-15 在完成这个示例应用程序之前,先简要探讨一些应遵循的编码规则。 1.4.2 改进型匈牙利表示法 读者可能已经注意到,控件的名称似乎有点古怪。每个名称的前面都要加上一个简写的标识符 来描述此控件的类型。这样一来,在浏览代码时,就很容易知道所使用控件的类型。例如,把一个 控件简单地命名为 Name,而不带上 lbl 或 txt 前缀,就不清楚该控件是一个可输入名称的文本框, 还是一个可显示名称的标签。在前面的示例中,如果把标签命名为 Name1,把文本框命名为 Name2, 将立刻陷入困境。如果在一两个月之后想对这个程序做些修改,又会怎样呢? 在与其他开发人员合作时,采用一致的编码样式是非常重要的。在用许多语言开发应用程序时, 控件名称最常用的样式是由 Charles Simonyi 博士提出的,他在加入微软之前在 Xerox Palo Alto 研究 中心(XPARC)工作。他提出的简短前缀记忆法可以让程序员轻而易举地识别出变量包含的信息类型。 因为 Simonyi 博士是匈牙利人,而且该前缀使名称看起来有点像外来词,所以这种命名方式就称为 匈牙利表示法。最初的表示法用于 C 和 C++开发,Visual Basic 2010 中的表示法就称为改进型匈牙 利表示法。表 1-1 列出了本书常用的一些前缀。 图 1-13 Visual Basic 2010 入门经典(第 6 版) 14 表 1-1 Visual Basic 2010 中常用的前缀 控 件 前 缀 Button(按钮) btn ComboBox(组合框) cbo CheckBox(复选框) chk Label(标签) lbl ListBox(列表框) lst MainMenu(主菜单) mnu RadioButton(单选按钮) rdb PictureBox(图形框) pic TextBox(文本框) txt 在查看别人编写的代码或自己数月前编写的代码时,使用匈牙利表示法将非常节省时间,但最 重要的是它使控件的命名保持一致。当开始编写代码时,选择一个命名约定。在 Visual Basic 2010 中,推荐使用标准的改进型匈牙利表示法,但并不是必须这么做。一旦选择了命名约定,就一直使 用它。当修改别人的代码时,就使用他们的命名约定。如果一个项目始终遵循标准的命名规则,维 护应用程序时就可以节省大量时间。现在再回到应用程序,并编写一些代码。 1.4.3 代码编辑器 前面定义了 HelloUser 窗体,接下来要添加一些代码,让它完成一些有意义的操作。在窗体中 添加控件非常简单,给屏幕上的元素添加功能也不困难。要为控件添加代码,只要双击控件,打开 主窗口中的代码编辑器,如图 1-16 所示。 图 1-16 注意,在主窗口中创建了另一个标签,因此现在有 Design 标签和 Code 标签,它们都包含了当 前窗体的名称。前面在 Design 标签的窗体上绘制了一些控件,下面在 Code 标签的窗体上编写代码。 要注意的是,Visual Studio 2010 已为代码创建了一个文件。窗体的可视化定义及后台代码都放在单 独的文件中,即 HelloUser.Designer.vb 和 HelloUser.vb。这也是为什么使用 Visual Basic 2010 建立应 用程序会如此灵活简单的原因。使用 Design 视图可以可视化地布局应用程序,使用 Code 视图可以 添加部分代码,实现所需的功能。 代码编辑器的顶部有两个组合框,它们提供了到达代码各个部分的快捷方式。左边是 Class Name 组合框,如果展开该组合框,就会列出窗体中的所有对象。右边是 Method Name 组合框。打开该组 第 1 章 初识 Visual Basic 2010 15 合框,会显示 Class Name 组合框中所选对象的所有已定义的函数和事件。假如在这个窗体中有许多 代码,这两个组合框可以很快定位到我们希望查看的区域—— 跳转到所选的代码区域。然而,因为 该项目所有的代码都在窗口中,所以不必担心找不到它们。 试一试: 向 Hello User 项目添加代码 Hello User.zip (1) 在添加必要的代码之前,先单击 Design 标签,再次显示窗体,然后双击 OK 按钮。代码窗 口将再次打开,并显示如下代码,这只是按钮的 Click 事件的“外壳”。我们可以在此输入单击按钮 时希望运行的代码。这段代码叫做事件处理程序,有时也称为事件过程。 Private Sub btnOK_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnOK.Click End Sub 由于出版时受印刷限制,不可能把 Sub 声明放在一行中。Visual Basic 2010 允许使用下划线符 号(_)把代码行断开,以表示这是前一行的续行,而下划线前必须有空格,下一行中代码前的所有空 格可忽略。 Sub 是一个关键字。在编程术语中,关键字是一种特殊的词,用来让 Visual Basic 2010 完成一 些特殊的操作。在本例中,Sub 告诉 Visual Basic 2010 这是一个子例程(一个不返回值的过程)。在 Private Sub 和 End Sub 之间输入的代码构成了 OK 按钮的事件过程。 (2) 在这个过程中添加下述突出显示的代码: Private Sub btnOK_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnOK.Click 'Display a message box greeting to the user MessageBox.Show("Hello, " & txtName.Text & _ "! Welcome to Visual Basic 2010.", _ "Hello User Message") End Sub 在本书中,有一些代码应输入到程序中。通常,我们会提示应在什么位置输入这些代码,并解 释其作用。突出显示的代码是应输入到程序中的代码。 (3) 添加完代码后,返回 Design 标签,并双击 Exit 按钮。在 btnExit_Click 事件过程中添加下面 突出显示的代码。 Private Sub btnExit_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnExit.Click 'End the program and close the form Me.Close() End Sub (4) 代码添加完后,运行这个应用程序。首先,为了保存工作成果,在菜单栏中选择 File | Save All 或者单击工具栏上的 Save All 按钮,打开如图 1-17 所示的 Save Project 对话框,输入名称和位置。 Visual Basic 2010 入门经典(第 6 版) 16 默认情况下,项目保存在以项目名命名的文件夹中,本例中是 Hello User。因为这是解决方案中 唯一的项目,所以不需要为与项目同名的解决方案创建单独的文件夹,因此不必选中 Create directory for solution 复选框。 图 1-17 (5) 单击工具栏上的 Start 按钮,Visual Studio 2010 就会编译这些代码。编译过程就是提取刚才 编写的 Visual Basic 2010 源代码,把它转换成机器能理解的形式。编译完成后,Visual Studio 2010 将运行(也叫执行)程序,并显示运行结果。 如果 Visual Basic 2010 遇到错误,就会把错误作为任务显示在 Error List 窗格中。双击一个任务, 就会显示有错误的代码行。第 3 章将详细讨论如何调试代码中的错误。 (6) 当应用程序载入时,会显示主窗体。输入一个名称并单击 OK 按钮(或按 Alt+O 组合键),如 图 1-18 所示。 这时就出现了如图 1-19 所示的消息框,内容是欢迎 Wendy 进入 Visual Basic 2010 世界,Wendy 是刚才输入到窗体文本框中的人名。 图 1-18 图 1-19 (7) 单击 OK 按钮,关闭消息框后,再单击窗体中的 Exit 按钮,就关闭了应用程序,返回到 Visual Basic 2010 IDE。 示例说明 为 OK 按钮的 Click 事件添加的代码提取了在文本框中输入的名字,并把它作为在如图 1-19 所 示的对话框中显示的消息的一部分。 在这个过程中输入的第一行文本('Display a message box greeting to the user)实际上是一个注释。 这行文本仅由编写或维护代码的编程人员阅读,计算机并不理会。Visual Basic 2010 中的注释以一个 第 1 章 初识 Visual Basic 2010 17 单引号(')开头,其后的所有内容都被编译器看作注释而忽略。注释详见第 3 章。 MessageBox.Show 方法显示一个消息框,它可以接收各种参数。在本示例的代码中,其参数是 要在消息框中显示的字符串文本。该文本连接了括在引号中的文本所定义的字符串常量。将多个字 符串连接成一个长字符串应使用宏字符(&)来实现。 在下面的代码中,连接了一个字符串常量"Hello,"、在 txtName 文本框控件的 Text 属性中包含的 值,以及字符串常量"! Welcome to Visual Basic 2010."。传递给 MessageBox.Show 方法的第二个参数 是用在消息框标题栏中的标题。 最后,在代码行末尾使用的下划线字符( _ )允许把代码放在多个行中。这告诉编译器参数的剩 余代码在下一行中。在创建较长的字符串时,这是很有用的,因为它允许在代码编辑器中查看全部 代码,而无需向右滚动代码编辑窗口。 Private Sub btnOK_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnOK.Click 'Display a message box greeting to the user MessageBox.Show("Hello, " & txtName.Text & _ "! Welcome to Visual Basic 2010.", _ "Hello User Message") End Sub 下一个要添加代码的过程是 Exit 按钮的 Click 事件。这里仅输入了代码:Me.Close()。Me 关键 字表示窗体本身。窗体的 Close 方法会关闭窗体,并释放与该窗体相关的所有资源,然后结束程序。 Private Sub btnExit_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnExit.Click 'End the program and close the form Me.Close() End Sub 1.5 使用帮助系统 Visual Basic 2010 的帮助系统在原有版本的基础 上进行了改进。随着对 Visual Basic 2010 的进一步学 习,用户会越来越熟悉这个帮助系统。为了帮助用户 快速搜索到信息,现在概述一下这个帮助系统。 Help 菜单如图 1-20 所示。 这个菜单包含的项比一般的 Windows 应用程序 多。主要的原因是文档太大,几乎没人能把这些信息 全部记住。所幸的是,这并不是个问题,因为总是可 以简便而迅捷地使用帮助系统,或者在论坛上搜索有 经验的完成过类似编程任务的人。就把它当作您大脑 的安全网络吧。 在代码编辑器中单击某个关键字或按下 F1 键,也可以快速访问特定主题的帮助文档。 图 1-20 Visual Basic 2010 入门经典(第 6 版) 18 1.6 小结 使用 Visual Basic 2010 创建基本的应用程序并不很难。本章介绍了 IDE,以及如何运用它快速 开发软件。利用工具箱可在窗体上添加控件并快速简便地设计用户界面;Properties 窗格能迅速配置 这些控件;Solution Explorer 提供了一个概览图,列出了构成项目的所有文件。此外我们还编写了少 量的代码。 后面的章节将详细介绍如何编写代码。在进一步介绍 Visual Basic 2010 之前,第 2 章将介绍.NET Framework。这个架构使所有的.NET 语言都非常易学易用,并可以交互操作。 表 1-2 对本章讨论的主题进行了总结。 表 1-2 本章主题 主 题 概 念 集成开发环境(IDE) 如何在 IDE 中创建项目,如何在设计视图和代码视图之间切换,如何运行和调试项目 在设计器中为窗体添加控件 如何使用工具箱把控件拖放到窗体上,如何在窗体上移动控件、调整控件的大小 设置控件的属性 如何显示控件中的文本,给控件指定有意义的名称 在代码窗口中为窗体添加代码 如何添加代码来控制程序的行为 1.7 练习 创建一个 Windows 应用程序,使其包含一个 Textbox 控件和一个 Button 控件,当用户单击按钮 时,该程序会显示文本框中的内容。 Exercise 1.zip 提示: 每章后面的练习题答案都可以在附录 A 中找到。 流 程 控 制 本章主要内容: ● If 语句 ● Select Case 语句 ● For 循环和 Do 循环 第 3 章讨论了算法及其在程序中的作用。本章将介绍如何通过算法进行流程控制,这样就可以 作出决策,例如“假设 X 是这种情况,就执行 A,否则执行 B”。这种作出决策的能力称为分支,我 们还将介绍如何对一段代码重复执行指定的次数,或者当符合某一条件时重复执行一段代码(即循环)。 4.1 作出决策 算法通常包括决策。事实上,正是这种作出决策的能力使计算机能够圆满地完成任务。当编写 代码时,可以作出两种决策。第 1 种用来确定当前处理的是哪一部分算法或哪一部分算法可以解决 问题。例如,假设有一个 10 人的列表,需要编写一段代码,依次向他们每人发一份邮件。为此,在 发送完邮件后,需要确定“完成了吗?”。假如完成了,就退出算法;否则就继续给列表中的下一个 人发邮件。另外,在打开一个文件时,需要询问“文件存在吗?”,此时,必须考虑两种可能性。 第 2 种决策用于根据一个或多个事实执行算法的不同部分。仍考虑前面的 10 人列表,我们想给 其中拥有计算机的人发邮件,给没有计算机的人打电话。在执行这项任务时,要根据他们是否拥有 计算机来作出决策。 这两种决策是以同样的方式作出的,与这两种决策使用的多少无关。下面介绍如何使用 If 语句 作出决策。 第 章 Visual Basic 2010 入门经典(第 6 版) 70 4.2 If 语句 在 Visual Basic 2010 程序中,作出决策最简单的方法就是使用 If…Then 语句。下面的示例中将 介绍该语句。 试一试: 简单的 If…Then 语句 Simple If.zip 下面看看 If…Then 语句。 (1) 创建一个名为 Simple If 的 Windows Forms Application 项目,添加一个按钮,设置其 Name 属性为 btnIf,将它的 Text 属性改为 If。双击此按钮,并添加如下突出显示的代码: Private Sub btnIf_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnIf.Click 'Declare and set a variable Dim intNumber As Integer = 27 'Here's where you make a decision, 'and tell the user what happened If intNumber = 27 Then MessageBox.Show("'intNumber' is, indeed, 27!", "Simple If") End If End Sub (2) 保存该项目,然后运行它。单击 If 按钮,会得到如图 4-1 所示的 消息框。 示例说明 这个例子首先定义了一个 Integer 类型的变量 intNumber,并设置其值 为 27。所有语句都在一行,代码如下所示: 'Declare and set a variable Dim intNumber As Integer = 27 然后可以使用 If…Then 语句来确定下一步的操作。在本例中,如果 intNumber 为 27: 'Here's where you make a decision, 'and tell the user what happened If intNumber = 27 Then MessageBox.Show("'intNumber' is, indeed, 27!", "Simple If") End If 其后是一个代码块,这个代码块包含的代码只有在 intNumber 为 27 时才会执行,这个代码块以 End If 结束。只有当表达式的结果为 True 时,才调用 If 和 End If 之间的代码。 所以,当运行代码时,就会执行 If 语句,其结果为 True。如果表达式为 True,就运行代码块, 在消息框中显示文本。 图 4-1 第 4 章 流 程 控 制 71 运行效果一样—— 但在 if 语句中只能有一行代码。现在我们知道,如果条件满足时会发生什么 情况。但是,当测试失败,结果为 False 时会怎么样呢?看看下面的示例。 试一试: 测试失败 Simple If.zip 这个例子将介绍如何在 IF 语句不是 True 时编写代码。 (1) 返回 Simple If 程序的窗体设计器。给窗体添加另一个 Button 控件,将其 Name 属性设置为 btnAnotherIf,Text 属性设置为 Another If。双击该按钮并添加下面突出显示的代码: Private Sub btnAnotherIf_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnAnotherIf.Click 'Declare and set a variable Dim intNumber As Integer = 27 'Here's where you make a decision, 'and tell the user what happened If intNumber = 1000 Then MessageBox.Show("'intNumber' is, indeed, 1000!", "Simple If") End If End Sub (2) 运行该项目,单击 Another If 按钮,结果是什么也没有显示。 示例说明 在这个示例中,问题“intNumber 为 1000 吗”的答案是 False,而代码块只有当语句为 True 时 才会执行,所以它跳过了这段代码。如果这条语句为 True,那么 If 和 End If 之间的代码会像以前一 样执行。然而,在这个示例中,If 语句的结果为 False,所以接下来执行的是 End If 后的代码(即 End Sub)。而 True 代码块就被跳过了。 4.2.1 Else 语句 如果希望当条件为 True 时执行一段代码,当条件为 False 时执行另一段代码,那么可以使用 Else 语句。下面扩展前一个示例,看看如何实现这一功能。 试一试: Else 语句 Simple If.zip 这个例子建立在上一个例子的基础上,说明 Else 语句如何工作。 注意:If…End If 代码块中的代码会自动缩进,这增强了可读性, 以便分辨出结果 为 True 时运行的是哪一段代码。为了进一步增强可读性,还可以在 If…Then 语句的 前面和 End If 语句的后面添加一些空白。 像上面这种简单的 If 代码块,也可以不使用 End If 语句,而把代码放在一行中 , 如下所示: If intNumber = 27 Then MessageBox.Show("'intNumber' is, indeed, 27!","Simple If") Visual Basic 2010 入门经典(第 6 版) 72 (1) 回到 Simple If 项目的代码编辑器,修改 btnAnotherIf_Click 过程中的代码,如下所示: Private Sub btnAnotherIf_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnAnotherIf.Click 'Declare and set a variable Dim intNumber As Integer = 27 'Here's where you make a decision, 'and tell the user what happened If intNumber = 1000 Then MessageBox.Show("'intNumber' is, indeed, 1000!", "Simple If") Else MessageBox.Show("'intNumber' is not 1000!", "Simple If") End If End Sub (2) 运行该项目,将得到图 4-2 所示的消息框。 示例说明 如果 If 语句中的条件不满足,就执行 Else 语句后的代码。在本示 例中,intNumber 的值为 27,但测试的条件是 intNumber = 1000,所 以 执行 Else 语句后的代码: MessageBox.Show("'intNumber' is not 1000!", "Simple If") 4.2.2 可进行多重选择的 ElseIf 语句 如果要测试的条件不止一个,就需要使用 ElseIf 语句。 试一试: ElseIf 语句 Simple If.zip 下面以 Simple If 程序为例来介绍如何测试 intNumber 的值为 27 和 1000 的情况。 (1) 回到代码编辑器,修改 btnAnotherIf_Click 过程中的代码,如下所示: Private Sub btnAnotherIf_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnAnotherIf.Click 'Declare and set a variable Dim intNumber As Integer = 27 'Here's where you make a decision, 'and tell the user what happened If intNumber = 1000 Then MessageBox.Show("'intNumber' is, indeed, 1000!", "Simple If") ElseIf intNumber = 27 Then MessageBox.Show("'intNumber' is 27!", "Simple If") Else MessageBox.Show("'intNumber' is neither 1000 nor 27!", "Simple If") End If End Sub 图 4-2 第 4 章 流 程 控 制 73 (2) 运行该项目,单击 Another If 按钮,会得到图 4-3 所示的消息框。 示例说明 这次,当满足表达式 intNumber = 27 时,就执行 ElseIf 语句中的代码。 注意,仍可以在最后的 Else 语句中包含 intNumber 的值既不是 27 也不是 1000 的所有情况: ElseIf intNumber = 27 Then MessageBox.Show("'intNumber' is 27!", "Simple If") Else MessageBox.Show("'intNumber' is neither 1000 nor 27!", "Simple If") End If 4.2.3 嵌套的 If 语句 可以把一条 If 语句嵌套在另一条 If 语句中。例如: If intX = 3 Then MessageBox.Show("intX = 3") If intY = 6 Then MessageBox.Show("intY = 6") End If End If 嵌套 If 语句的层数没有限制。但是,嵌套的层数越多,确定代码中将发生什么情况的难度就越 大。所以应尽可能使 If 语句的嵌套层数最少。 4.2.4 单行 If 语句 单行 If 语句形式通常用于简单、短小的测试,并能在文本编辑器中节省空间。但是,这种形式 不能提供多行 If 语句形式的结构和灵活性,而且通常较难读懂: If intX = 3 Then MessageBox.Show("intX = 3") Else MessageBox.Show("intX is not 3") 在单行 If…Then 语句的最后不需要 End If 语句。 也可以在单行 If…Then 语句中执行多行语句。所有的语句都必须放在一行中,并用冒号分隔开, 如下面的示例所示: If intX = 3 Then MessageBox.Show("intX = 3"): intX = intX + 1: Total += intX 图 4-3 提示:可以根据需要,添加任意多个 ElseIf 语句。然而切记,每个 ElseIf 语句都 要执行,因为 Visual Basic 2010 想知道每个条件是 True 还是 False。如果有许多条件需 要测试,这种语句将减慢程序运行的速度。如果是这样, 最好把这些语句以最可能执 行的方式排列,将最常见的放在最前面。或者使用 Select Case 语句块, Select Case 语 句块的内容将在本章后面介绍。 Visual Basic 2010 入门经典(第 6 版) 74 4.2.5 比较运算符 现在我们知道该如何测试一个变量是否等于某个值,并执行相应的代码。事实上,If 语句的作 用并不局限于此。我们可以用下列方式发问,所得到的答案都是 True 或 False: ● intNumber 大于 49 吗? ● intNumber 小于 49 吗? ● intNumber 大于等于 49 吗? ● intNumber 小于等于 49 吗? ● strname 不等于 Ben 吗? 在处理字符串值时,大多需要使用“等于”或“不等于”运算符。而在处理数值(整型和浮点型) 时,可以使用所有的算术运算符。 1. 使用“不等于”运算符 前面还没有使用过“不等于”运算符,所以下面用字符串测试该运算符。 试一试: 使用“不等于”运算符 If Demo.zip “等于”运算符为 true 时,“不等于”运算符就为 false;“等于”运算符为 false 时,“不等于” 运算符就为 true。如下所示: (1) 新建一个名为 If Demo 的 Windows Forms Application 项目。添加一个 TextBox 控件和一个 Button 控件。把文本框的 Name 属性设置为 txtName,Text 属性设置为 Stephanie。将按钮的 Name 属性设置为 btnCheck,Text 属性设置为 Check。 (2) 双击 Button 控件,创建其 Click 事件处理程序。添加如下突出显示的代码: Private Sub btnCheck_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnCheck.Click 'Declare a variable and get the name from the text box Dim strName As String strName = txtName.Text 'Is the name Wendy? If strName <> "Wendy" Then MessageBox.Show("The name is *not* Wendy.", "If Demo") End If End Sub (3) 保存该项目并运行。当显示窗体时单击 Check 按钮,会得到一个说明人名不是 Wendy 的消 息框。 示例说明 “不等于”运算符表示为<>。单击按钮时,首先要查看文本框的 Text 属性,获得其中的名字: 'Declare a variable and get the name from the text box Dim strName As String 第 4 章 流 程 控 制 75 strName = txtName.Text 获取名字后,就使用 If 语句。但这次,使用的是“不等于”运算符而不是“等于”运算符。还 要注意,本例比较的是两个字符串的值: 'Is the name Wendy? If strName <> "Wendy" Then MessageBox.Show("The name is *not* Wendy.", "If Demo") End If 只有当 If 语句中问题的答案为 True 时,才执行 Then 和 End If 之间的代码。这个规则有点呆板, 因为提出的问题是“strName 不等于 Wendy 吗”,而答案是“是的,strName 不等于 Wendy”。只要 问题的答案是 Yes 或 True,就运行代码,显示消息框。然而,如果在文本框中输入 Wendy 并单击 Check 按钮,就不会有任何情况发生。因为问题的答案是“不,strName 等于 Wendy”。因此答案是 No 或 False。 另一种测试某某不等于某某的做法是使用 Not 关键字。If 语句中的条件表达式可以写为: If Not strName = "Wendy" Then 2. 使用数字运算符 下面将介绍其他 4 种常用的比较运算符。它们都是非常基本的,所以这里介绍的比较简略。 试一试: 使用“小于”运算符 If Demo.zip 这个练习将使用“大于”、“小于”、“大于等于”和“小于等于”运算符。 (1) 回到 If Demo 项目的窗体设计器,添加另一个 TextBox 控件,将其 Name 属性设置为 txtValue。 添加另一个 Button 控件,将其 Name 属性设置为 btnCheckNumbers,Text 属性设置为 Check Numbers。 (2) 双击 Check Numbers 按钮,将下面突出显示的代码添加到其 Click 事件处理程序中: Private Sub btnCheckNumbers_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnCheckNumbers.Click 'Declare variable Dim intNumber As Integer Try 'Get the number from the text box intNumber = CType(txtValue.Text, Integer) Catch Exit Sub End Try 提示:在输入 Wendy 时一定要保证 W 大写,其余的字母小写, 否则程序将不能 正常运行,后面将说明原因。 Visual Basic 2010 入门经典(第 6 版) 76 'Is intNumber less than 27? If intNumber < 27 Then MessageBox.Show("Is 'intNumber' less than 27? Yes!", "If Demo") Else MessageBox.Show("Is 'intNumber' less than 27? No!", "If Demo") End If End Sub (3) 运行该项目,在文本框中输入 14 并单击 Check Numbers 按钮后,就会显示一个消息框,说明该数字是大于还是小于 27, 如图 4-4 所示。 示例说明 首先从文本框中获取值,但其中会费一些小周折。因为这是 个文本框,用户可以向其中输入任意值。如果输入的字符不能转 换为整型,程序就会崩溃。我们可以使用异常处理程序来确保总能获得一个值。如果 Option Strict 选项设置为 On,就需要像前一章那样,使用 CType 函数将文本框中的字符串值转换为 Integer 数据 类型。如果用户输入一个无效值,intNumber 会设置为 0(默认值),否则 intNumber 为输入值: 'Declare variable Dim intNumber As Integer Try 'Get the number from the text box intNumber = CType(txtValue.Text, Integer) Catch End Try “小于”运算符表示为<。下面测试一下输入的值是否小于 27,如果是,就在消息框中显示“Yes”, 否则显示“No”: 'Is intNumber less than 27? If intNumber < 27 Then MessageBox.Show("Is 'intNumber' less than 27? Yes!", "If Demo") Else MessageBox.Show("Is 'intNumber' less than 27? No!", "If Demo") End If 有一种情况要注意。如果在文本框中输入值 27,单击按钮后会出现一个显示 intNumber 不小 于 27 的消息框。If 语句回答 No,这是正确的,intNumber 是等于 27。这个运算符的测试范围可以 是无限的,但不包括值 27 本身。使用另外一种运算符可以解决这个问题,如下例所示。 试一试: 使用“小于等于”运算符 If Demo.zip 当测试的值小于比较的值或者两个值相同时,“小于等于”运算符就是 True,如下所示: 图 4-4 提示:异常处理程序将在第 10 章介绍,目前可以不管它。 第 4 章 流 程 控 制 77 (1) 返回代码编辑器,按如下所示修改 btnCheckNumbers_Click 事件处理程序中的 If 语句: Try 'Get the number from the text box intNumber = CType(txtValue.Text, Integer) Catch Exit Sub End Try 'Is intNumber less than or equal to 27? If intNumber <= 27 Then MessageBox.Show("Is 'intNumber' less than or equal to 27? Yes!", _ "If Demo") Else MessageBox.Show("Is 'intNumber' less than or equal to 27? No!", _ "If Demo") End If (2) 运行此项目,并在文本框中输入 27。单击 Check Numbers 按钮,会得到如图 4-5 所示的消息框。 示例说明 “小于等于”运算符表示为<=。这种运算符扩展了值的范围,包括了测试值本身。所以,当输 入 27 时,会得到答案“是的,intNumber 小于等于 27”。这种类型的运算符叫做包含运算符。 最后要介绍的两种运算符与之类似。 试一试: “大于”和“大于等于”运算符 If Demo.zip 这个例子介绍如何使用“大于”和“大于等于”运算符。 (1) 返回代码编辑器,在 btncheckNumbers_Click 事件处理程序中添加两个 If 语句,如下所示: 'Is intNumber less than or equal to 27? If intNumber <= 27 Then MessageBox.Show("Is 'intNumber' less than or equal to 27? Yes!", _ "If Demo") Else MessageBox.Show("Is 'intNumber' less than or equal to 27? No!", _ "If Demo") End If 'Is intNumber greater than 27? If intNumber > 27 Then MessageBox.Show("Is 'intNumber' greater than 27? Yes!", _ "If Demo") Else MessageBox.Show("Is 'intNumber' greater than 27? No!", _ "If Demo") End If 'Is intNumber greater than or equal to 27? 图 4-5 Visual Basic 2010 入门经典(第 6 版) 78 If intNumber >= 27 Then MessageBox.Show("Is 'intNumber' greater than or equal to 27? Yes!", _ "If Demo") Else MessageBox.Show("Is 'intNumber' greater than or equal to 27? No!", _ "If Demo") End If End Sub (2) 运行此程序。这次输入 99,单击 Check Number 按钮,将依次出现 3 个消息框。第 1 个消息 框显示 intNumber 并不小于等于 27,第 2 个消息框显示 intNumber 大于 27,第 3 个消息框显示 intNumber 大于等于 27。 示例说明 “大于”和“大于等于”运算符基本上与“小于”和“小于等于”运算符相反。现在,提问“intNumber 大于 27 吗”和“intNumber 大于等于 27 吗”,结果可想而知。 3. And 和 Or 运算符 当需要用 If 语句测试多个条件时,会发生什么情况呢?例如,要确定“intNumber 小于 27 且大 于 10”或者测试“strName 是 Wendy 还是 Stephanie”。我们可以把 And 和 Or 运算符与 If 语句组合 起来使用,如下例所示。 试一试: 使用 Or 运算符 And Or Demo.zip (1) 新建一个名为 And Or Demo 的 Windows Forms Application 项目。 (2) 在 Form1 的窗体设计器中,添加两个 TextBox 控件和一个 Button 控件。将 TextBox 控件的 Name 属性分别设置为 txtName1 和 txtName2,将按钮的 Name 属性设置为 btnOrCheck。 (3) 将 txtName1、txtName2 的 Text 属性分别设置为 Wendy 和 Stephanie。最后将 btnOrCheck 按钮的 Text 属性设置为 Or Check。完成后的窗体应该如图 4-6 所示。 (4) 双击 OrCheck 按钮,并将如下代码添加到其 Click 事 件处理程序中: Private Sub btnOrCheck_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnOrCheck.Click 'Declare variables Dim strName1 As String, strName2 As String 'Get the names strName1 = txtName1.Text strName2 = txtName2.Text 'Is one of the names Wendy? If strName1 = "Wendy" Or strName2 = "Wendy" Then 图 4-6 第 4 章 流 程 控 制 79 MessageBox.Show("One of the names is Wendy.", _ "And Or Demo") Else MessageBox.Show("Neither of the names is Wendy.", _ "And Or Demo") End If End Sub (5) 运行该项目,单击按钮,会得到图 4-7 所示的结果。 (6) 单击 OK 按钮,关闭消息框。交换名字,使上面文本框 (txtName1)中的名字为 Stephanie,下面文本框(txtName2)中的名字 为 Wendy,然后再次单击按钮,会得到一个消息框,说明其中一 个名字是 Wendy。 (7) 单击 OK 按钮,关闭文本框。再次修改文本框中的名字, 但这次两个文本框中的名字都不是 Wendy。单击按钮,会得到一 个消息框,说明两个名字都不是 Wendy。 示例说明 Or 运算符非常适合于创建一次比较两个不同值的 If 语句。在 Click 事件处理程序中,首先声明 变量,获取两个文本框中的名字,并把它们分别存储到变量 strName1 和 strName2 中: 'Declare variables Dim strName1 As String, strName2 As String 'Get the names strName1 = txtName1.Text strName2 = txtName2.Text 我们在一行代码中定义了两个变量,这是一种完全合理的编程方式,但有时会使代码看起来很 拥挤。变量间用逗号隔开,注意,必须用 As 关键字告诉 Visual Basic 2010 每个变量的数据类型是 什么。 获取了这两个名字后,就使用 Or 运算符把两个独立的 If 语句组合起来。这里的问题是“strName1 等于 Wendy 吗或者 strName2 等于 Wendy 吗”。答案会是(假设其中一个文本框包含名字 Wendy) “是 的,strName1 等于 Wendy 或者 strName2 等于 Wendy”。这样的话答案就是 Yes/No 或 True/False,但 从表面看来,问题更复杂了: 'Is one of the names Wendy? If strName1 = "Wendy" Or strName2 = "Wendy" Then MessageBox.Show("One of the names is Wendy.", _ "And Or Demo") Else MessageBox.Show("Neither of the names is Wendy.", _ "And Or Demo") End If 4. 使用 And 运算符 And 运算符在概念上类似于 Or 运算符,但它要求两边都满足条件,如下例所示。 图 4-7 Visual Basic 2010 入门经典(第 6 版) 80 试一试: 使用 And 运算符 And Or Demo.zip (1) 回到 And Or Demo 项目的窗体设计器。给窗体添加另一个 Button 控件并将其 Name 属性设 置为 btnAndCheck,Text 属性设置为 And Check。双击该按钮,并将下面突出显示的代码添加到它 的 Click 事件处理程序中: Private Sub btnAndCheck_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnAndCheck.Click 'Declare variables Dim strName1 As String, strName2 As String 'Get the names strName1 = txtName1.Text strName2 = txtName2.Text 'Are both names Wendy? If strName1 = "Wendy" And strName2 = "Wendy" Then MessageBox.Show("Both names are Wendy.", _ "And Or Demo") Else MessageBox.Show("One of the names is not Wendy.", _ "And Or Demo") End If End Sub (2) 运行程序。单击 And Check 按钮,将得 到一个消息框,说明其中一个名字不是 Wendy。 (3) 然而,如果把文本框中的内容都改为 Wendy,单击 And Check 按钮将得到如图 4-8 所 示的结果。 示例说明 从两个文本框中获取名字后,就比较它们。 这里的问题是“strName1 等于 Wendy 且 strName2 也等于 Wendy 吗”。要显示“Both names are Wendy” 消息框,If 语句的两个条件必须都满足。 'Are both names Wendy? If strName1 = "Wendy" And strName2 = "Wendy" Then MessageBox.Show("Both names are Wendy.", _ "And Or Demo") Else MessageBox.Show("One of the names is not Wendy.", _ "And Or Demo") End If 图 4-8 第 4 章 流 程 控 制 81 5. And 和 Or 运算符的其他用法 前面介绍了如何把 And 和 Or 运算符用于字符串,它们也可以用于数值,如下所示: If intX = 2 And intY = 3 Then MessageBox.Show("Hello, both of the conditions have been satisfied!") End If 或者 If intX = 2 Or intY = 3 Then MessageBox.Show("Hello, one of the conditions has been satisfied!") End If 实际上,Visual Basic 2010 对语句中 And 和 Or 运算符的数目没有限制。下面的语句是正确的: If intA = 1 And intB = 2 And intC = 3 And intD = 4 And intE = 5 And _ intF = 6 And intG = 7 And intH = 1 And intI = 2 And intJ = 3 And _ intK = 4 And intL = 5 And intM = 6 And intN = 7 And intO = 1 And _ intP = 2 And intQ = 3 And intR = 4 And intS = 5 And intT = 6 And _ intU = 7 And intV = 1 And intW = 2 And intX = 3 And intY = 4 And _ intZ = 5 Then MessageBox.Show("That's quite an If statement!") End If 但笔者想不出为什么要这么做。 最后,也可以用圆括号把运算符组合起来,查找某一范围内的值。例如,测试 intX 是否为 12~20(不包括 12 和 20)或 22~25 之间的值(不包括 22 和 25),可以使用下面的 If…Then 语句: If (intX > 12 And intX < 20) Or (intX > 22 And intX < 25) Then 另外还有许多运算符组合,因篇幅所限,这里不再讨论。有一点可以放心,不管测试条件是什 么,总会找到一个符合要求的运算符组合。 4.2.6 字符串比较 在处理字符串和 If 语句时,经常会遇到区分大小写的问题。尽管我们很自然地认为 A 和 a 是非 常类似的,但计算机会把这两个字符当作两个不同的实体,也就是区分大小写。在比较字符串时, 字母的大小写是非常重要的。例如,运行下面的代码,将不会出现消息框: Dim strName As String strName = "Winston" If strName = "WINSTON" Then MessageBox.Show("Aha! You are Winston.") End If 因为大小写不同,从严格意义上讲,WINSTON 和 Winston 是不同的,所以,If 语句不返回 消息。但在很多情况下,我们不会注意大小写形式,所以必须找到一种忽略大小写形式来比较字符 串的方法。 Visual Basic 2010 入门经典(第 6 版) 82 试一试: 不区分大小写来比较字符串 And Or Demo.zip (1) 回到 And Or Demo 项目的窗体设计器,向窗体中添加另一个 TextBox 控件和 Button 控件。 (2) 将文本框的 Name 属性设置为 txtName3,Text 属性设置为 Byran。将按钮的 Name 属性设置 为 btnStringCompare,Text 属性设置为 String Compare。 (3) 双击 String Compare 按钮,打开其 Click 事件处理程序,并添加下面突出显示的代码: Private Sub btnStringCompare_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnStringCompare.Click 'Declare variable Dim strName As String 'Get the name strName = txtName3.Text 'Compare the name If String.Compare(strName, "BRYAN", True) = 0 Then MessageBox.Show("Hello, Bryan!", "And Or Demo") End If End Sub (4) 运行该项目并单击 String Compare 按钮,将得 到如图 4-9 所示的结果。 (5) 现在关闭消息框,在最后一个文本框中输入 名字 ByYaN 或其他的大小写组合,单击 String Compare 按钮,仍会看到消息“Hello, Bryan!”。 (6) 但如果输入的名字不是 Bryan,单击 String Compare 按钮时将不会显示消息框。 示例说明 一旦从文本框中获取到名字,就必须使用一个函 数对两个值进行比较,而不是使用基本的“等于”运 算符。在这个示例里,我们对 System.String 使用了 Compare 方法,并且给出了要比较的两个字符串。 第 1 个字符串是存储在 strName 中的值(输入到文本框中的值),第 2 个字符串是"BRYAN"。最后一 个参数是 True,这是告诉 Compare 执行不区分大小的比较,换句话说就是忽略大小写。如果这个参 数是 False,比较时就会区分大小写,而这样的话还不如使用“等于”运算符: 'Compare the name If String.Compare(strName, "BRYAN", True) = 0 Then MessageBox.Show("Hello, Bryan!", "And Or Demo") End If String.Compare 返回一个相当奇怪的结果,实际返回的是一个整型值,而不是 True 或 False。 这是因为 String.Compare 可用来决定两个字符串有何不同,而不是直接回答“是,它们不同”或者 “不,它们相同”。如果该方法返回 0,字符串匹配。如果返回的值不为 0,字符串不匹配。 图 4-9 第 4 章 流 程 控 制 83 4.3 Select Case 语句 有时,需要作出一组类似的决策,如下所示: ● 客户叫 Bryan 吗?如果是,完成某个任务。 ● 客户叫 Stephanie 吗?如果是,完成某个任务。 ● 客户叫 Cathy 吗?如果是,完成某个任务。 ● 客户叫 Betty 吗?如果是,完成某个任务。 ● 客户叫 Edward 吗?如果是,完成某个任务。 很明显,这可以使用一组 If…Then 语句来完成,如下所示: If Customer.Name = "Bryan" Then (do something) ElseIf Customer.Name = "Stephanie" Then (do something) ElseIf Customer.Name = "Cathy" Then (do something) ElseIf Customer.Name = "Betty" Then (do something) ElseIf Customer.Name = "Edward" Then (do something) End If 如果想测试 Customer.FirstName 而不是 Customer.Name,该怎么办?我们不得不修改每一个 If 语句,这相当麻烦。另外,如果 Customer.Name 是"Edward",就必须执行其他的 4 个 If 语句,这样 做效率极低。有一种更好的解决方法,就是 Select Case 语句。 试一试: 使用 Select Case 语句 Select Demo.zip (1) 新建一个名为 Select Demo 的 Windows Forms Application 项目。把窗体的 Text 属性改为 Select Case。 (2) 使用工具箱在窗体中添加一个 ListBox 控件,将其 Name 属性设置为 lstData,Dock 属性设置为 Fill, IntegralHeight 属性设置为 False。 (3) 在窗体设计器中选择 lstData,并 在 Properties 窗格 中选择 Items 属性。单击属性右边的省略号按钮(…),并 在 打开的 String Collection Editor 对话框中添加 5 个名字,使 其各占一行,如图 4-10 所示。 提示:String.Compare 返回了一个关于两个字符串有何不同的提示, 以帮助构建 排序算法。 图 4-10 Visual Basic 2010 入门经典(第 6 版) 84 (4) 单击 OK 按钮,保存所做的修改,这样一来,这些名字就添加到列表框中。 (5) 现在双击 lstData 控件,创建一个新的 SelectedIndexChanged 事件处理程序,并添加如下突 出显示的代码: Private Sub lstData_SelectedIndexChanged(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles lstData.SelectedIndexChanged 'Declare variables Dim strName As String Dim strFavoriteColor As String 'Get the selected name strName = lstData.Items(lstData.SelectedIndex).ToString 'Use a Select Case statement to get the favorite color 'of the selected name Select Case strName Case "Bryan" strFavoriteColor = "Madras Yellow" Case "Ashley" strFavoriteColor = "Sea Blue" Case "Jennifer" strFavoriteColor = "Morning Mist" Case "Eddie" strFavoriteColor = "Passionate Purple" Case "Katelyn" strFavoriteColor = "Red" End Select 'Display the favorite color of the selected name MessageBox.Show(strName & "'s favorite color is " & _ strFavoriteColor, "Select Demo") End Sub (6) 保存该项目并运行它。无论单击哪个名 字都会出现一个消息框,如图 4-11 所示。 示例说明 在 SelectedIndexChanged 事件处理程序中, 首先声明变量并确定所选择的名字。为此,查找 列表中与当前 SelectedIndex 属性值相匹配的那一 项。ListBox 类的 Items 集合返回一个 Object 数据 类型,因此对于 strName 变量,要使用 ToString 方法将其转换为 String 数据类型: 'Declare variables Dim strName As String Dim strFavoriteColor As String 'Get the selected name 图 4-11 第 4 章 流 程 控 制 85 strName = lstData.Items(lstData.SelectedIndex).ToString 之后,开始执行 Select Case…End Select 语句块。为此,需要提供一个相匹配的变量, 在本示 例中,使用在列表中选择的名字。 在 Select Case…End Select 语句块中,为每个要测试的条件定义一个 Case 语句。本例中有 5 个 Case 语句,每个语句都设置为响应不同的名字。一旦找到一个匹配,Visual Basic 2010 就会立即执 行该 Case 语句后的代码。 例如,如果单击 Katelyn,消息框会显示 Red 是 Katelyn 最喜欢的颜色,因为 Visual Basic 2010 执行的是 strFavoriteColor = "Red"。单击 Ashley 则显示 Sea Blue 是 Ashley 最喜欢的颜色,因为 Visual Basic 2010 执行的是 strFavoriteColor="Sea Blue"。 'Use a Select Case statement to get the favorite color 'of the selected name Select Case strName Case "Bryan" strFavoriteColor = "Madras Yellow" Case "Ashley" strFavoriteColor = "Sea Blue" Case "Jennifer" strFavoriteColor = "Morning Mist" Case "Eddie" strFavoriteColor = "Passionate Purple" Case "Katelyn" strFavoriteColor = "Red" End Select 在执行完 Select Case…End Select 语句块之后,会显示一条消息,如下所示: 'Display the favorite color of the selected name MessageBox.Show(strName & "'s favorite color is " & _ strFavoriteColor, "Select Demo") 如何跳出 Select Case…End Select 语句块呢?当处理一个 Case 语句后面的代码时,如果遇到另 一个 Case 语句,Visual Basic 2010 就会跳出 Select Case…End Select 语句块,执行这个语句块后的代 码。下面就是一个这样的示例: (1) 用户单击 Katelyn,引发 SelectedIndexChanged 事件,在 strName 中存储"Katelyn"。 (2) 进入 Select Case 语句,对 strName 中的值和提供的 5 个名字进行比较。 (3) Visual Basic 2010 找到一个满足条件的 Case 语句,并执行该 Case 语句下面的语句: strFavoriteColor = "Red" (4) Visual Basic 2010 到达下一行,而这一行是另一个 Case 语句。因为已经执行了一个 Case 语 句,所以它会跳到 Select Case…End Select 语句块后的第一行代码处,并显示消息框。 Select Case 是一种功能非常强大、易于使用的技术,利用它可以从几个选项中选出一个选项。 然而,在执行完一个 Case 语句后,若下一行是另一个 Case 语句,就退出该代码块。 Visual Basic 2010 入门经典(第 6 版) 86 4.3.1 不区分大小写的 Select Case 语句 和 If 语句一样,Select Case 语句也是区分大小写的。下面的示例将证明这一点。 试一试: 区分大小写的 Select Case 语句 Select Demo.zip 这个练习将证明使用 Select Case 语句比较字符串时会区分大小写。 (1) 回到 Select Demo 项目,打开窗体设计器,找到列表框控件的 Items 属性,再次打开 String Collection Editor 对话框。 (2) 把其中的所有名字全部用大写形式表示,如图 4-12 所示。 (3) 单击 OK,保存所做的修改,并运行此项目。注意,无论单击哪个名字,消息框都不会指定 喜欢的颜色,如图 4-13 所示。 图 4-12 图 4-13 示例说明 和 If 语句一样,Select Case 语句执行的是区分大小写的匹配。这意味着如果提供的名字为 BRYAN 或 EDDIE,就不存在对应的 Case 语句,因为做了下列假定: If "EDDIE" = "Eddie" 或者 If "BRYAN" = "Bryan" 本章前面介绍了如何通过 String.Compare 方法使 If 语句不区分大小写。但 Select Case 语句不能 使用这种方法,所以为了不区分大小写,需要使用另一种方法,如下例所示。 试一试: 不区分大小写的 Select Case 语句 Select Demo.zip 这个例子将学习用 Select Case 语句比较字符串的另一种方式。 (1) 回到 Select Demo 项目,打开 Form1 的代码编辑器,并对 SelectedIndexChanged 事件处理程 序做一些修改。特别注意一下 Case 语句—— 要匹配的名称必须全部用小写形式: 第 4 章 流 程 控 制 87 Private Sub lstData_SelectedIndexChanged(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles lstData.SelectedIndexChanged 'Declare variables Dim strName As String Dim strFavoriteColor As String 'Get the selected name strName = lstData.Items(lstData.SelectedIndex).ToString 'Use a Select Case statement to get the favorite color 'of the selected name Select Case strName.ToLower Case "bryan" strFavoriteColor = "Madras Yellow" Case "ashley" strFavoriteColor = "Sea Blue" Case "jennifer" strFavoriteColor = "Morning Mist" Case "eddie" strFavoriteColor = "Passionate Purple" Case "katelyn" strFavoriteColor = "Red" End Select 'Display the favorite color of the selected name MessageBox.Show(strName & "'s favorite_ color is " & strFavoriteColor, "Select Demo") End Sub (2) 运行该项目,尝试选择一个名字。这次出 现的消息框中显示的颜色正是被单击的人所喜欢的 颜色,如图 4-14 所示。 示例说明 为了使 Select Case 语句不区分大小写,必须把 给出的 strName 变量都转换为小写形式。这可以使 用 ToLower 方法来实现: Select Case strName.ToLower 这意味着无论使用什么形式的字符串(不管是"BRYEN"还是"Bryen"),该语句都会把它全部转换 为小写形式("bryen")。然而,此时必须确保所做的是类似比较,这也是为什么必须把 Case 语句中的 值全部转换为小写形式的原因。这样的话,如果字符串是"BRYEN",它就被转换为"bryen",接着查 找与"bryen"相匹配的 Case 语句: Case "bryan" strFavoriteColor = "Madras Yellow" Case "ashley" strFavoriteColor = "Sea Blue" 图 4-14 Visual Basic 2010 入门经典(第 6 版) 88 Case "jennifer" strFavoriteColor = "Morning Mist" Case "eddie" strFavoriteColor = "Passionate Purple" Case "katelyn" strFavoriteColor = "Red" End Select 最后,一旦找到喜欢的颜色,就会像前面一样显示一个消息框。 4.3.2 多重选择 不仅可以匹配 Select Case…End Select 代码块中的一个值,而且可以匹配多个值。 试一试: 多重选择 Select Demo.zip 在下面的示例中,将修改应用程序,确定所有被选择者的性别。 (1) 返回 Select Demo 项目,打开 Form1 的代码编辑器,在 SelectedIndexChanged 事件处理程序 中添加以下突出显示的代码: 'Display the favorite color of the selected name MessageBox.Show(strName & "'s favorite color is " & strFavoriteColor, _ "Select Demo") 'Use a Select Case statement to display a person's gender Select Case strName.ToLower Case "bryan", "eddie", "ashley" MessageBox.Show("This person's gender is male.", "Select Demo") Case "jennifer", "katelyn" MessageBox.Show("This person's gender is female.", "Select Demo") End Select End Sub (2) 运行该项目并单击其中一个女性的名字,在表明某 人最喜欢的颜色之后,将显示如图 4-15 所示的结果。 示例说明 提取名字和初始化 Select Case 语句块的代码并没有改 变。在每一个 Case 语句中,都可以提供一列值,这些值用逗 号分隔开。第 1 个 Case 语句查找 bryan、edward 或 ashley。 无论匹配其中的哪一个,都将运行这个 Case 语句后面的代码: Case "bryan", "eddie", "ashley" 注意:也可以反过来,使用 strName.ToUpper 代替 strName.ToLower,把所有的名 字都转换为大写形式。 图 4-15 第 4 章 流 程 控 制 89 MessageBox.Show("This person's gender is male.", "Select Demo") 第 2 个 Case 语句查找 jennifer 或 katelyn。只要有一个选项匹配,就执行这个 Case 语句后面的 代码: Case "jennifer", "katelyn" MessageBox.Show("This person’s gender is female.", "Select Demo") 这里都是“或”匹配,即“一个或另一个”,而不是“一个与另一个”。 4.3.3 Case Else 语句 如果没有符合条件的 Case 语句,该怎么办?在演示不区分大小写的 Select Case 语句时,我们 曾介绍过这一情况。下面这个示例将介绍 Case Else 语句。 试一试: 使用 Case Else 语句 Select Demo.zip (1) 回到窗体设计器,定位到列表框控件的 Items 属性,再次打开 Sring Collection Editor 对话框。 向集合中添加全大写形式的另一个人名并单击 OK 按钮。 (2) 在 lstData_SelectedIndexChanged 事件处理程序中添加如下突出显示的代码: 'Use a Select Case statement to display a person's gender Select Case strName.ToLower Case "bryan", "edward" MessageBox.Show("This person's gender is male.", "Select Demo") Case "stephanie", "cathy", "betty" MessageBox.Show("This person's gender is female.", "Select Demo") Case Else MessageBox.Show("I don't know this person's gender.", _ "Select Demo") End Select End Sub (3) 运行此项目并单击刚才添加的人名,将得到 如图 4-16 所示的结果。 示例说明 如果查找的内容与所有的 Case 语句都不匹配,就 要使用 Case Else 语句。由于在语句块中未定义"tony", 因此默认情况下会运行 Case Else 语句后面的代码。在 本示例中,显示了一个消息框,表明不知道所选者的 性别。 4.3.4 Select Case 中的不同数据类型 前面只介绍了如何在 Select Case 语句中使用字符串类型的变量。然而,在 Select Case 语句中, 可以使用 Visual Basic 2010 中所有的基本数据类型,例如整型、双精度型和布尔型。 图 4-16 Visual Basic 2010 入门经典(第 6 版) 90 在日常工作中,Select Case 语句中最常见的数据类型为字符串型和整型。但一般来讲,如果一 个数据类型能在 If 语句中与“等于”(=)运算符连用,它就能在 Select Case 语句中使用。 4.4 循环 在编写计算机软件时,常常需要多次执行同样的任务,以达到某一目的。例如,为所有客户生 成电话账单,或是从磁盘中读取 10 个文件。 为此,可以使用循环。本节将介绍 Visual Basic 2010 中两种主要的循环,它们分别是: ● For 循环—— 这种循环执行一定的次数,例如执行 10 次。 ● Do 循环—— 这种循环执行到满足某一特定条件时结束,例如处理完所有的数据。 4.4.1 For…Next 循环 最容易理解的循环是 For…Next 循环。 试一试: 创建 For…Next 循环 Loops.zip 这个例子将学习创建 For…Next 循环。 (1) 新建一个名为 Loops 的 Windows Forms Application 项目。 (2) 在出现的窗体中添加一个 ListBox 控件和一个 Button 控件。 (3) 将列表框控件的 Name 属性改为 lstData,将 IntegralHeight 属性设置为 False。 (4) 将按钮控件的 Name 属性改为 btnForNextLoop,将 Text 属性设置为 For Next Loop。后面要 添加更多的按钮,因此使该按钮稍宽些,如图 4-17 所示。 (5) 双击 For Next Loop 按钮,创建它的 Click 事件处理程序,并添加如下突出显示的代码: Private Sub btnForNextLoop_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnForNextLoop.Click 'Declare variable Dim intCount As Integer 'Clear the list ClearList() 'Perform a loop For intCount = 1 To 5 'Add the item to the list lstData.Items.Add("I'm item " & intCount.ToString & _ " in the list!") Next End Sub (6) 现在创建下列方法: Private Sub ClearList() 'Clear the list lstData.Items.Clear() 第 4 章 流 程 控 制 91 End Sub (7) 保存并运行该项目,单击 For Next Loop 按钮,结果如图 4-18 所示。 图 4-17 图 4-18 示例说明 在 Click 事件处理程序中,首先定义一个变量: 'Declare variable Dim intCount As Integer 接着调用 ClearList 方法清除列表框,尽管列表框目前是空的。在下一个“试一试”练习中,将 向窗体中添加更多的按钮,并且可能希望比较每个按钮的单击结果。 'Clear the list ClearList() 然后,使用 For 关键字开始一个循环。这告诉 Visual Basic 2010 我们要创建一个循环。For 关键 字后面的代码用于定义如何进行循环。本示例给循环提供了刚才创建的变量,并从 1 到 5 进行计数: 'Perform a loop For intCount = 1 To 5 给循环提供的变量(本例中是 intCount)称为控制变量。第 1 次进入循环时,Visual Basic 2010 把 控制变量设置为初始的计数值—— 在本例中是 1。循环开始后,Visual Basic 2010 运行 For 循环中的 第 1 行代码。在本例中,该行代码的作用是在列表框中添加一个字符串: 'Add the item to the list lstData.Items.Add("I'm item " & intCount.ToString & _ " in the list!") 这行代码在列表框中添加字符串"I'm item 1 in the list!"。Visual Basic 2010 接着运行 Next 语句, 从这里开始,就有一些有趣的事了。 Next 执行 Next 语句时,Visual Basic 2010 给控制变量加 1。第 1 次执行完 Next 语句后,intCount 的 Visual Basic 2010 入门经典(第 6 版) 92 值就从 1 变为 2。如果控制变量的值小于或等于终止值(本例中是 5),Visual Basic 2010 就会返回到 For 语句后的第 1 行,在本例中是: 'Add the item to the list lstData.Items.Add("I'm item " & intCount.ToString & _ " in the list!") 这行代码在列表框中添加字符串"I'm item 2 in the list!"。同样,执行完该行代码之后,再次运行 Next 语句。intCount 的值现在从 2 增加为 3,因为 3 小于 5,所以下面将返回到给列表框添加项的行, 直到 intCount 的值从 5 变为 6。由于 6 大于循环的终止值,因此循环终止。 上面定义的方法中只包含一行代码,但在下一个“试一试”练习中肯定要重用它。这个方法仅 清除列表框的 Items 集合。 Private Sub ClearList() 'Clear the list lstData.Items.Clear() End Sub 1. 使用 Step 关键字 循环不一定要从 1 开始,可以选择任何值。也不需要在每一次迭代中给控制变量递增 1,可以 递增任何值。 试一试: 使用步长 Loops.zip 在这个示例中,将灵活使用 Step 关键字。 (1) 回到 Loops 项目的窗体设计器。给窗体添加另一个 Button 控件,将其 Name 属性设置为 btnForNextLoopWithStep,Text 属性设置为 For Next Loop w/Step。 (2) 双击 For Next Loop w/Step 按钮,给 Click 事件处理程序添加如下突出显示的代码: Private Sub btnForNextLoopWithStep_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnForNextLoopWithStep.Click 'Clear the list ClearList() 'Perform a loop For intCount As Integer = 4 To 62 Step 7 'Add the item to the list lstData.Items.Add(intCount.ToString) Next End Sub 提示:当讨论循环时,我们习惯于使用迭代这个术语。迭代描述了从 For 语句到 Next 语句的执行过程,在上面的示例中,循环中有 5 次迭代。 第 4 章 流 程 控 制 93 (3) 运行该项目并单击 For Next Loop w/Step 按 钮,结果将如图 4-19 所示。 示例说明 本例中最主要的技巧是使用了下面这行代码: 'Perform a loop For intCount As Integer = 4 To 62 Step 7 注意,本示例没有使用 Dim 语句声明 intCount 变量,而是在 For 语句中完成该变量的声明,intCount 变量是 For 循环中的一个局部变量。使用 As 关键字和 变量的类型(本例中是 Integer 类型),可以有效地声明 一个内联变量。 该变量的初始值不是 1 而是 4。这意味着在此循环的第 1 次迭代中,intCount 的值为 4,事实上, 添加到列表框中的第 1 项正是 4。另外,Step 关键字让循环在每次迭代中使用步长给控制变量递增 7 而不是默认的 1。这样一来,在开始进行循环的第 2 次迭代时,intCount 的值为 11 而不是 5。 尽管 For 循环的终止值为 62,但实际上循环在 intCount 为 60 时就停止了,因为终止值 62 是一 个最大值。经过 9 次迭代后,intCount 的值为 67,而 67 大于 62,所以循环停止。 2. 反向循环 使用小于 0 的步长,就可以向后而不是向前执行循环,如下例所示。 试一试: 反向循环 Loops.zip (1) 回到窗体设计器。给窗体添加另一个 Button 控件,将其 Name 属性设置为 btnBackwardsForNextLoop,Text 属性设置为 Backwards For Next。 (2) 双击 Backwards For Next 按钮,在 Click 事件处理程序中添加如下突出显示的代码: Private Sub btnBackwardsForNextLoop_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnBackwardsForNextLoop.Click 'Clear the list ClearList() 'Perform a loop For intCount As Integer = 10 To 1 Step -1 'Add the item to the list lstData.Items.Add(intCount.ToString) Next End Sub (3) 运行该项目并单击 Backwards For Next 按钮,结 果如图 4-20 所示。 图 4-19 图 4-20 Visual Basic 2010 入门经典(第 6 版) 94 示例说明 如果步长是一个负值,如–1,For 语句就会给当前控制变量加上–1。而加上一个负值意味着 作了一次减法,所以 intCount 从初始值 10 变为 9,直到递减到终止值。 3. For Each…Next 循环 在实际应用中,我们不大可能像这里介绍的那样使用 For…Next 循环。由于.NET Framework 的 工作方式,我们经常使用由 For…Next 循环派生出来的 For Each…Next 循环。 在我们设计的算法中,只要用到循环,就应完成一组工作,通常这个组称为数组。例如,浏览 一个文件夹中的所有文件,查找超过特定大小的文件。在向.NET Framework 请求文件列表时,.NET Framework 就返回一个字符串数组,数组中的每个字符串都描述了一个文件。 试一试: For Each 循环 下面的示例将修改 Loops 应用程序,使之返回计算机根文件夹下的文件夹列表。 (1) 返回窗体设计器。给窗体添加一个 Button 控件,将其 Name 属性设置为 btnForEachLoop, Text 属性设置为 For Each Loop。 (2) 双击 For Each Loop 按钮,在 Click 事件处理程序中添加如下突出显示的代码: Private Sub btnForEachLoop_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnForEachLoop.Click 'Clear the list ClearList() 'List each folder at the root of your C drive For Each strFolder As String In _ My.Computer.FileSystem.GetDirectories("C:\") 'Add the item to the list lstData.Items.Add(strFolder) Next End Sub (3) 运行此项目并单击 For Each Loop 按钮,就会看到 C 盘根目录下的文件夹列表。 示例说明 .NET Framework 中的 My 名称空间提供了一些类,以便于查找日常使用的信息。特别地, Computer 类提供了一些与运行程序的计算机相关的类。如果想查找文件和文件夹,就可以使用 FileSystem 类,因为该类提供了处理文件和文件夹的方法和属性。 GetDirectories 方法返回表示计算机中目录(或文件夹)名的字符串集合。本例使用该方法返回计 算机 C 盘根目录下的文件夹名的集合。 For Each…Next 循环的规则是,对于每一次迭代都要给出应该处理的数据。我们需提供“数据” 的来源(本例中指表示文件夹名称的字符串集合)以及可以存储当前“数据”的控制变量。在此, GetDirectories 方法提供了该字符串集合,内联变量 strFolder 提供了控制变量: 第 4 章 流 程 控 制 95 'List each folder at the root of your C drive For Each strFolder As String In _ My.Computer.FileSystem.GetDirectories("C:\") Next 上面的代码表示在第 1 次迭代中,strFolder 等于字符串集合中的第 1 项(在我的机器上是 C:\$Recycle.Bin)。接下来把该项添加到列表框中: 'Add the item to the list lstData.Items.Add(strFolder) 与标准的 For…Next 循环一样,对于循环中的每一次迭代,我们都提供了包含文件夹名的字符 串,然后将其添加到列表中。如果再也没有要返回的文件夹,程序就自动跳出循环。 4.4.2 Do…Loop 循环 另一种可以使用的循环是一直运行,直到满足某一特定条件时才结束。这种循环叫做 Do…Loop 循环,它有许多变体。 首先介绍 Do Until…Loop 循环。这种循环可以一直执行到某些事发生。 试一试: 使用 Do Until…Loop 循环 在下面的示例中,我们将使用.NET Framework 内置的随机数生成器并创建一个循环。在该循环 中,将一直生成随机数,直到生成的数是 10 为止。当生成的随机数为 10 时,就终止循环。 (1) 回到 Loops 项目的窗体设计器,向窗体中添加一个 Button 控件,将其 Name 属性设置为 btnDoUntilLoop,Text 属性设置为 Do Until Loop。 (2) 双击 Do Until Loop 按钮,并向其 Click 事件处理程序添加如下突出显示的代码: Private Sub btnDoUntilLoop_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnDoUntilLoop.Click 'Declare variables Dim objRandom As New Random Dim intRandomNumber As Integer = 0 'Clear the list ClearList() 'Process the loop until intRandomNumber = 10 Do Until intRandomNumber = 10 'Get a random number between 0 and 24 intRandomNumber = objRandom.Next(25) 'Add the number to the list lstData.Items.Add(intRandomNumber.ToString) Loop End Sub (3) 运行这个项目并单击 Do Until Loop 按钮,得到的结果如图 4-21 所示。因为使用了随机数生 成器,所以每次单击 Do Until Loop 按钮后得到的结果可能都不同。 Visual Basic 2010 入门经典(第 6 版) 96 图 4-21 示例说明 Do Until…Loop 语句会一直执行,直到满足所给的条件为止。当使用这类循环时,循环没有控 制变量,用户必须跟踪循环的当前位置。首先为 Random 类声明一个变量(也称为对象),以提供生 成随机数的方法。该对象的前缀为 obj,用于说明该对象派生于类。接下来声明的一个变量是 intRandomNumber,该变量用于接收 objRandom 对象生成的随机数。 'Declare variables Dim objRandom As New Random() Dim intRandomNumber As Integer = 0 然后清除之前在列表中添加的项: 'Clear the list ClearList() 接着设置循环条件,使循环在变量 intRandomNumber 等于 10 之前一直运行: 'Process the loop until intRandomNumber = 10 Do Until intRandomNumber = 10 对于循环的每一次迭代,随机数生成器都会生成一个新的随机数,该数存储在 intRandomNumber 中,可以调用 objRandom 的 Next 方法来获取生成的随机数。在本例中,将参数 25 传递给 Next 方 法,这表示返回值应该在 0 到 24 之间(包括 0 和 24)——即传递的参数值应比希望得到的最大数大 1。 换句话说,参数值不应该是 0 到 24 之间(包括 0 和 24)的任何值。下面将该数添加到列表中: 'Get a random number between 0 and 24 intRandomNumber = objRandom.Next(25) 'Add the number to the list lstData.Items.Add(intRandomNumber.ToString) Loop 当执行到 Loop 语句时发生了一些奇怪的事情。Visual Basic 2010 没有执行循环中的第 1 行,而 是返回到 Do Until 行。当执行返回到 Do Until 行时,就计算表达式。如果计算结果为 False,执行指 第 4 章 流 程 控 制 97 针就移动到循环的第 1 行。但是,如果 intRandomNumber 的值为 10,表达式就返回 True,执行指 针就不会移动到循环的第 1 行,而是立即移动到 Loop 语句后的第 1 行语句。实际上,循环已停止。 1. Do While…Loop 循环 从概念上讲,与 Do Until…Loop 循环相对的是 Do While…Loop 循环。当某一条件为 True 时, 就执行 Do While…Loop 循环。 试一试: 使用 Do While…Loop 循环 Loops.zip 下面的示例在随机数小于 15 时执行 Do While…Loop 循环。 (1) 再次回到窗体设计器。在窗体中添加一个 Button 控件,将其 Name 属性设置为 btnDoWhileLoop, Text 属性设置为 Do While Loop。 (2) 双击 Do While Loop 按钮,在 Click 事件处理程序中添加如下突出显示的代码: Private Sub btnDoWhileLoop_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnDoWhileLoop.Click 'Declare variables Dim objRandom As New Random Dim intRandomNumber As Integer = 0 'Clear the list ClearList() 'Process the loop while intRandomNumber < 15 Do While intRandomNumber < 15 'Get a random number between 0 and 24 intRandomNumber = objRandom.Next(25) 'Add the number to the list lstData.Items.Add(intRandomNumber.To String) Loop End Sub (3) 运行此项目并单击 Do While Loop 按钮,结果 如图 4-22 所示。 示例说明 每次单击 Do While Loop 按钮时,只要随机数生 成器生成的数小于 15,循环就会执行。 只要测试表达式的结果为 True,Do While…Loop 循环就会一直执行下去。一旦测试表达式的结果为 False,就会退出循环。当开始循环时,先检查 randomNumber 是否小于 15。如果是,表达式将返回 True,并运行循环中的代码: 'Process the loop while intRandomNumber < 15 Do While intRandomNumber < 15 'Get a random number between 0 and 24 图 4-22 Visual Basic 2010 入门经典(第 6 版) 98 intRandomNumber = objRandom.Next(25) 'Add the number to the list lstData.Items.Add(intRandomNumber.ToString) Loop 到达 Loop 语句时,Visual Basic 2010 将再次执行 Do While 语句。在 Do While 语句中再次计算 表达式,如果结果为 True,就再次运行循环代码。如果为 False(intRandomNumber 的值大于或等于 15),就执行 Loop 后的第 1 行代码,即退出循环。 2. Do…Loop 可接受的表达式 对 Do…Loop 的两种变体形式应使用哪种表达式?答案是“可用于 If 语句的表达式都可以用于 Do…Loop 语句”。例如,可以编写下面的代码: Do While intX > 10 And intX < 100 或 Do Until (intX > 10 And intX < 100) Or intY = True 或 Do While String.Compare(strA, strB) > 0 总而言之,这是个功能强大的循环。 3. Do…Loop 的其他形式 Until 或 While 语句也可以跟在 Loop 之后,而不是跟在 Do 之后。考虑下面的两个循环: Do While intX < 3 intX += 1 Loop 和 Do intX += 1 Loop While intX < 3 初看起来,好像是 While intX<3 移了位置。您可能觉得这两个循环是等效的,但它们有一些细 微的差别。假设执行这两个 Do 循环时 intX 大于 3(例如是 4),则第 1 个循环根本不会执行,而第 2 个循环会执行一次。当执行 Loop While intX <3 时,循环就退出了,即使 intX 小于 3,第 2 个循环 也会执行一次。 考虑下面两个 Do Until 循环: Do Until intX = 3 intX += 1 Loop 和 Do intX += 1 第 4 章 流 程 控 制 99 Loop Until intX = 3 同样,这两个循环看起来也是相同的,但它们也有细微的差别。假设 intX 为 3,则第 1 个循环 不会执行,因为 intX 已经满足退出循环的条件。然而,第 2 个循环会执行一次。当第 1 次执行 Loop Until intX=3 时,intX 为 4。接着返回到循环的开头,并把 intX 递增为 5,依此类推。事实上,这是 个死循环(本章稍后讨论),永远不会停止。 Do While…Loop 的另一种变体是 While…End While。这是 VB 以前的版本,以前的开发人员仍 使用它编写.NET 代码,但对它有个认识还是相当重要的。下面两种循环是等效的,但最好采用第 1 种: Do While intX < 3 intX += 1 Loop 和 While intX < 3 intX += 1 End While 4.4.3 嵌套循环 有时,在执行一个循环时,需要开始另外一个循环,这就叫做嵌套。在原理上它类似于 If 语句 嵌套。 试一试: 使用嵌套循环 Loops.zip 下面的示例将介绍如何在一个已执行的循环中创建和执行另一个循环。 (1) 在窗体设计器中,向窗体添加一个 Button 控件,将其 Name 属性设置为 btnNestedLoops, Text 属性设置为 Nested Loops。 (2) 双击 Nested Loops 按钮,在其 Click 事件处理程序中添加如下突出显示的代码: Private Sub btnNestedLoops_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnNestedLoops.Click 'Clear the list ClearList() 'Process an outer loop For intOuterLoop As Integer = 1 To 2 'Process a nested (inner) loop 提示:使用 Loop While 或 Loop Until 循环时,不管怎样,都至少执行一次循环 。 一般来说,最好使用 Do While 或 Do Until 循环,而不使用 Loop While 或 Loop Until 循环。 Visual Basic 2010 入门经典(第 6 版) 100 For intInnerLoop As Integer = 1 To 3 lstData.Items.Add(intOuterLoop.ToString & _ ", " & intInnerLoop.ToString) Next Next End Sub (3) 运行该程序并单击 Nested Loops 按钮,结果如 图 4-23 所示。 示例说明 这些代码相当简单。第1个循环(外循环)是intOuterLoop 从1 迭代到 2,嵌套循环(内循环)是intInnerLoop 从 1 迭代 到 3。在嵌套循环中,有一行代码显示 intOuterLoop 和 intInnerLoop 的当前值: 'Process an outer loop For intOuterLoop As Integer = 1 To 2 'Process a nested (inner) loop For intInnerLoop As Integer = 1 To 3 lstData.Items.Add(intOuterLoop.ToString & _ ", " & intInnerLoop.ToString) Next Next 每个 For 语句都必须与一个 Next 语句配对,而每一个 Next 语句通常“属于”上一个已创建的 For 语句。在本示例中,第 1 个 Next 语句是 1 到 3 的循环,循环的结果为 intInnerLoop 的值增加了。 当 intInnerLoop 为 4 时退出内循环。 当退出内循环时,就遇到另一个 Next 语句。而这个语句属于第 1 个 For 语句,所以 intInnerLoop 递增为 2,于是开始执行第 1 个循环(即外循环)中的第 1 行,在这里是第 2 个 For 语句。此时内循环 重新开始。这个示例嵌套了两个 For…Next 循环,也可嵌套 Do…While 循环,甚至混合嵌套这两种 循环,在一个 For 循环中嵌套两个 Do…Loop 循环,反之也可以。 4.4.4 提前退出循环 有时,可能不希望循环按预先设计的那样执行。例如浏览列表,查找某个特定对象,找到后, 就没有必要再对列表中的其他值进行测试了。 试一试: 提前退出循环 Loops.zip 下面的示例将浏览本地驱动器上的文件夹,并在找到 C:\Program File 时,显示消息并退出。 (1) 回到窗体设计器,向窗体中添加一个Button控件,将其Name属性设置为btnQuittingAForLoop, Text 属性设置为 Quitting A For Loop。 (2) 双击 Quitting A For Loop 按钮,向其 Click 事件处理程序添加如下突出显示的代码: Private Sub btnQuittingAForLoop_Click(ByVal sender As System.Object, _ 图 4-23 第 4 章 流 程 控 制 101 ByVal e As System.EventArgs) Handles btnQuittingAForLoop.Click 'Clear the list ClearList() 'List each folder at the root of your C drive For Each strFolder As String In _ My.Computer.FileSystem.GetDirectories("C:\") 'Add the item to the list lstData.Items.Add(strFolder) 'Do you have the folder C:\Program Files? If String.Compare(strFolder, "c:\program files", True) = 0 Then 'Tell the user MessageBox.Show("Found it, exiting the loop now.", "Loops") 'Quit the loop early Exit For End If Next End Sub (3) 运行该程序并单击 Quitting A For Loop 按钮,结 果如图 4-24 所示。 示例说明 在每次迭代时,我们使用前面介绍的 String. Compare 方法来检测是否有文件夹与 C:\Program Files 相匹配: 'Do you have the folder C:\Program Files? If String.Compare(strFolder, "c:\program files", True) = 0 Then 如果匹配,就首先显示一个消息框: 'Tell the user MessageBox.Show("Found it, exiting the loop now.", "Loops") 在用户单击 OK 按钮关闭此消息框之后,就使用 Exit For 语句退出循环。在这个示例中,循环 会缩短,Visual Basic 2010 将执行 Next 语句后的第 1 行代码。 'Quit the loop early Exit For 当然,如果没有找到匹配的文件夹,循环就会继续执行下去。查找列表中的某一项是循环最常 用的功能之一。一旦发现所找的项,就可以使用 Exit For 语句退出处理列表的循环,这是提高应用 程序性能的一种非常简便的方法。Exit For 语句一次只能退出一个循环,所以如果有嵌套的循环, 应确保退出正确的循环。 假设有一个包含 1000 个项的列表,在第 10 次迭代时找到了需要的项。如果处理完此项之后不 退出循环,计算机就要浏览其余 990 个无用的项。但如果尽早退出循环,就可以继续运行程序的其 他部分。 图 4-24 Visual Basic 2010 入门经典(第 6 版) 102 1. 退出 Do…Loop 循环 可以用相同的方法退出 Do…Loop 循环,如下面的示例所示。 试一试: 退出 Do…Loop 循环 Loops.zip 这个例子使用 Exit Do 退出 Do…Loop 循环。 (1) 回到窗体设计器。向窗体中添加一个Button控件,将其Name属性设置为btnQuitting ADoLoop, Text 属性设置为 Quitting a Do Loop。 (2) 双击 Quitting A Do Loop 按钮,向其 Click 事件处理程序添加如下突出显示的代码: Private Sub btnQuittingADoLoop_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnQuittingADoLoop.Click 'Declare variable Dim intCount As Integer = 0 'Clear the list ClearList() 'Process the loop Do While intCount < 10 'Add the item to the list lstData.Items.Add(intCount.ToString) 'Increment the count by 1 intCount += 1 'Should you quit the loop If intCount = 3 Then Exit Do End If Loop End Sub (3) 运行此项目并单击 Quitting A Do Loop 按钮,结果是一个包含值 0、1 和 2 的列表。 示例说明 由于是 Do…Loop 循环,因而使用的是 Exit Do 而不是 Exit For。但其原理是相同的。Exit Do 可用 于 Do While…Loop 和 Do Until…Loop 循环。 4.4.5 死循环 当创建循环时,可以创建死循环。这类循环的特点是一旦执行,就不会停止,如下面的代码 所示: Dim intX As Integer = 0 Do intX += 1 Loop Until intX = 0 第 4 章 流 程 控 制 103 这个循环将运行一次,接着在第 1 次执行 Loop Until intX = 0 时,intX 是 1。于是再次返回到循 环的开头,把 intX 递增为 2,依此类推。重要的是,intX 永远不会为 0。循环会永远执行下去。这 个程序不会崩溃(至少不会马上崩溃),但它可能没有响应。 如果程序进入了一个死循环,就必须强迫程序停止。如果在 Visual Studio 2010 中运行程序,就 切换到该程序中,在菜单中选择 Debug | Stop Debugging 命令,这将立即停止程序的运行。如果运行 已编译好的程序,就需要使用任务管理器。按住 Ctrl+Alt+Del 组合键,选择 Task Manager(任务管理 器),程序将显示为 Not Responding(无响应),在Task Manager 中选择没有响应的程序,并单击 End Task 按钮,这会打开一个对话框,询问是否要关闭此程序,在这个对话框中再次单击 End Task 按钮。 在一些极个别的示例中,循环可能会需要非常多的处理功能或其他系统资源,因而打不开任务 管理器,也不能切换到 Visual Studio 中。在这种情况下,可以使用这两种方法,也可以重新启动计 算机。 在首次运行应用程序之前,Visual Studio 2010 不会自动保存程序文件,因而如果需要重新启动, 程序代码很可能会丢失。因此,最好在运行代码前保存项目。 4.5 小结 本章详细介绍了程序作出决策及执行循环的各种途径。首先介绍了用于 If 语句中的各种运算符, 探讨了如何使用 And 和 Or 关键字组合多种运算符。另外,还介绍了如何执行不区分大小写的字符 串比较。 接下来介绍的是 Select Case 语句,它对于从一组值中选择一个结果非常有用。之后讨论了程序 中循环的概念和循环的两种主要类型:For 循环和 Do 循环。For 循环迭代给定的次数,而派生的 For Each循环可自动在集合的项列表中进行循环。Do While循环当给定的条件为True 时迭代,而Do Until 循环是当给定的条件为 True 时结束迭代。 读者应从本章学习到如下内容: ● 测试多个条件的 If、ElseIf 和 Else 语句 ● 嵌套的 If 语句 ● 比较运算符和 String.Compare 方法 ● 执行多个比较的 Select Case 语句 ● For…Next 和 For…Each 循环 ● Do…Loop 和 Do While…Loop 语句 表 4-1 对本章讨论的主题进行了总结。 表 4-1 本章主题 主 题 概 念 比较运算符 要比较数据项,可以使用如下运算符:>、>=、<、<=、=、<>、And、Or 使用 If 语句 使用 If 语句作出决策。对于多个决策,也可以使用 If…Else 或 ElseIf 语句。较复杂的决策可以 使用嵌套 If…Else 语句。而简单的决策甚至可以使用单行 If 语句 使用 Select Case 语句 使用 Select Case 语句测试多个可能的值。为了确保找到一个匹配,应使用 Case Else 语句 Visual Basic 2010 入门经典(第 6 版) 104 (续表) 主 题 概 念 使用 For 循环 使用 For 循环,任务可以执行指定的次数。语句 Exit For 用于退出 For 循环 使用 Do 循环 使用 Do 循环,可以在满足某个条件之前执行任务,或者在满足某个条件后停止执行任务。语 句 Exit Do 用于退出 Do 循环 4.6 练习 1. 使用 Select Case 语句时,如何在 Case 语句中包含多个项? 2. Do Until 和 Loop Until Do 循环有什么区别? 3. 在Visual Basic 看来,“Bryan”和“BRYAN”相同吗? 4. 使用 String.Compare 方法时,最后一个参数(布尔参数)有什么作用? 5. 在 Select Case 语句中,如何处理不匹配任何 Case 语句的项? 6. 编写 For Each 循环时,如何反向循环? 7. 哪个关键字用于提前退出循环? 显示对话框 本章主要内容: ● 使用不同的按钮和图标创建消息框 ● 创建用于打开文件的 Open 对话框 ● 创建用于保存文件的 Save 对话框 ● 创建将所选字体应用于文本的 Font 对话框 ● 创建定义和选择定制颜色的 Color 对话框 ● 创建在应用程序中打印文本的 Print 对话框 ● 创建用于浏览文件夹的 Browse 对话框 Visual Basic 2010 提供了一些内置的对话框,以帮助开发人员在前端应用程序内创建丰富的用户 界面。这些对话框提供了大多数 Windows 应用程序中常见的普通用户界面,还提供了许多属性和方 法,以便开发人员自定义既符合自己需求、又保持标准外观的 Windows Forms 应用程序。 本章将深入研究这些对话框,说明如何在 Visual Basic 2010 应用程序中使用它们,为用户构建 具有专业外观的应用程序。 8.1 MessageBox 对话框 MessageBox 对话框是开发人员最常用的对话框之一。这个对话框可以显示自定义的消息,并接 受用户进行选择时输入的内容。该对话框有许多用途—— 可以对消息显示各种不同的图标,也可以 选择要显示的按钮,进而定制这个对话框。 在平时的计算机操作中,我们已经看到过一些消息框,它们的图标如图 8-1 所示。本节将讲述 如何创建和显示使用这些图标的消息框。 图 8-1 第 章 Visual Basic 2010 入门经典(第 6 版) 208 图 8-1 中的第 1 个图标有两个成员名:Asterisk 和 Information。第 2 个图标也有两个成员名: Exclamation 和 Warning。第 3 个图标有 3 个成员名:Error、Hand 和 Stop。第 4 个图标只有一个成 员名:Question。 当构建 Windows 应用程序时,有时需要通过信息或警告来提示用户,以表明有些事情没有发生, 或者发生了一些意料之外的事情。例如,假定应用程序的用户修改了一些数据,并且没有保存数据 就试图关闭该应用程序。此时就可以显示一个消息框,其中包含一个信息或警告图标和适当的消息, 提示他们将丢失未保存的数据。也可以提供 OK 按钮和 Cancel 按钮,让用户继续或取消这次操作。 显示自定义消息、选择图标以及选择按钮时,要快速构建自定义对话框,以提示用户作出决定, 此时就需要用到 MessageBox 对话框。这项功能也允许显示一个消息框,通知用户出现了有效性验 证错误,或者显示通过错误处理所捕获的格式化系统错误。 在编写代码之前,先来看看 MessageBox 类。调用 Show 方法就可以显示 MessagBox 对话框。 所显示的标题、消息、图标和按钮,由传递给该方法的参数确定。MessagBox 看起来很复杂,但使 用起来实际上很简单,如下所述。 8.1.1 MessageBox 中的可用图标 图 8-1 显示的是一些可用的图标。表 8-1 列出了可以在消息框中显示的 4 个标准图标。而实际 显示的图形是操作系统常量的一个函数,4 个独特的符号被赋予了多个成员名。 表 8-1 MessageBox 中的可用图标 成 员 名 说 明 Asterisk 指定消息框显示信息图标 Information 指定消息框显示信息图标 Error 指定消息框显示错误图标 Hand 指定消息框显示错误图标 Stop 指定消息框显示错误图标 Exclamation 指定消息框显示感叹号图标 Warning 指定消息框显示感叹号图标 Question 指定消息框显示问号图标 None 指定消息框不显示任何图标 8.1.2 MessageBox 中的可用按钮 在消息框中还可以显示一些按钮,如表 8-2 所示。 表 8-2 MessageBox 中的可用按钮 成 员 名 说 明 AbortRetryIgnore 指定消息框中显示 Abort、Retry 和 Ignore 按钮 OK 指定消息框中显示 OK 按钮 第 8 章 显示对话框 209 (续表) 成 员 名 说 明 OKCancel 指定消息框中显示 OK 和 Cancel 按钮 RetryCancel 指定消息框中显示 Retry 和 Cancel 按钮 YesNo 指定消息框中显示 Yes 和 No 按钮 YesNoCancel 指定消息框中显示 Yes、No 和 Cancel 按钮 8.1.3 设置默认按钮 除了显示适当的按钮外,还可以给消息框设置默认按钮。这可以让用户读取消息,之后按下 Enter 键,在无需单击按钮的情况下执行为默认按钮指定的操作。表 8-3 列出了一些可用的默认按钮选项。 表 8-3 可用的默认按钮选项 成 员 名 说 明 Button1 将消息框中的第 1 个按钮指定为默认按钮 Button2 将消息框中的第 2 个按钮指定为默认按钮 Button3 将消息框中的第 3 个按钮指定为默认按钮 默认按钮的设置相对于 MessageBox 按钮按从左到右的顺序进行。所以,如果要显示 Yes、No 和 Cancel 按钮,并且要将第 3 个按钮作为默认按钮,那么 Cancel 就是默认按钮。同样,如果想将 第 3 个按钮选为默认按钮,但只有 OK 和 Cancel 按钮,那么第 1 个按钮就成了默认按钮。默认按钮 将突出显示,除非将鼠标指针悬停到其他按钮上。 8.1.4 其他选项 MessageBoxOptions 枚举中有几个选项可用于消息框,如表 8-4 所示。 表 8-4 MessageBoxOptions 中的其他选项 成 员 名 说 明 DefaultDesktopOnly 指定消息框显示在活动桌面上 RightAlign 指定消息框中的文本应右对齐,而不是默认的左对齐 RTLReading 指定消息框中的文本应以 RTL(从右到左)的顺序显示,这只适用于从右到左进行阅读 的语言 ServiceNotification 指定消息框显示在活动桌面上。调用者是通知用户发生了某个事件的 Windows 服务 8.1.5 Show 方法的语法 调用 Show 方法可以显示消息框。下面的代码示例显示了图 8-2 中的消息框。注意,代码指定 显示在消息框中的文本为第 1 个参数,接下来显示标题栏中的文本。然后指定要显示的按钮以及并 排显示的图标的类型。最后,指定想设置为默认按钮的按钮—— 在本例中是 Button1。 Visual Basic 2010 入门经典(第 6 版) 210 图 8-2 前面介绍了一些可用的图标、按钮和默认按钮,下面来看看 MessageBox 类的 Show 方法。Show 方法可以用多种方式指定,比较常用的方式有: ● MessageBox.Show(message text) ● MessageBox.Show(message text, caption) ● MessageBox.Show(message text, caption, buttons) ● MessageBox.Show(message text, caption, buttons, icon) ● MessageBox.Show(message text, caption, buttons, icon, default button) 在上面的示例中,message text 代表要在消息框中显示的消息。该文本可以是静态文本(字面量 类型的字符串值),也可以用字符串变量的形式提供该文本,这个参数是必需的。下面的其他参数是 可选的: ● caption 代表静态文本或字符串变量,该变量用于在消息框的标题栏中显示文本。如果省略 了该参数,标题栏中就不会显示任何文本。 ● buttons 代表 MessageBoxButtons 枚举中的值。该参数可用来指定显示在 MessageBox 对话框 中的可用按钮。如果缺少该参数,对话框中将仅显示一个 OK 按钮。 ● icon 代表 MessageBoxIcon 枚举中的值。该参数可用来指定显示在 MessageBox 对话框中的 可用图标。如果缺少该参数,对话框中就不会显示任何图标。 ● default button 代表 MessageBoxDefaultButton 枚举中的值。该参数可用来指定在 MessageBox 中设置为默认按钮的按钮。如果缺少该参数,对话框中显示的第 1 个按钮就变成了默认按钮。 上面所有的语法示例都从 DialogResult 枚举中返回一个值,以表明选择了 MessageBox 对话框中 的哪个按钮。表 8-5 展示了 DialogResult 枚举中的可用成员。 表 8-5 DialogResult 枚举中的可用成员 成 员 名 说 明 Abort 单击 Abort 按钮后,返回值是 Abort Cancel 单击 Cancel 按钮后,返回值是 Cancel Ignore 单击 Ignore 按钮后,返回值是 Ignore 注意:要运行该代码,先创建一个新的 Windows Forms Application 项目,在设计 器的窗体中双击,生成 Form1_Load 事件,在其中添加下列代码: MessageBox.Show("My Text", "My Caption", _ MessageBoxButtons.OKCancel, MessageBoxIcon.Information, _ MessageBoxDefaultButton.Button1) 第 8 章 显示对话框 211 (续表) 成 员 名 说 明 No 单击 No 按钮后,返回值是 No None 什么也没有返回,表示对话框仍在继续运行,直到单击了某一按钮 OK 单击 OK 按钮后,返回值是 OK Retry 单击 Retry 按钮后,返回值是 Retry Yes 单击 Yes 按钮后,返回值是 Yes 8.1.6 MessageBox 的示例 在 MessageBox 对话框中可以显示多个按钮,所以可以用多种方式来显示对话框并检验结果。 当然,如果只显示一个按钮的消息框来通知用户某个事件,就根本不用检验结果,只需使用一个非 常简单的语法即可。 试一试: 创建包含两个按钮的 MessageBox MessageBox Buttons.zip 下面的示例演示了如何在消息框中显示两个按钮,以及如何通过检验从消息框返回的结果来确 定单击的是哪一个按钮。 (1) 启动 Visual Studio 2010 并从菜单中选择 File | New Project 命令。在 New Project 对话框中, 选择 Templates 窗格中的 Windows Forms Application,在 Name 文本框中输入项目名 MessageBox Buttons。单击 OK 按钮创建该项目。 (2) 在窗体设计器中单击窗体,将其 Text 属性设置为 MessageBox Buttons。 (3) 在窗体中添加一个 Label 控件。该标签上显示的结果取决于用户在消息框中所单击的按钮。 将其 Name 属性设置为 lblResult,Text 属性设置为 Nothing Clicked。 (4) 现在通过工具箱在窗体中添加一个 Button 控件,以显示一个消息框。将这个按钮的 Name 属性设置为 btn2Buttons,Text 属性设置为 2 Buttons。 (5) 双击该按钮,并在其 Click 事件处理程序中添加如下突出显示的代码: Private Sub btn2Buttons_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btn2Buttons.Click If MessageBox.Show("Your Internet connection will now be closed.", _ "Network Notification", MessageBoxButtons.OKCancel, _ MessageBoxIcon.Information, MessageBoxDefaultButton.Button1) _ = Windows.Forms.DialogResult.OK Then lblResults.Text = "OK Clicked" 'Call some method here Else lblResults.Text = "Cancel Clicked" 'Call some method here End If End Sub (6) 单击工具栏上的 Save All 按钮保存该项目。 Visual Basic 2010 入门经典(第 6 版) 212 (7) 运行该项目,然后单击“2 Buttons”按钮,显示的消息框如图 8-3 所示。 图 8-3 示例说明 这段代码使用了 MessageBox 类的 Show 方法,并且使用了 If…End If 语句来确定用户是否单击 了 OK 按钮: If MessageBox.Show("Your Internet connection will now be closed.", _ "Network Notification", MessageBoxButtons.OKCancel, _ MessageBoxIcon.Information, MessageBoxDefaultButton.Button1) _ = Windows.Forms.DialogResult.OK Then 代码指定在对话框中显示 OK 和 Cancel 按钮,而且 OK 按钮是默认按钮。 必须为图标参数指定一些内容,因为在设置默认按钮参数时,这是必需的。本例不想显示图标, 因此使用了 Nothing 关键字。 还需注意,这里利用 Windows.Forms.DialogResult.OK 来检验从 MessageBox 对话框返回的结果, 也可以选择检验 Windows.Forms.DialogResult.Cancel,方法是在 If…End If 语句中使用它。 如果只想测试一个或两个按钮的结果,利用这种方式很不错。但如果要测试包含了 3 个按钮的 MessageBox 对话框的结果,该怎么办呢? 试一试: 测试包含 3 个按钮的 MessageBox MessageBox Buttons.zip 这个例子说明了如何在 MessageBox 对话框中显示 3 个按钮,以及如何确定单击了哪个按钮。 (1) 如果项目正在运行,就关闭它。打开 Form1 的窗体设计器。 (2) 添加另一个 Button 控件,将其 Name 属性设置为 btn3Buttons,Text 属性设置为 3 Buttons。 双击该按钮并向其 Click 事件处理程序添加如下突出显示的代码: Private Sub btn3Buttons_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btn3Buttons.Click 'Declare local variable Dim intResult As DialogResult 'Get the results of the button clicked intResult = _ MessageBox.Show("Do you want to save changes to New Document?", _ "My Word Processor", MessageBoxButtons.YesNoCancel, _ MessageBoxIcon.Warning, MessageBoxDefaultButton.Button3) 'Process the results of the button clicked Select Case intResult 第 8 章 显示对话框 213 Case Windows.Forms.DialogResult.Yes lblResults.Text = "Yes Clicked" 'Do yes processing here Case Windows.Forms.DialogResult.No lblResults.Text = "No Clicked" 'Do no processing here Case Windows.Forms.DialogResult.Cancel lblResults.Text = "Cancel Clicked" 'Do cancel processing here End Select End Sub (3) 运行该项目并单击“3 Buttons”按钮。图 8-4 所示的 MessageBox 对话框显示了一个图标和 3 个按钮。其中第 3 个按钮是默认按钮。 图 8-4 示例说明 Show 方法返回 DialogResult,这是一个整型值。当消息框中有 3 个按钮时,需要捕获整型变量 DialogResult,然后测试这个变量。 在上面的示例代码中,首先把一个变量声明为 DialogResult,以便捕获从 MessageBox 对话框中 返回的 DialogResult。记住从 MessageBox 对话框中返回的结果仅仅是一个整型值的枚举。然后在这 个变量中设置 DialogResult: 'Declare local variable Dim intResult As DialogResult 'Get the results of the button clicked intResult = _ MessageBox.Show("Do you want to save changes to New Document?", _ "My Word Processor", MessageBoxButtons.YesNoCancel, _ MessageBoxIcon.Warning, MessageBoxDefaultButton.Button3) 最后在 Select Case 语句中测试 intResult 的值,并执行相应的操作: 'Process the results of the button clicked Select Case intResult Case Windows.Forms.DialogResult.Yes lblResults.Text = "Yes Clicked" 'Do yes processing here Case Windows.Forms.DialogResult.No lblResults.Text = "No Clicked" 'Do no processing here Case Windows.Forms.DialogResult.Cancel Visual Basic 2010 入门经典(第 6 版) 214 lblResults.Text = "Cancel Clicked" 'Do cancel processing here End Select 在每个 Case 语句中,将所选按钮的名称写到标签中,以表明单击的是哪一个按钮。 初步认识了 MessageBox 对话框的工作方式及其语法后,要进一步熟悉 MessageBox,可以修改 上一个示例中的 message text、caption、buttons、icon 和 default button 参数的值。 8.2 OpenFileDialog 控件 大多数 Windows 应用程序都处理文件中的数据,所以需要一个接口来打开并保存文件。.NET Framework 提供了 OpenFileDialog 和SaveFileDialog 类来完成此任务。本节介绍 OpenFileDialog 控件, 下一节介绍 SaveFileDialog 控件。 使用 Windows 应用程序时,例如 Word 或 Paint,可以看到相同标准的 Open 对话框。这并不是 偶然的,每个开发人员都可以使用 API 标准集,以提供这种类型的标准接口。不过,对于初学者而 言,使用 API 比较麻烦,而且较难。幸运的是,这个功能的大部分已经内置到.NET Framework 中, 所以在使用 Visual Basic 2010 开发程序时可以使用它。 8.2.1 OpenFileDialog 控件 可以把 OpenFileDialog 用作一个.NET 类:在代码中声明该类型的一个变量,并修改其属性。也 可以把它用作一个控件:在设计时把它的一个实例拖放到窗体上。无论采用哪种方式,得到的对象 都拥有相同的方法、属性和事件。 OpenFileDialog 控件位于工具箱的 Dialogs 类别下,可以将它从工具箱拖放到窗体中。然后,设 置其属性并执行适当的方法。要把 OpenFileDialog 用作一个类,应声明一个该类型的对象,以使用 对话框。之后就可以控制对话框,在需要时,为它声明一个对象,使用它,之后销毁它,释放资源。 本小节将关注如何把 OpenFileDialog 用作控件。理解了这个对话框,并能使用它之后,就可以 扩充知识,为 OpenFileDialog 声明一个对象,把 OpenFileDialog 用作一个类。第 11 章会详细介绍如 何使用类和对象。 要使用 OpenFileDialog,可以调用它的 ShowDialog 方法,产生的与结果图 8-5 类似。 警告:不要滥用 MessageBox 对话框,不要为每一个小事都显示消息框, 用户很 讨厌这种事情。必须运用常识和良好的判断力来决定何时需要显示 MessageBox 对话 框。当需要通知用户发生了某种类型的错误,或者需要警告用户, 他们请求的某种动 作可能有破坏性时,才有必要显示 MessageBox 对话框。例如, 如果用户没有保存他 们的工作就关闭应用程序,就要提示用户,如果他们继续下去, 就会丢失未保存的内 容,并给出选项,让他们选择是继续还是取消关闭应用程序这个操作。 第 8 章 显示对话框 215 图 8-5 8.2.2 OpenFileDialog 的属性 图 8-5 所示的对话框是 Windows Vista 中标准的 Open 对话框,它没有提供过滤功能,因此对话 框中列出了所有的文件类型,我们也不能指定文件类型,这时就要使用 OpenFileDialog 的属性了。 在显示 Open 对话框之前,可以设置其中的一些属性,定制对话框,使之满足自己的需求。 表 8-6 列出了 OpenFileDialog 控件中一些可用的属性。 表 8-6 OpenFileDialog 控件的可用属性 属 性 说 明 AddExtension 如果用户省略了扩展名,该属性指定是否自动给文件名添加扩展名。该属性主 要用在 SaveFileDialog 控件中 AutoUpgradeEnabl- ed 表明在 Windows 的不同版本上运行时,该对话框是否自动更新其外观和行为。 该属性为 false 时,显示为 Windows XP 样式 CheckFileExists 如果用户指定一个不存在的文件名,该属性指定对话框是否显示警告 CheckPathExists 如果用户指定一个不存在的路径,该属性指定对话框是否显示警告 DefaultExt 表明默认的文件扩展名 DereferenceLinks 和快捷方式一起使用,表明对话框是否返回快捷方式所引用的文件位置,或者 是否返回快捷方式自身的位置 FileName 表明对话框中所选文件的路径和文件名 FileNames 表明对话框中所有所选文件的路径和文件名,这是一个只读属性 Filter 表明当前文件名的过滤字符串,确定显示在对话框“Files of type:”组合框中的 选项 Visual Basic 2010 入门经典(第 6 版) 216 (续表) 属 性 说 明 FilterIndex 表明对话框中当前所选过滤器的索引 InitialDirectory 表明显示在对话框中的初始目录 MultiSelect 表明对话框是否允许选择多个文件 ReadOnlyChecked 表明是否选择只读复选框 SafeFileName 表明对话框中所选文件的文件名 SafeFileNames 表明对话框中所有所选文件的文件名,这是一个只读属性 ShowHelp 表明 Help 按钮是否显示在对话框中 ShowReadOnly 表明对话框是否包含了只读复选框 SupportMultiDottedExtensions 表明对话框是否支持显示和保存有多个文件扩展名的文件 Title 表明是否在对话框的标题栏中显示标题 ValidateNames 表明对话框是否仅接受有效的 WIN32 文件名 8.2.3 OpenFileDialog 的方法 OpenFileDialog 类中有许多可用的方法,但本小节只介绍示例中的 ShowDialog 方法。下面列出 了 OpenFileDialog 中的其他一些可用方法: ● Dispose:释放 Open 对话框使用的资源。 ● OpenFile:用只读权限打开用户所选的文件,该文件由 FileName 属性指定。 ● Reset:将 Open 对话框的所有属性设置为默认值。 ● ShowDialog:显示对话框。 ShowDialog 方法很简单,因为它要么不带参数,要么接受 Me 关键字形式的对话框的所有者。 所以,在调用 ShowDialog 方法之前,必须设置需要的所有属性。返回对话框后,可以查询这些属性 以确定选择了什么文件、目录,以及所选文件的类型。下面的代码段是 ShowDialog 方法的一个示例: OpenFileDialog1.ShowDialog() OpenFileDialog 控件返回的 DialogResult 是 OK 或 Cancel,OK 对应于对话框中的 Open 按钮。 这个控件不会打开和读入文件,它只是一个通用的接口,允许用户定位和指定由应用程序打开的文 件。在用户单击 Open 按钮以确定要打开的文件后,需要查询控件所设置的 OpenFileDialog 属性。 8.2.4 使用 OpenFileDialog 控件 学习了 OpenFileDialog 控件后,下面就运用这些知识编写一个使用 OpenFileDialog 控件的程序。 试一试: 使用 OpenFileDialog Windows Forms Dialogs.zip 下面这个程序将使用 OpenFileDialog 控件来显示 Open File 对话框。我们将通过该对话框来定位 并选择文本文件,然后使用 My.Computer.FileSystem 名称空间将文件的内容读入到窗体的文本框中。 (1) 创建一个新的 Windows Forms Application 项目,命名为 Windows Forms Dialogs。 第 8 章 显示对话框 217 (2) 给窗体起一个新的名称,在 Solution Explorer 中,右击 Form1.vb 并从上下文菜单中选择 Rename,然后输入新名称 Dialogs.vb。设置窗体的属性值,如下所示: ● 将 Size 属性设置为 460, 300 ● 将 StartPosition 属性设置为 CenterScreen ● 将 Text 属性设置为 Dialogs (3) 要将文件的内容读入文本框,就要先给窗体添加一个文本框。还要给窗体添加一个按钮, 以便随意调用 Open File 对话框。给窗体添加这两个控件,并设置它们的属性,如下所示: ● 将文本框命名为 txtFile,设置如下属性:Anchor = Top,Bottom,Left,Right;Location = 13, 13;MultiLine = True;ScrollBars=Vertical;Size = 330, 232。 ● 将 Button 控件命名为 btnOpen,设置如下属性:Anchor = Top,Right;Location = 349,13; Text = Open。 (4) 在窗体中放置好控件,并设置好它们的属性之后,结果如图 8-6 所示。 图 8-6 (5) 在工具箱中,向下滚动,找到 Dialogs 类别中的 OpenFileDialog 控件,然后将它拖放到窗体 上。该控件会添加到 IDE 中工作区的底部。 这时,可以在工作区的控件上单击,然后在 Properties 窗格给这个控件设置各种属性。不过, 在此使用该控件的默认名称和默认属性,以后再在代码中设置各种属性。 (6) 切换到窗体的代码编辑器。然后声明一个将包含文件名的字符串变量。在后面的代码中, 可以将该变量设置为 Open File 对话框中的实际路径和文件名: Public Class Dialogs 'Declare variable Private strFileName As String 提示:在这个示例中锚定控件的原因是,当调整或最大化窗体时, 文本框也应相 应地调整大小,以便与窗体大小相称,而按钮会停靠在右上角。 现在可以运行这个项 目,调整窗体的大小对此进行测试。 Visual Basic 2010 入门经典(第 6 版) 218 (7) 现在,在 btnOpen 按钮的 Click 事件中编写一些代码。在代码编辑器顶部的 Class Name 组 合框中选择 btnOpen,在 Method Name 组合框中选择 Click 事件。向 Click 事件处理程序添加如下突 出显示的代码: Private Sub btnOpen_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles btnOpen.Click 'Set the Open dialog properties With OpenFileDialog1 .Filter = "Text Documents (*.txt)|*.txt|All Files (*.*)|*.*" .FilterIndex = 1 .Title = "Demo Open File Dialog" End With 'Show the Open dialog and if the user clicks the Open button, 'load the file If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then Try 'Save the file path and name strFileName = OpenFileDialog1.FileName Catch ex As Exception MessageBox.Show(ex.Message, My.Application.Info.Title, _ MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End If End Sub (8) 在此,需要使用 Visual Studio 2010 自带的一些预先创建好的代码段。在 Try…Catch 语句块 之前的空白处右击并从上下文菜单中选择 Insert Snippet。在出现的下拉列表中双击 Fundamentals- Collections、Data Types、File System 和 Math 选项,然后在新列表中双击 File System-Processing Drives 和 Folders and Files 选项,最后向下滚动列表,双击 Read Text from a File 选项。此时的代码应如下所 示,注意代码中的文件名 C:\Test.txt 是高亮显示的,这说明需要对这段代码进行修改: Try 'Save the file path and name strFileName = OpenFileDialog1.FileName Dim fileContents As String fileContents = My.Computer.FileSystem.ReadAllText("C:\Test.txt") Catch ex As Exception (9) 修改 Try 代码块中的代码,如下所示。用 strFileName 替换 C:\Test.txt,再添加如下代码,以 显示文本文件的内容: Try 'Save the file path and name strFileName = OpenFileDialog1.FileName Dim fileContents As String fileContents = My.Computer.FileSystem.ReadAllText(strFileName) 'Display the file contents in the text box txtFile.Text = fileContents Catch ex As Exception 第 8 章 显示对话框 219 (10) 单击工具栏上的 Save All 按钮保存该项目。 (11) 运行该项目,一旦显示了窗体,就单击 Open 按钮打开 Open File 对话框。注意该对话框标 题栏中所出现的定制标题就是在代码中指定的标题。如果单击 File filter 组合框,就会出现两个过滤 器。单击第 2 个过滤器可以查看当前目录中的所有文件。 (12) 定位到计算机上的一个文本文件并选择它。然后单击 Open 按钮打开该文本文件,将其内 容放到窗体的文本框中,如图 8-7 所示。 图 8-7 (13) 对项目进行最后的测试,关闭该应用程序,然后再次打开它。单击窗体上的 Open 按钮, 注意,Open File 对话框打开的目录是选择上一个文件时的目录。对此,不必编写任何代码。 示例说明 在显示 Open File 对话框之前,需要设置 OpenFileDialog1 的一些属性,给应用程序定制对话框, 这可以通过 With…End With 语句来完成。With…End With 语句允许对单个对象进行重复引用,而无 需指定对象的名称。用 With 语句指定一次对象名称后,在 End With 语句前,就给该对象的所有属 性都添加了引用: With OpenFileDialog1 首先要设置的属性是 Filter 属性。这个属性允许定义在对话框右下角的 File filter 组合框中显示 的过滤器。当定义文件扩展名过滤器时,可以在文件扩展名后加上一条竖线(|),描述该过滤器。当 希望 Filter 属性包含多个文件扩展名时,可以用竖线分隔每个文件过滤器,如下面的代码所示: .Filter = "Text Documents (*.txt)|*.txt|All Files (*.*)|*.*" 要设置的下一个属性是 FilterIndex。这个属性确定在 File filter 组合框中显示哪个过滤器。这个 属性的默认值是 1,即第 1 个过滤器: .FilterIndex = 1 最后设置 Title 属性,该属性的值是显示在对话框标题栏中的标题: .Title = "Demo Open File Dialog" Visual Basic 2010 入门经典(第 6 版) 220 本例使用 ShowDialog 方法来显示 Open File 对话框。记住,ShowDialog 方法返回一个 DialogResult 值,由于只有两个可能的结果,因此可以将 ShowDialog 方法返回的结果与 Windows.Forms. DialogResult.OK 和 Windows.Forms.DialogResult.Cancel 进行比较。如果用户单击对话框中的 Open 按钮,ShowDialog 方法就返回 OK;如果用户单击 Cancel 按钮,ShowDialog 方法就返回 Cancel: If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then 接着,添加 Try…Catch 代码块来处理在打开文件时可能发生的错误。在 Try 代码块中,获取用 户在 Open File 对话框中选择的路径和文件名,并在 strFileName 变量中设置它。路径和文件名包含 在 OpenFileDialog 控件的 FileName 属性中: 'Save the file name strFileName = OpenFileDialog1.FileName 下一步,使用 Read Text from a File 代码段,利用 Visual Studio 2010 提供的内置代码段简化编程 任务。这个代码段包含的代码用于读取文本文件中的内容,并将这些内容放在一个字符串变量中。 然后,通过提供如下突出显示的 strFileName 变量修改这段代码,使之将文本文件的所有内容都 读入到 fileContents 变量中: Dim fileContents As String fileContents = My.Computer.FileSystem.ReadAllText(strFileName) 最后一行代码提取 allText 变量的内容,并将其放到 TextBox 控件的 Text 属性中,这样文本框中 就会填充文本文件的内容: 'Display the file contents in the text box txtFile.Text = fileContents Catch 代码块中的代码使用 MessageBox 类来显示错误发生时抛出异常的 Message 属性的值。 MessageBox 类的 caption 属性从 My.Application.Info 对象的 Title 属性处获取应用程序的标题: Catch ex As Exception MessageBox.Show(ex.Message, My.Application.Info.Title, _ MessageBoxButtons.OK, MessageBoxIcon.Error) End Try 本章没有介绍 OpenFileDialog 控件中的许多其他属性,但用户很容易就可以在自己的窗体中实 践它们,以了解这个对话框提供的所有功能。 8.3 SaveFileDialog 控件 使用 OpenFileDialog 控件可以打开文件,下面介绍 SaveFileDialog 控件,它可以用于保存文件。 和 OpenFileDialog 一样,SaveFileDialog 也可以用作控件或类。如果学会了如何将 SaveFileDialog 用 作控件,将它用作类也就不存在任何问题了。 打开一个文件后,需要对它进行一些修改并保存它。SaveFileDialog 控件提供的功能和 OpenFileDialog 相同,但操作顺序相反。在保存文件时,该控件允许选择文件保存的位置和文件名。 重点需要注意的是:SaveFileDialog 控件实际上不会保存文件,它只是提供一个对话框,让用户指定 第 8 章 显示对话框 221 文件的保存位置和文件名。 8.3.1 SaveFileDialog 的属性 表 8-7 列出了 SaveFileDialog 控件中的一些可用属性。可以看出,该控件(或类)包含了很多可用 于定制对话框行为的属性。 表 8-7 SaveFileDialog 控件的常用属性 属 性 说 明 AddExtension 如果省略了扩展名,该属性指定是否自动将扩展名添加到文件名之后 AutoUpgradeEnabled 表明在 Windows 的不同版本上运行时,该对话框是否自动升级其外观和行为。该 属性为 false 时,对话框显示为 Windows XP 样式 CheckFileExists 如果指定了一个不存在的文件名,该属性指定对话框是否显示警告。这在用户以 现有的名称保存文件时是很有用的 CheckPathExists 如果指定了一个不存在的路径,该属性指定对话框是否显示警告 CreatePrompt 如果指定了一个不存在的文件,该属性指定对话框是否允许用户创建文件 DefaultExt 表明默认的文件扩展名 DereferenceLinks 表明对话框是返回快捷方式引用的文件位置,还是返回快捷方式自身的位置 FileName 表明对话框中所选文件的名称,这是一个只读属性 FileNames 表明对话框中所有所选文件的名称,这是一个只读属性,返回一个字符串数组 Filter 表明当前文件名过滤器字符串,确定出现在对话框 Files of type:组合框中的选项 FilterIndex 表明对话框中当前所选过滤器的索引 InitialDirectory 表明对话框中显示的初始目录 OverwritePrompt 如果指定了一个已经存在的文件名,该属性指定对话框是否显示警告 ShowHelp 表明 Help 按钮是否显示在对话框中 SupportMultiDottedExtensions 表明对话框是否支持显示和保存有着多个文件扩展名的文件 Title 表明在对话框的标题栏上是否显示标题 ValidateNames 指定对话框是否只接受有效的 WIN32 文件名 8.3.2 SaveFileDialog 的方法 SaveFileDialog 控件的方法和 OpenFileDialog 控件相同。如果想回顾这些方法,可参阅 8.2.3 节 “OpenFileDialog 的方法”。本书所有的示例都使用 ShowDialog 方法来显示 Save File 对话框。 8.3.3 使用 SaveFileDialog 控件 在下面这个示例中,希望将文本框中的内容保存到文件中。 本例用 SaveFileDialog 控件来显示 Save File 对话框,以指定文件名和文件的保存位置。然后将 窗体上文本框中的内容写入到一个指定的文件中,这里再次使用了 Visual Studio 2010 提供的内置代 码段。 Visual Basic 2010 入门经典(第 6 版) 222 试一试: 使用 SaveFileDialog 控件 Windows Foms Dialogs.zip 为了解如何在项目中使用 SaveFileDialog 控件,下面以上一个示例中的 Windows Forms Dialogs 项目作为起点,编写另一个示例。 (1) 回到 Windows Foms Dialogs 项目中的窗体设计器。 (2) 从工具箱中拖放另一个 Button 控件至 Open 按钮下,并设置它的属性,如下所示: ● 将 Name 属性设置为 btnSave ● 将 Anchor 属性设置为 Top, Right ● 将 Location 属性设置为 349,43 ● 将 Text 属性设置为 Save (3) 在工具箱中,向下滚动,找到 SaveFileDialog 控件,然后将它拖放到窗体上。该控件会添加 到 IDE 工作区的底部。 (4) 双击 Save 按钮,打开它的 Click 事件,添加如下突出显示的代码: Private Sub btnSave_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnSave.Click 'Set the Save dialog properties With SaveFileDialog1 .DefaultExt = "txt" .FileName = strFileName .Filter = "Text Documents (*.txt)|*.txt|All Files (*.*)|*.*" .FilterIndex = 1 .OverwritePrompt = True .Title = "Demo Save File Dialog" End With 'Show the Save dialog and if the user clicks the Save button, 'save the file If SaveFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then Try 'Save the file path and name strFileName = SaveFileDialog1.FileName Catch ex As Exception MessageBox.Show(ex.Message, My.Application.Info.Title, _ MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End If End Sub (5) 在 Try…Catch 代码块之间的空白处右击,并从上下文菜单中选择 Insert Snippet。在出现的 下拉列表中双击 Fundamentals-Collections、Data Types、File System 和 Math 选项,然后在新列表中 双击 File System-Processing Drives 和 Folders and Files 选项,最后向下滚动列表,双击 Write Text to a File 选项。此时的代码应该如下所示,注意其中的文件名 C:\Test.txt 和文本字符串 Text 是高亮显示 的,这说明需要对这段代码进行修改: Try 'Save the file path and name 第 8 章 显示对话框 223 strFileName = SaveFileDialog1.FileName My.Computer.FileSystem.WriteAllText("C:\Test.txt", "Text", True) Catch ex As Exception (6) 修改 Try 代码块中的代码,如下所示: Try 'Save the file path and name strFileName = SaveFileDialog1.FileName My.Computer.FileSystem.WriteAllText(strFileName, txtFile.Text, False) Catch ex As Exception (7) 现在,准备测试这段代码,运行该项目。先从简单的测试开始。在窗体的文本框中输入一 些文本,然后单击 Save 按钮。这会打开 Save 对话框。注意 File Name 组合框中已经有了完整的路 径和文件名。这是在上一个示例中声明 strFileName 变量时,在其中设置的文件名。 (8) 输入另一个文件名,但不要提供文件扩展名。然后单击 Save 按钮,就保存了这个文件。为 了验证这一点,单击窗体中的 Open 按钮,打开 Open File 对话框,就会看到这个新文件。 (9) 为了测试 SaveFileDialog 控件的 OverwritePrompt 属性,在窗体的文本框中输入一些文本, 然后单击 Save 按钮。在 Save File 对话框中,选择一个已有的文件名,然后单击 Save 按钮。程序就 会提示用户确认是否替换现有文件,如图 8-8 所示。如果选择了 Yes,该对话框返回的 DialogResult 就是 OK,并执行 If…End If 语句之间的代码。如果选择了 No,就会返回到 Save File 对话框,可以 输入另一个文件名。 图 8-8 示例说明 在显示 Save File 对话框之前,需要设置一些属性,以便对应用程序中的对话框进行定制。我们 设置的第一个属性是 DefaultExt。如果没有指定文件的扩展名,这个属性会自动设置文件的扩展名。 例如,如果指定了一个文件名 NewFile,但没有扩展名,该对话框就在返回时自动给文件名添加.txt, 得到的文件名就是 NewFile.txt。 .DefaultExt = "txt" 提示:显示 Open File 或 Save File 对话框时,可以使用其上下文菜单。例如, 可 以剪切、复制和粘贴文件,也可以将它们重命名和删除。上下文菜单中还有 其他的选 项,它们取决于所安装的软件。例如,如果安装了 WinZip,就会在上下文菜单中看到 WinZip 选项。 Visual Basic 2010 入门经典(第 6 版) 224 FileName 属性设置的路径和文件名与从 Open File 对话框返回的相同。这样就可以打开并编辑 文件,然后在显示 Save File 对话框时,显示相同的文件名。当然,也可以在应用程序的 Save File 对话框中覆盖这个文件名: .FileName = strFileName 接下来的两个属性与 OpenFileDialog 控件中的一样,它们设置显示在“Save as type:”组合框中 的文件扩展名过滤器,并设置初始过滤器: .Filter = "Text Documents (*.txt)|*.txt|All Files (*.*)|*.*" .FilterIndex = 1 OverwritePrompt 属性接受布尔值 True 或 False。设置为 True 时,如果选择了已有的文件名,这 个属性会用 MessageBox 对话框提示用户;如果选择了 Yes,Save File 对话框返回的 DialogResult 就 是 OK;如果选择了 No,就返回 Save File 对话框,选择另一个文件名。当 OverwritePrompt 属性设 置为 False 时,系统不会提示覆盖已有的文件,即无需获得用户的许可,代码就会覆盖已有的文件: .OverwritePrompt = True Title 属性用于设置 Save File 对话框标题栏上的标题: .Title = "Demo Save File Dialog" 设置完属性后,显示这个对话框。SaveFileDialog 控件的 ShowDialog 方法也会返回 DialogResult, 因此,可以在 If…End If 语句中使用 SaveFileDialog 控件,测试返回值。 如果用户单击 Save File 对话框中的 Save 按钮,对话框返回的 DialogResult 就是 OK。如果用户 单击对话框中的 Cancel 按钮,对话框返回的 DialogResult 就是 Cancel。下面的代码用于测试 Windows.Forms.DialogResult.OK: If SaveFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then 这段代码首先在 strFileName 变量中保存用户所选的路径和文件名。实现这一操作的前提条件是 用户已在 Save File 对话框选择了一个新的文件名。 Try 'Save the file path and name strFileName = SaveFileDialog1.FileName 然后利用变量替换突出显示的文本,从而修改 Visual Studio 2010 生成的代码段。首先利用变量 strFileName 替换文本"C:\test.txt",这样会打开用于输出的文件。接着利用窗体上文本框的 Text 属性 替换文本"text"。最后一行代码读取文本框的内容并将其写入到文件中,这行代码末尾的 False 参数 指示文本是否应追加到文件中。False 参数的值指示应该覆盖文件的内容: My.Computer.FileSystem.WriteAllText(strFileName,txtFile.Text, False) If…End If 代码块最后的代码仅仅封装了 Try…Catch 语句块和 If…End If 语句。 Catch ex As Exception MessageBox.Show(ex.Message, My.Application.Info.Title, _ MessageBoxButtons.OK, MessageBoxIcon.Error) 第 8 章 显示对话框 225 End Try End If 8.4 FontDialog 控件 有时需要编写如下应用程序:允许用户选择显示或输入数据所使用的字体,或者查看某个系统 下安装的所有可用字体。这时就要用到 FontDialog 控件了,它在一个用户熟悉的标准对话框内,显 示了安装在系统中所有可用字体的列表。 与 OpenFileDialog 和 SaveFileDialog 控件一样,FontDialog 也可以用作控件(方法是拖放到窗体 上)或类(方法是在代码中声明)。 FontDialog 控件使用起来很简单,只需设置一些属性,显示对话框,然后查询所需的属性。 8.4.1 FontDialog 的属性 表 8-8 列出了 FontDialog 的一些可用属性。 表 8-8 FontDialog 控件的可用属性 属 性 说 明 AllowScriptChange 表明用户是否能改变 Script 下拉列表中指定的字符集,以显示非当前显示的字符集 Color 表明所选字体的颜色 Font 表明所选的字体 FontMustExist 如果用户试图输入不存在的字体或样式,该属性表明对话框是否指定错误条件 MaxSize 表明用户可以选择的最大字号(单位是点) MinSize 表明用户可以选择的最小字号(单位是点) ShowApply 表明对话框是否包含 Apply 按钮 ShowColor 表明对话框是否显示颜色选项 ShowEffects 表明对话框是否包含允许用户指定删除线、下划线和文本颜色的选项 ShowHelp 表明对话框是否显示 Help 按钮 8.4.2 FontDialog 的方法 在接下来的示例中,只使用 FontDialog 的一个方法(ShowDialog)。其他可用的方法还有 Reset, 它可以将所有的属性重置为默认值。 8.4.3 使用 FontDialog 控件 显示 FontDialog 控件时,无需设置任何属性: FontDialog1.ShowDialog() 对话框如图 8-9 所示。 注意,Font 对话框包含了 Effects 部分,允许用户检验使用 Strikeout 和 Underline 选项的效果。 不过,在默认情况下,不提供字体的颜色选项。如果需要提供颜色选项,就必须在调用对话框的 Visual Basic 2010 入门经典(第 6 版) 226 ShowDialog 方法之前设置 ShowColor 属性,如下所示: FontDialog1.ShowColor = True FontDialog1.ShowDialog() 图 8-9 这个对话框的 ShowDialog 方法与前面介绍的 ShowDialog 方法一样,也返回 DialogResult,即返 回 DialogResult.OK 或 DialogResult.Cancel。 对话框返回后,可以查询 Font 和 Color 属性,看看用户选择了哪种字体和颜色。然后将这些属 性应用于窗体上的控件,或者将它们保存到变量中以备将来使用。 试一试: 使用 FontDialog 控件 Windows Forms Dialogs.zip 了解了 Font 对话框的外观,以及如何调用它之后,就可以在下面的示例中使用它。这个示例将 使用前两个示例中的程序,打开一个文件,并将文件内容读入窗体的文本框中。然后使用 Fontdialog 控件显示 Font 对话框,选择字体。最后将文本框中的字体改为我们所选的字体。 (1) 回到 Windows Forms Dialogs 项目中的窗体设计器。 (2) 通过工具箱添加另一个按钮,依据下面的值来设置它的属性: ● 将 Name 属性设置为 btnFont ● 将 Anchor 属性设置为 Top,Right ● 将 Location 属性设置为 370,73 ● 将 Text 属性设置为 Font (3) 还要给项目添加 FontDialog 控件,在工具箱中找到该控件,并将它拖放到窗体上或窗体下 面的工作区中。如果是拖放到窗体上,该控件会自动放在窗体下面的工作区中。使用该控件的所有 默认属性。 (4) 给 Font 按钮的 Click 事件处理程序添加下列代码: 第 8 章 显示对话框 227 Private Sub btnFont_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnFont.Click 'Set the Font dialog properties FontDialog1.ShowColor = True 'Show the Font dialog and if the user clicks the OK button, 'update the font and color in the text box If FontDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then txtFile.Font = FontDialog1.Font txtFile.ForeColor = FontDialog1.Color End If End Sub (5) 运行该项目,窗体显示后,单击 Font 按钮,显示 Font 对话框,如图 8-10 所示。选择新字 体和颜色,然后单击 OK 按钮。 图 8-10 (6) 在窗体的文本框中添加一些文本,该文本会用刚才所选的新字体和颜色显示出来。 (7) 这些字体和颜色还会应用到从文件加载的文本上。为了证明这一点,单击窗体上的 Open 按 钮,打开一个文本文件。文件的文本会以 Font 对话框中所选的字体和颜色显示出来。 示例说明 在默认情况下,Font 对话框不显示 Color 组合框,所以先将 FontDialog 控件的 ShowColor 属性 设置为 True,以显示 Color 组合框,如下所示: 'Set the Font dialog properties FontDialog1.ShowColor = True 下一步,显示 Font 对话框。记住,DialogResult 返回值 OK 或 Cancel,因此可以将 FontDialog 控 件返回的值与 Windows.Forms.DialogResult.OK 进行比较。如果用户单击的是 OK 按钮,就执行 If…End If 语句中的代码: 'Show the Font dialog and if the user clicks the OK button, AnyColor 表明对话框是否显示基本颜色组中的所有可用颜色 AllowFullOpen 表明用户是否能用对话框来自定义颜色 属 性 说 明 表 8-9 ColorDialog 控件的一些可用属性 在深入研究代码之前,先来看一下 ColorDialog 控件的一些可用属性,如表 8-9 所示。 8.5.1 ColorDialog 的属性 因为他们可以根据自己的偏好调整应用程序的外观了。 在应用程序中进行这样的定制,可以灵活地给应用程序提供更专业的外观,用户也会很高兴, 图 8-11 图 8-12 ٛ 中的 Define Custom Colors 按钮时,就可以调整颜色以满足自己的需求,如图 8-12 所示。 注意,用户也可以自定义颜色,这给应用程序增加了更多的灵活性。当用户单击 Color 对话框 ColorDialog 控件允许用户选择 48 种基本颜色,如图 8-11 所示。 件也可以用作一个类,方法就是在代码中声明它,而不是把一个控件拖放到窗体设计器中。 中文本的颜色。Visual Basic 2010 提供的 ColorDialog 控件可以满足这些需求。同样,ColorDialog 控 有时需要让用户自定义窗体上的颜色。该颜色可能是窗体自身或控件的颜色,也可能是文本框 8.5 ColorDialog 控件 含任何文本,新输入或加载到文本框中的文本也会使用新的字体和颜色。 完文本框的这些属性后,文本框中现有的文本就会自动更新为新的字体和颜色。即使文本框中不包 体。然后将文本框的 ForeColor 属性设置为 FontDialog 控件的 Color 属性,即用户所选的颜色。修改 将文本框(txtFile)的 Font 属性和 FontDialog 控件的 Font 属性设置成一样的值,即用户所选的字 End If txtFile.ForeColor = FontDialog1.Color txtFile.Font = FontDialog1.Font If FontDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then 'update the font and color in the text box 228 Visual Basic 2010 入门经典(第 6 版) If ColorDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then 'update the background color of the form 'Show the Color dialog and if the user clicks the OK button, ByVal e As System.EventArgs) Handles btnColor.Click Private Sub btnColor_Click(ByVal sender As System.Object, _ (4) 双击 Color 按钮,在它的 Click 事件处理程序中添加如下突出显示的代码: 个控件所有的默认值。 (3) 从工具箱中给项目添加一个 ColorDialog 控件。该控件会放在窗体下面的工作区中,接受这 ● 将 Text 属性设置为 Color ● 将 Location 属性设置为 349, 103 ● 将 Anchor 属性设置为 Top,Right ● 将 Name 属性设置为 btnColor (2) 在窗体上,通过工具箱添加另一个 Button 控件,设置它的属性,如下所示: (1) 打开 Windows Forms Dialogs 项目中的窗体设计器。 果对话框返回的 DialogResult 的值是 OK,就改变窗体的背景色。 下面的示例继续使用 Windows Forms Dialogs 项目,让 ColorDialog 控件显示 Color 对话框。如 Windows Forms Dialogs.zip 试一试: 使用 ColorDialog 控件 txtFile.ForeColor = ColorDialog1.Colorٛ 何一个属性,比如文本框的 ForeColor 属性: 为了获取用户所选的颜色,可以将从 Color 属性获取的值赋给一个变量或支持颜色的控件的任 上面的语句,测试 DialogResult 的值是否为 OK,就像前面的示例那样。 ColorDialog 控件返回的 DialogResult 为 OK 或 Cancel。因而,可以在 If…End If 代码块中使用 ColorDialog1.ShowDialog() 为显示 Color 对话框,只需执行它的 ShowDialog 方法: 8.5.2 使用 ColorDialog 控件 个方法,这里就不再讨论了。 与其他的对话框控件一样,ColorDialog 也包含 ShowDialog 方法。前面的示例中已经介绍过这 这个对话框并没有太多的属性,因此它使用起来就比前面那些对话框简单多了。 SolidColorOnly 表明对话框是否限制用户只能选择纯色 ShowHelp 表明是否在对话框中显示 Help 按钮 FullOpen 表明当对话框打开时,用来创建自定义颜色的控件是否可见 CustomColors 表明显示在对话框中的自定义颜色组 Color 表明用户所选的颜色 属 性 说 明 (续表) 229 第 8 章 显示对话框 Visual Basic 2010 入门经典(第 6 版) 230 Me.BackColor = ColorDialog1.Color End If End Sub (5) 这就是需要添加的所有代码。现在启动项目,测试一下对这个项目进行的修改。 (6) 显示出窗体后,单击Color按钮以显示Color对话框。选择所需要的颜色,或者单击Define Custom Colors 按钮来创建一种自定义颜色。选择完颜色后,单击 Color 对话框中的 OK 按钮。现在窗体的 背景色变成了刚才所选的颜色。 (7) 与 Font 对话框相似,在显示 Color 对话框之前,无需设置 ColorDialog 控件的 Color 属性。 它会自动记住所选的颜色,在再次显示对话框时,就显示用户选择的颜色。为了测试这一点,再次 单击 Color 按钮,用户选择的颜色将会被选定。 示例说明 这次不需要设置 ColorDialog 控件的任何属性,跳过这一步,用 If…End If 代码块显示它,以检 查从这个对话框的 ShowDialog 方法返回的 DialogResult: If ColorDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then 在 If…End If 代码块中,添加必要的代码,改变窗体的 BackColor 属性。如果用户单击 Color 对 话框中的 OK 按钮,窗体的背景色就会因下列这行代码而改变: Me.BackColor = ColorDialog1.Color 8.6 PrintDialog 控件 任何物有所值的应用程序都会拥有某种打 印功能,不管是基本的打印功能还是更为复杂 的打印功能,比如允许用户只打印所选的文本 或某个范围内的页面。本节将探讨一下基本 的打印功能,看看哪些类有助于打印文件中 的文本。 Visual Basic 2010 提供了 PrintDialog 控件, 它实际上并不完成打印工作,但允许选择要使 用的打印机,并设置打印机的属性,比如页面 方向和打印质量,它还可以指定打印范围。下 面的示例没有用到这个功能,但注意,在 PrintDialog 控件中是可以使用这项功能的,如 图 8-13 所示。 与前面的对话框类似,Print 对话框提供了 Print 按钮(对应其他对话框中的 OK 按钮)和 Cancel 按 钮—— 这样它的 ShowDialog 方法就返回值为 OK 或 Cancel 的 DialogResult。然后,就可以在 If…End If 代码块中使用这个结果,测试 DialogResult。Apply 按钮只应用在 Print 对话框中所做的更改,并 不关闭该对话框。 图 8-13 第 8 章 显示对话框 231 8.6.1 PrintDialog 的属性 表 8-10 列出了 PrintDialog 提供的一些属性。与其他的对话框类似,PrintDialog 也有 ShowDialog 方法。 表 8-10 PrintDialog 控件的一些属性 属 性 说 明 AllowCurrentPage 表明是否启用 Current Page 单选按钮 AllowPrintToFile 表明是否启用 Print to file 复选框 AllowSelection 表明是否启用 Selection 单选按钮 AllowSomePages 表明是否启用 Pages 单选按钮 Document 表明用于获取打印机设置的打印文档 PrinterSettings 表明对话框要修改的打印机设置 PrintToFile 表明是否启用 Print to file 复选框 ShowHelp 表明是否显示 Help 按钮 ShowNetwork 表明是否显示 Network 按钮 8.6.2 使用 PrintDialog 控件 下面只使用 ShowDialog 方法,它用来显示如图 8-13 所示的 Print 对话框,该对话框只启用 All 页面范围单选按钮。如前所述,PrintDialog 控件只显示 Print 对话框,并不进行实际的打印。下面的 代码段说明了如何显示 Print 对话框: PrintDialog1.ShowDialog() 8.6.3 PrintDocument 类 在调用 PrintDialog 控件的 ShowDialog 方法之前,必须先设置 PrintDialog 类的 Document 属性。 该属性接受一个 PrintDocument 类,以获得打印机设置并将输出内容发送给打印机。PrintDocument 类需要 System.Drawing.Printing 名称空间,因此,在定义使用 PrintDocument 类的对象前,必须包含 这个名称空间。 PrintDocument 类的属性 首先,看一下 PrintDocument 类的一些重要属性,如表 8-11 所示。 表 8-11 PrintDocument 类的常用属性 属 性 说 明 DefaultPageSettings 表明文档的默认页面设置 DocumentName 表明打印文档时显示的文档名。这也是显示在 Print Status 对话框和打印机队 列中的名称 Visual Basic 2010 入门经典(第 6 版) 232 (续表) 属 性 说 明 PrintController 表明管理打印进程的打印控制器 PrinterSettings 表明打印文档的打印机 8.6.4 打印文档 PrintDocument 类的 Print 方法在 PrinterSettings 属性指定的打印机上打印文档。当调用 PrintDocument 类的 Print 方法打印每个页面时,会引发 PrintPage 事件。所以,需要为该事件创建一 个过程,并为它添加事件处理程序。为 PrintPage 事件创建的过程实际读取要打印的数据。 使用 PrintDocument 类打印要求做大量的编码工作并掌握如何进行打印的知识。所幸的是,帮 助文档提供了 PrintDocument 类的一些示例代码。这可作为理解打印基础知识的起点。应注意,帮 助文档中的示例代码假定文件中要打印的单行文本未超出打印页面的宽度。 帮助文档中的示例代码演示了如何从文件进行打印。 试一试: 使用 PrintDialog 控件 Windows Forms Dialogs.zip 在下面的示例中,将介绍如何打印文本框中的内容。 (1) 返回 Windows Forms Dialogs 项目的窗体设计器。 (2) 从工具箱中拖放一个 Button 控件到 Color 按钮下,并设置它的属性,如下所示: ● 将 Name 属性设置为 btnPrint ● 将 Anchor 属性设置为 Top,Right ● 将 Location 属性设置为 349,133 ● 将 Text 属性设置为 Print (3) 现在给项目添加一个 PrintDialog 控件,将它从工具箱中拖放到窗体上。它会添加到窗体下 面的工作区中,接受该控件的所有默认属性。 (4) 切换到代码编辑器中,添加一些打印文件所需的名称空间。将这些名称空间添加到类的顶部: Imports System.Drawing.Printing Public Class Dialogs (5) 将如下变量声明添加到类的顶部: 'Declare variables and objects Private strFileName As String Private strPrintRecord As String Private WithEvents DialogsPrintDocument As PrintDocument (6) 在 Class Name 组合框中选择 DialogsPrintDocument,在 Method Name 组合框中选择 PrintPage 事件。将如下突出显示的代码添加到 DialogsPrintDocument_PrintPage 事件过程中: 第 8 章 显示对话框 233 Private Sub DialogsPrintDocument_PrintPage(ByVal sender As Object, _ ByVal e As System.Drawing.Printing.PrintPageEventArgs) _ Handles DialogsPrintDocument.PrintPage 'Declare variables Dim intCharactersToPrint As Integer Dim intLinesPerPage As Integer Dim strPrintData As String Dim objStringFormat As New StringFormat Dim objPrintFont As New Font("Arial", 10) Dim objPageBoundaries As RectangleF Dim objPrintArea As SizeF 'Get the page boundaries objPageBoundaries = New RectangleF(e.MarginBounds.Left, _ e.MarginBounds.Top, e.MarginBounds.Width, e.MarginBounds.Height) 'Get the print area based on page margins and font used objPrintArea = New SizeF(e.MarginBounds.Width, _ e.MarginBounds.Height — objPrintFont.GetHeight(e.Graphics)) 'Break in between words on a line objStringFormat.Trimming = StringTrimming.Word 'Get the number of characters to print e.Graphics.MeasureString(strPrintRecord, objPrintFont, objPrintArea, _ objStringFormat, intCharactersToPrint, intLinesPerPage) 'Get the print data from the print record strPrintData = strPrintRecord.Substring(0, intCharactersToPrint) 'Print the page e.Graphics.DrawString(strPrintData, objPrintFont, Brushes.Black, _ objPageBoundaries, objStringFormat) 'If more lines exist, print another page If intCharactersToPrint < strPrintRecord.Length Then 'Remove printed text from print record strPrintRecord = strPrintRecord.Remove(0, intCharactersToPrint) e.HasMorePages = True Else e.HasMorePages = False End If End Sub (7) 在 Class Name 组合框中选择 btnPrint,在 Method Name 组合框中选择 Click 事件。将如下突 出显示的代码添加到 btnPrint_Click 事件过程中: Private Sub btnPrint_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnPrint.Click 'Instantiate a new instance of the PrintDocument DialogsPrintDocument = New PrintDocument 'Set the PrintDialog properties With PrintDialog1 .AllowCurrentPage = False .AllowPrintToFile = False .AllowSelection = False .AllowSomePages = False Visual Basic 2010 入门经典(第 6 版) 234 .Document = DialogsPrintDocument .PrinterSettings.DefaultPageSettings.Margins.Top = 25 .PrinterSettings.DefaultPageSettings.Margins.Bottom = 25 .PrinterSettings.DefaultPageSettings.Margins.Left = 25 .PrinterSettings.DefaultPageSettings.Margins.Right = 25 End With If PrintDialog1.ShowDialog = DialogResult.OK Then 'Set the selected printer settings in the PrintDocument DialogsPrintDocument.PrinterSettings = _ PrintDialog1.PrinterSettings 'Get the print data strPrintRecord = txtFile.Text 'Invoke the Print method on the PrintDocument DialogsPrintDocument.Print() End If End Sub (8) 现在准备测试代码,因此运行该项目。 (9) 单击 Open 按钮,打开一个文件,然后单击 Print 按钮,显示 Print 对话框,如图 8-14 所示。 图 8-14 如果安装了多台打印机,如图 8-14 所示,就可以在 Select Printer 列表中选择打印机的名称。 注意:Print to file 复选框, Selection、Current Pages 及 Pages 单选按钮是无效的 。 这是因为 PrintDialog 控件中的 AllowCurrentPage、AllowPrintToFile、AllowSelection 和 AllowSomePages 属性都被设置成了 False。 第 8 章 显示对话框 235 (10) 单击 Print 对话框中的 Print 按钮,开始打印文本。 示例说明 首先导入 System.Drawing.Printing 名称空间,这是用来支持打印的。这个名称空间中定义了 PrintDocument 类。 然后声明打印所需的变量和对象。strPrintRecord 字符串变量包含文本框中要打印的数据, DialogsPrintDocument 对象负责打印文本。 注意 WithEvents 关键字。这个关键字用于指出可引发事件的类,让 Visual Studio 2010 在代码编 辑器顶部的 Method Name 组合框中列出那些事件: Private strPrintRecord As String Private WithEvents DialogsPrintDocument As PrintDocument DialogsPrintDocument_PrintPage 事件处理程序处理页面并输出打印。在定义为 PrintDocument 类的对象上(这里是 DialogsPrintDocument)调用 Print 方法后,就调用这一事件。 在这个事件处理程序中,必须提供实际打印文档的代码,同时必须确定是否还有页面要打印。 这个过程的开始是大量的变量声明。开始的两个变量是 Integer 数据类型,分别包含打印至一个页面 的字符数和一个页面上可打印的行数。 strPrintData 变量的数据类型是 String,它包含在单个页面上打印的所有数据。objStringFormat 变量声明为 StringFormat 类,这个类封装了用于格式化要打印的数据的文本布局信息。StringFormat 类用于按词界修整数据,这样文本便不会超出页面打印区域。 objPrintFont 对象定义为 Font 类,设置用于打印文本的字体;而 objPageBoundaries 对象定义为 RectangleF 结构。RectangleF 结构包含 4 个定义选区位置和大小的浮点数,这些浮点数定义了页面 的顶坐标和左坐标,以及宽度和高度。objPrintArea 对象定义为 SizeF 结构,包含了页面打印区域的 高度和宽度。这是可打印的实际区域,而非页面的实际尺寸: Private Sub DialogsPrintDocument_PrintPage(ByVal sender As Object, _ ByVal e As System.Drawing.Printing.PrintPageEventArgs) _ Handles DialogsPrintDocument.PrintPage 'Declare variables Dim intCharactersToPrint As Integer Dim intLinesPerPage As Integer Dim strPrintData As String Dim objStringFormat As New StringFormat Dim objPrintFont As New Font("Arial", 10) Dim objPageBoundaries As RectangleF Dim objPrintArea As SizeF 这一方法中的代码首先获取页面边界。传递给该方法的 e 参数中的 PrintPageEventArgs 包含了 页面的顶坐标、左坐标以及页面高度和宽度。这些值用于设置 objPageBoundaries 对象中的数据。 页面的打印区域包含在 PrintPageEventArgs 的 Width 和 Height 属性中。在 objPrintFont 对象中, 页面的实际高度使用 Font 类的 GetHeight 方法计算得出,因为每个字体大小都或多或少要求在页面 上占用一些纵向空间: Visual Basic 2010 入门经典(第 6 版) 236 'Get the page boundaries objPageBoundaries = New RectangleF(e.MarginBounds.Left, _ e.MarginBounds.Top, e.MarginBounds.Width, e.MarginBounds.Height) 'Get the print area based on page margins and font used objPrintArea = New SizeF(e.MarginBounds.Width, _ e.MarginBounds.Height — objPrintFont.GetHeight(e.Graphics)) 现在,设置 objStringFormat 对象的 Trimming 属性,命令它使用词界分隔单行中的数据。这是 使用 StringTrimming 枚举来完成的,它包含了 Word 常量。这确保了打印行不超出打印页面的边距。 然后,需要根据页面打印区域、使用的字体尺寸和要打印的数据,确定单个页面可打印的字符 数。这是通过使用 Graphics 类的 MeasureString 方法来完成的。该方法接受要打印的数据、页面上使 用的字体、页面的打印区域和应用的格式化技术,然后确定单个页面可打印的字符数和行数。打印 字符数和行数在传递给 MeasureString 方法的 intCharactersToPrint 和 intLinesPerPage 变量中设置。 一旦知道了单个页面可打印的字符数,就可以从 strPrintRecord 变量获取数据,在 strPrintData 变量中设置要打印的数据。这个变量包含了实际要打印的数据: 'Break in between words on a line objStringFormat.Trimming = StringTrimming.Word 'Get the number of characters to print e.Graphics.MeasureString(strPrintRecord, objPrintFont, objPrintArea, _ objStringFormat, intCharactersToPrint, intLinesPerPage) 'Get the print data from the print record strPrintData = strPrintRecord.Substring(0, intCharactersToPrint) 现在,strPrintData 变量包含了要打印的合适数据,下面准备将要打印的数据发送给打印机。这 次使用 Graphics 类的 DrawString 方法。这一方法将格式化数据并发送到打印机。 传递给 DrawString 方法的参数是要打印的数据、打印中使用的字体、表示要打印文本字体颜色 的 Brushes 对象、页面边界和用于格式化打印输出的 StringFormat 对象: 'Print the page e.Graphics.DrawString(strPrintData, objPrintFont, Brushes.Black, _ objPageBoundaries, objStringFormat) 这一方法的最后一部分代码决定了是否还有更多的数据要打印。为此,使用 String 类的 Length 属性比较包含 intCharactersToPrint 变量的值与 strPrintRecord 的长度。Length 属性返回字符串中的字 符数。 如果包含在 intCharactersToPrint 变量中的值小于 strPrintRecord 变量的长度,就说明有更多的数 据要打印。在这种情况下,首先使用 String 类的 Remove 方法从 strPrintRecord 中删除已打印的数据。 Remove 方法接受删除数据的起始位置和要删除的数据量。要删除的数据量包含在 intCharactersToPrint 变量中,是已打印的数据。 最后,设置 PrintPageEventArgs 参数的 HasMorePages 属性为 True,表明有更多数据要打印。将 这一属性设置为 True,将再次引发 DialogsPrintDocument 对象的 PrintPage 事件,这一事件处理程序 将再次执行,继续打印直到所有数据打印完为止。 如果没有更多的数据要打印,就将 HasMorePages 属性设置为 False: 'If more lines exist, print another page 第 8 章 显示对话框 237 If intCharactersToPrint < strPrintRecord.Length Then 'Remove printed text from print record strPrintRecord = strPrintRecord.Remove(0, intCharactersToPrint) e.HasMorePages = True Else e.HasMorePages = False End If End Sub Print 按钮 Click 事件中的代码没有 DialogsPrintDocument_PrintPage 事件处理程序中的代码那么 复杂。这一方法首先在 DialogsPrintDocument 对象中实例化 PrintDocument 类的一个新实例。 然后,在显示 PrintDialog 控件之前设置其属性。因为只有一种简单的方法可用来打印文档中的 所有页面,所以禁用允许只打印当前页面、打印到文件、打印选择的文本和打印特定页面的功能。 在代码中,这可以通过将开始 4 个属性设置为 False 来实现。 接着,需要将 PrintDialog 的 Document 属性设置为 PrintDocument 对象,这样该对话框便可包含 打印机设置。打印机设置是在 PrintDocument 中设置和获取的,可通过 PrintDialog 的 PrinterSettings 属性改变。 最后,在 PrinterSettings 属性中设置打印文档时使用的默认边距。这可以在 PrintDialog 显示前设 置,以此设置打印机的初始打印边距: 'Instantiate a new instance of the PrintDocument DialogsPrintDocument = New PrintDocument 'Set the PrintDialog properties With PrintDialog1 .AllowCurrentPage = False .AllowPrintToFile = False .AllowSelection = False .AllowSomePages = False .Document = DialogsPrintDocument .PrinterSettings.DefaultPageSettings.Margins.Top = 25 .PrinterSettings.DefaultPageSettings.Margins.Bottom = 25 .PrinterSettings.DefaultPageSettings.Margins.Left = 25 .PrinterSettings.DefaultPageSettings.Margins.Right = 25 End With 最后要做的就是显示 PrintDialog,检查 DialogResult 是否为 OK。如果用户单击 Print 按钮, PrintDialog 返回的 DialogResult 为 OK,就调用打印数据的代码。 在 If…Then 代码块中,首先从 PrintDialog 捕获打印机设置,在 DialogsPrintDocument 中设置它 们。如果用户改变了边距或其他打印机设置,就要将它们传递给用于打印数据的 PrintDocument。 还要在 strPrintRecord 变量中设置从文本框打印的数据。最后,在 DialogsPrint Document 对象上 调用 Print 方法,开始打印过程。调用 Print 方法将在 DialogsPrinDocument 对象上引发 PrintPage 事 件,执行 DialogsPrintDocument_PrintPage 事件处理程序中的代码: If PrintDialog1.ShowDialog = DialogResult.OK Then 'Set the selected printer settings in the PrintDocument DialogsPrintDocument.PrinterSettings = _ PrintDialog1.PrinterSettings 'Get the print data Visual Basic 2010 入门经典(第 6 版) 238 strPrintRecord = txtFile.Text 'Invoke the Print method on the PrintDocument DialogsPrintDocument.Print() End If 8.7 FolderBrowserDialog 控件 有时,应用程序可能只允许用户选择文件夹而 非文件,或许应用程序执行了备份,或许需要一个 文件夹来保存临时文件。FolderBrowserDialog 控件 显示 Browse For Folder 对话框,以允许用户选择文 件夹。该对话框中不显示文件,仅显示文件夹。通 过该对话框,用户可以很方便地选择应用程序所需 的文件夹。 与前面介绍的其他对话框一样,也可以在代码 中将 FolderBrowserDialog 控件声明为一个类。在如 图 8-15 所示的 Browse For Folder 对话框中,没有任 何定制内容,用户可以通过该对话框浏览和选择文 件夹。注意,该对话框中的 Make New Folder 按钮 允许用户创建和选择一个新文件夹。 8.7.1 FolderBrowserDialog 控件的属性 在深入研究代码之前,先看一看 FolderBrowserDialog 控件的一些常用属性,如表 8-12 所示。 表 8-12 FolderBrowserDialog 控件的常用属性 属 性 说 明 Description 在对话框中提供描述性的消息 RootFolder 指示对话框开始浏览的根文件夹 SelectedPath 指示用户所选的文件夹 ShowNewFolderButton 指示 Make New Folder 按钮是否显示在对话框中 我们经常需要使用这个控件的所有常用属性来定制要显示的对话框。 与其他对话框控件一样,FolderBrowserDialog 控件也包含 ShowDialog 方法。该方法已在前面的 示例中介绍过,所以在此不再讨论。 8.7.2 使用 FolderBrowserDialog 控件 在显示 Browse For Folder 对话框之前,先设置一些基本的属性。下面的代码片段设置了 3 个主 要属性。其中,第 1 个属性 Description 允许为用户提供描述或说明。 第 2 个属性 RootFolder 指定 Browse For Folder 对话框的启动文件夹。该属性的值是 Environment. SpecialFolder 枚举中的一个常量。通常使用 MyComputer 常量来指定应从 My Computer(我的电脑) 图 8-15 第 8 章 显示对话框 239 处开始浏览文件夹,有时也使用 My Documents 常量来指定从 My Documents(我的文档)处开始浏览 文件夹。 第 3 个属性是 ShowNewFolderButton。该属性的默认值为 True,表示应该显示 Make New Folder 按钮。如果不想显示该按钮,可将该属性的值设置为 False: With FolderBrowserDialog1 .Description = "Select a backup folder" .RootFolder = Environment.SpecialFolder.MyComputer .ShowNewFolderButton = False End With 设置了必要的属性之后,就执行 ShowDialog 方法,显示 Browse For Folder 对话框: FolderBrowserDialog1.ShowDialog() FolderBrowserDialog 控件将返回值为 OK 或 Cancel 的 DialogResult。因此,可以在 If…End If 代码块中使用前面的语句,测试 DialogResult 是否为 OK,其操作与前面几个示例一样。 若要检索用户所选择的文件夹,只需检索 SelectedPath 属性中的值集并将其赋给一个变量即可。 所返回的文件夹有一个完全限定的路径名称。例如,如果在 C 盘根目录下选择了一个名为 Temp 的 文件夹,那么返回的路径就是 C:\Temp: strFolder = FolderBrowserDialog1.SelectedPath 试一试: 使用 FolderBrowserDialog 控件 Windows Forms Dialogs.zip 下面的示例将继续 Windows Forms Dialogs 项目,并且通过 FolderBrowserDialog 控件显示 Browse For Folder 对话框。如果该对话框返回的 DialogResult 为 OK,就在窗体的文本框中显示所选的文 件夹。 (1) 返回 Windows Forms Dialog 项目中的窗体设计器。 (2) 通过工具箱在窗体的 Print 按钮的下方添加另一个 Button 控件,设置其属性,如下所示: ● 将 Name 属性设置为 btnBrowse ● 将 Anchor 属性设置为 Top,Right ● 将 Location 属性设置为 349,163 ● 将 Text 属性设置为 Browse (3) 从工具箱给项目添加一个 FolderBrowserDialog 控件,该控件会添加到窗体下面的工作区中。 接受该控件的所有默认属性,因为后面将在代码中设置必要的属性。 (4) 双击 Browse 按钮,打开该按钮的 Click 事件过程,添加如下所示的代码: Private Sub btnBrowse_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnBrowse.Click 'Set the FolderBrowser dialog properties With FolderBrowserDialog1 .Description = "Select a backup folder" .RootFolder = Environment.SpecialFolder.MyComputer .ShowNewFolderButton = False Visual Basic 2010 入门经典(第 6 版) 240 End With 'Show the FolderBrowser dialog and if the user clicks the 'OK button, display the selected folder If FolderBrowserDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then txtFile.Text = FolderBrowserDialog1.SelectedPath End If End Sub (5) 以上是需要添加的所有代码。要测试对该项目所做的修改,请单击工具栏上的 Start 按钮。 (6) 当显示窗体时,单击 Browse 按钮,会看到一个如图 8-16 所示的 Browse For Folder 对话框。 图 8-16 (7) 下面浏览计算机并选择一个文件夹。单击 OK 按钮后,所选的文件夹将会显示在窗体的文 本框中。注意,返回的文件夹包含一个完全限定的路径名。 示例说明 在显示 Browse For Folder 对话框之前,需要为 FolderBrowserDialog 控件设置一些基本属性,以 定制该对话框的外观。首先设置 Description 属性,为用户提供一些基本的说明信息。然后选择 Browse For Folder 对话框中的根文件夹。本例使用 MyComputer 常量,以显示计算机上的所有盘符,如图 8-16 所示。最后,将 ShowNewFolderButton 属性设置为 False,这样在对话框中就不会显示 Make New Folder 按钮了: 'Set the FolderBrowser dialog properties With FolderBrowserDialog1 .Description = "Select a backup folder" .RootFolder = Environment.SpecialFolder.MyComputer .ShowNewFolderButton = False End With 接着通过 If…End If 代码块来显示对话框,检查由 FolderBrowserDialog 控件的 ShowDialog 方法 返回的 DialogResult。在 If…End If 代码块中,使用 SelectedPath 属性添加在窗体文本框中显示所选 文件夹的必要代码: 第 8 章 显示对话框 241 'Show the FolderBrowser dialog and if the user clicks the 'OK button, display the selected folder If FolderBrowserDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then txtFile.Text = FolderBrowserDialog1.SelectedPath End If 8.8 小结 本章讲述了 Visual Basic 2010 提供的一些对话框,研究了 MessageBox 对话框以及 OpenFileDialog、SaveFileDialog、FontDialog、ColorDialog、PrintDialog 和 FolderBrowserDialog 控件。 这些对话框控件可以帮助在应用程序中提供通用的接口,以实现各自的功能。它们还隐藏了许多在 执行任务时所要求的复杂步骤,让开发人员把注意力集中在完善应用程序功能的逻辑上。 对除了 MessageBox 对话框以外的其他对话框使用工具箱中的控件时,记住,这些控件也可以 用作常用的类。这就意味着不管是手动选择控件还是使用类编写代码,这些对话框所使用的类拥有 相同的属性和方法。用户还可以定义自己的对象,将它们设置为这些类,然后利用这些对象来执行 用控件要完成的任务,以更好地控制对象。例如,可以定义一个对象,将它设置为 OpenDialog 类, 在同一方法中使用然后销毁它。由于只使用定义和使用了 OpenDialog 类的方法中的资源,因此减小 了可执行文件的大小。 通过本章的学习,读者应掌握如下内容: ● 利用 MessageBox 对话框显示消息 ● 在 MessageBox 对话框中显示图标和按钮 ● 利用 OpenFileDialog 控件读取文件的内容 ● 利用 SaveFileDialog 控件将文本框的内容保存到文件中 ● 利用 FontDialog 控件设置文本框中文本的字体和颜色 ● 利用 ColorDialog 控件设置窗体的背景色 ● 利用 PrintDialog 控件打印文本 ● 利用 FolderBrowserDialog 控件得到所选择的文件夹 表 8-13 对本章讨论的主题进行了总结。 表 8-13 本章主题 主 题 概 念 MessageBox 如何显示和确定用户在 MessageBox 对话框中单击了哪个按钮 OpenFileDialog 如何利用 OpenFileDialog 控件找到要打开的文件,并读取文件的内容 SaveFileDialog 如何利用 SaveFileDialog 控件将文本保存到文件中 FontDialog 显示 Font 对话框,并使用所选的字体改变程序中的字体 ColorDialog 显示 Color 对话框,并使用所选的颜色改变程序中的颜色 PrintDialog 使用哪些类,以及如何使用它们打印文本 FolderBrowserDialog 如何设置要显示的控件,确定选择了哪个文件夹 Visual Basic 2010 入门经典(第 6 版) 242 8.9 练习 1. 要向用户显示对话框,应使用什么方法? 2. 显示 MessageBox 对话框应使用什么方法? 3. 说出在 MessageBox 对话框中给用户显示图标的 5 种不同方法。 4. 如何确定用户在 MessageBox 对话框中单击了哪个按钮? 5. 如果需要编写基本代码,应在 Visual Studio 的什么地方查找简单的示例? 前 言 Visual Basic 2010 是微软公司较为流行的 VB.NET 编程语言的最新版本,是 Visual Studio 2010 环境支持的几种语言之一。Visual Basic 2010 的优势在于其易用性和高速度,利用该语 言可以轻松、快捷地编写出 Windows Forms 应用程序、WPF Windows 应用程序、Web 应用程 序、WPF Browser 应用程序、移动设备应用程序和 Web 服务。 本书将全面介绍 Visual Basic 2010 的各种编程知识,展示如何创建上述应用程序和服务。 同时,您也可以学习面向对象的编程技术,掌握创建业务对象和 Windows 控件的方法。 微软的.NET Framework 使 Visual Basic 2010 程序员能像 C#或 C++程序员一样创建完全 面向对象的各种程序。.NET Framework 提供了一套通用的基类,Visual Studio 2010 中的所有 编程语言都可以使用它们,这样一来,程序员在创建面向对象的程序方面就拥有与 C#或 C++ 一样的功能了。 本书将使您在 Visual Basic 2010 编程方面打下坚实的基础,并给您带来编程的无限乐趣。 0.1 本书读者对象 本书的目的是教您如何尽可能快捷地运用 Visual Basic 2010 编写有用的程序。 本书适合于以下两类初学者: ● 一类是编程的初学者,他们选择从 Visual Basic 2010 开始学起。这是个很好的选择! Visual Basic 2010 不但易学易用,而且功能强大。 ● 另一类是曾用其他语言进行编程,但初次接触.NET 编程知识的人员。这类初学者现在 选择学习 Visual Basic 2010 是一个不错的主意。不管您熟悉的语言是 Fortran 还是 VB 6, 本书都将帮助您迅速掌握 Visual Basic 2010。 0.2 本书主要内容 Visual Basic 2010 提供了工具和语言方面的大量功能。当然,一本书不可能包含 Visual Basic 2010 的所有内容,这些内容要用一个书库来容纳。本书的目的是让您尽快入门,它相 当于一个路标,可以指导您的学习。在介绍创建应用程序的基础知识(如创建窗口和控件,如 何用代码处理突发事件,什么是面向对象的程序设计以及如何在应用程序中使用它,等等) 之余,本书还为您提供了亲自动手的机会。本书的组织结构如下: ● 第 1~9 章介绍 Visual Studio 2010 和 Windows 编程的基础知识。 ● 第 6 章介绍 XAML 和 WPF(Windows Presentation Foundation)编程。 ● 第 10 章阐述应用程序的调试和错误处理方法。 ● 第 11~13 章介绍面向对象编程技术以及如何创建对象。 Visual Basic 2010 入门经典(第 6 版) VI ● 第 14 章介绍如何创建 Windows Forms 用户控件。 ● 第 15、16 章介绍如何利用数据库进行编程,同时涵盖 Access、SQL Server 及 ADO.NET 等知识。 ● 第 17、18 章简述动态数据网站、ASP.NET,并讨论如何编写 Web 应用程序。 ● 第 19 章对 XML 进行简要介绍。XML 这种功能强大的工具能把各种应用程序结合起 来,而无需考虑所使用的语言。 ● 第 20 章介绍使用 ClickOnce(一键部署)技术部署应用程序。 0.3 Visual Basic 2010 所需的运行环境 除了要有学习的热忱之外,学习前 15 章还需要一台能够运行 Windows 7(首选)、Windows Vista、Windows XP(家庭版或专业版)、Windows Server 2008 或 Windows Server 2003 系统, 并且安装了 Internet Explorer 的计算机。当然,还要安装下列软件之一: ● Microsoft Visual Basic 2010 Professional Edition ● Microsoft Visual Basic 2010 Premium Edition ● Microsoft Visual Basic 2010 Ultimate Edition ● Microsoft Visual Basic 2010 Team System 0.4 源代码 在练习书中的示例时,可以选择手动输入代码或者使用本书附带的源代码文件。书中用 到的所有源代码都可以从 www.wrox.com 下载。进入站点 http://www.worx.com 后,只需找到 本书的书名(使用 Search 搜索框或书名列表),单击本书详细信息页面上的 Download Code 链 接,就可以得到本书所有的源代码。 下载完代码后,用您喜欢的压缩工具把它解压缩。此外,也可以去 Wrox 的主下载页面 www.worx.com/dynamic/books/download.aspx 找到本书或 Wrox 出版的其他书籍的代码。 0.5 勘误表 尽管我们竭尽所能来确保在正文和代码中没有错误,但人无完人,错误难免会发生。如 果您在 Wrox 出版的书中发现了错误(例如拼写错误或代码错误),我们将非常感谢您的反馈。 发送勘误表将节省其他读者的时间,同时也会帮助我们提供更高质量的信息。 注意:因为很多书的书名都相似,所以用 ISBN 搜索更为容易。 本书英文版 的 ISBN 是 978-0-470-50222-8。 前 言 VII 要找到本书的勘误页面,可以进入 www.worx.com,使用 Search 搜索框或书名列表定位 本书,然后在本书的详细信息页面上单击 Book Errata 链接。在这个页面上可以查看为本书提 交的、Wrox 编辑粘贴上去的所有错误。完整的书名列表(包括每本书的勘误表)也可以从 www.wrox.com/misc-pages/booklist.shtml 上获得。 如果您在本书的勘误页面上没有看到您发现的错误,可以到 www.wrox.com/contact/ techsupport.shtml 上填写表单,把您发现的错误发给我们。我们会检查这些信息,如果属实, 就把它添加到本书的勘误页面上,并在本书随后的版本中更正错误。 0.6 p2p.wrox.com 如果想和作者或同行进行讨论,请加入 http://p2p.worx.com 上的 P2P 论坛。该论坛是一 个基于 Web 的系统,您可以发布有关 Wrox 图书及相关技术的消息,与其他读者或技术人员 交流。该论坛提供了订阅功能,当您感兴趣的主题有新帖子发布时,系统会邮件通知。Wrox 的作者、编辑、其他业界专家和像您一样的读者都会出现在这些论坛中。 在 http://p2p.wrox.com 网站上,您会找到很多不同的论坛,它们不但有助于您阅读本书, 还有助于您开发自己的应用程序。加入论坛的步骤如下: (1) 进入 http://p2p.wrox.com,单击 Register 链接。 (2) 阅读使用条款,然后单击 Agree 按钮。 (3) 填写加入该论坛必需的信息和其他您愿意提供的信息,单击 Submit 按钮。 (4) 您将收到一封电子邮件,描述如何验证您的账户和完成加入过程。 加入之后,就可以发布新的消息和回复其他用户发布的消息。可以随时在 Web 上阅读论 坛里的消息。如果想让某个论坛的新消息以电子邮件的方式发给您,可以单点击论坛列表中 论坛名称旁边的 Subscribe to this Forum 图标。 要了解如何使用 Wrox P2P 的更多信息,请阅读 P2P FAQ,其中回答了论坛软件如何使 用的问题,以及许多与 P2P 和 Wrox 图书相关的问题。要阅读 FAQ,单击任何 P2P 页面上的 FAQ 链接即可。 注意:不加入 P2P 也可以阅读论坛里的消息。但是如果要发布自己的消息 , 就必须加入。 目 录 第 1 章 初识 Visual Basic 2010 ............ 1 1.1 事件驱动编程 .............................. 2 1.2 安装 Visual Basic 2010 ................ 3 1.3 Visual Basic 2010 集成开发 环境 .............................................. 5 1.3.1 初始化开发环境 ...................... 6 1.3.2 菜单 .......................................... 6 1.3.3 工具栏 ...................................... 7 1.4 创建简单的应用程序 .................. 8 1.4.1 工具箱 .................................... 11 1.4.2 改进型匈牙利表示法 ............ 13 1.4.3 代码编辑器 ............................ 14 1.5 使用帮助系统 ............................ 17 1.6 小结 ............................................ 18 1.7 练习 ............................................ 18 第 2 章 .NET Framework 概述 ............ 19 2.1 微软的信心来自于 Windows .... 19 2.1.1 MSN 1.0.................................. 20 2.1.2 .NET 理念 .............................. 20 2.1.3 .NET 与 Java 有些类似.......... 21 2.1.4 现在所处的阶段 .................... 22 2.2 为 Windows 编写软件 ............... 22 2.2.1 .NET Framework 类 ............... 23 2.2.2 执行代码 ................................ 24 2.3 公共语言运行时 ........................ 25 2.3.1 载入并执行代码 .................... 25 2.3.2 应用程序隔离 ........................ 25 2.3.3 安全性 .................................... 25 2.3.4 互操作 .................................... 26 2.3.5 异常处理 ................................ 26 2.4 通用类型系统和公共语言 规范 ............................................ 26 2.5 小结 ............................................ 27 第 3 章 编写软件 ................................ 29 3.1 信息和数据 ................................ 29 3.1.1 算法 ........................................ 29 3.1.2 编程语言 ................................ 30 3.2 变量 ............................................ 31 3.3 注释和空白 ................................ 33 3.3.1 注释 ........................................ 33 3.3.2 空白 ........................................ 35 3.4 数据类型 .................................... 35 3.4.1 数字类型 ................................ 35 3.4.2 常见的整型数学运算 ............. 36 3.4.3 整型运算的缩写方式 ............. 38 3.4.4 浮点型数学运算..................... 40 3.4.5 字符串类型 ............................ 42 3.4.6 使用日期 ................................ 49 3.4.7 布尔类型 ................................ 54 3.5 存储变量 .................................... 55 3.5.1 二进制 .................................... 55 3.5.2 位和字节 ................................ 55 3.5.3 值的表示 ................................ 56 3.5.4 值的转换 ................................ 57 3.6 方法 ............................................ 58 3.6.1 使用方法的原因..................... 59 3.6.2 前面曾介绍过的方法 ............. 59 3.6.3 创建方法 ................................ 62 3.6.4 选择方法名称 ........................ 65 3.6.5 作用域 .................................... 65 3.7 小结 ............................................ 67 3.8 练习 ............................................ 68 第 4 章 流程控制 .................................. 69 4.1 作出决策 .................................... 69 Visual Basic 2010 入门经典(第 6 版) X 4.2 If 语句 ........................................ 70 4.2.1 Else 语句 ................................ 71 4.2.2 可进行多重选择的 ElseIf 语句 ........................................ 72 4.2.3 嵌套的 If 语句 ........................ 73 4.2.4 单行 If 语句 ............................ 73 4.2.5 比较运算符 ............................ 74 4.2.6 字符串比较 ............................ 81 4.3 Select Case 语句 ........................ 83 4.3.1 不区分大小写的 Select Case 语句 ........................................ 86 4.3.2 多重选择 ................................ 88 4.3.3 Case Else 语句 ........................ 89 4.3.4 Select Case 中的不同数据 类型 ........................................ 89 4.4 循环 ............................................ 90 4.4.1 For…Next 循环 ..................... 90 4.4.2 Do…Loop 循环 ...................... 95 4.4.3 嵌套循环 ................................ 99 4.4.4 提前退出循环 ......................100 4.4.5 死循环 ..................................102 4.5 小结 .......................................... 103 4.6 练习 .......................................... 104 第 5 章 处理数据结构 ....................... 105 5.1 数组 .......................................... 105 5.1.1 定义和使用数组 ..................105 5.1.2 使用 For Each…Next 循环 ....108 5.1.3 将数组作为参数传递 .......... 110 5.1.4 数组的排序 .......................... 112 5.1.5 反向检索 .............................. 113 5.1.6 用值初始化数组 .................. 115 5.2 枚举 .......................................... 116 5.2.1 使用枚举 .............................. 116 5.2.2 确定状态 .............................. 119 5.2.3 设置无效值 ..........................121 5.3 常量 .......................................... 121 5.3.1 使用常量 ..............................122 5.3.2 各种常量类型 ......................123 5.4 结构 .......................................... 123 5.4.1 创建结构 ..............................124 5.4.2 为结构添加属性.................. 126 5.5 数组列表 .................................. 127 5.5.1 使用数组列表 ..................... 127 5.5.2 在数组列表中进行删除 操作 ..................................... 131 5.5.3 显示数组列表中的项 .......... 134 5.6 集合 .......................................... 134 5.6.1 创建 CustomerCollection 类 ... 135 5.6.2 添加 Item 属性 .................... 136 5.7 使用散列表创建查询表 .......... 138 5.7.1 使用散列表 ......................... 138 5.7.2 Remove、RemoveAt 和 Clear 方法 ..................................... 141 5.7.3 区分大小写 ......................... 143 5.8 高级数组操作 .......................... 144 5.8.1 动态数组 ............................. 144 5.8.2 使用 Preserve 关键字 .......... 146 5.9 小结 .......................................... 147 5.10 练习 ........................................ 147 第 6 章 可扩展应用程序标记语言 (XAML) ................................ 149 6.1 什么是 XAML ......................... 149 6.2 XAML 语法 ............................. 150 6.3 WPF .......................................... 153 6.3.1 创建一个富 WPF 用户 界面 ..................................... 154 6.3.2 使用 WPF 通用控件 ........... 159 6.3.3 连接事件 ............................. 163 6.4 小结 .......................................... 166 6.5 练习 .......................................... 167 第 7 章 构建 Windows 应用程序 ...... 169 7.1 响应事件 .................................. 169 7.2 创建简单的应用程序 .............. 176 7.2.1 构建窗体 ............................. 176 7.2.2 统计字符 ............................. 179 7.2.3 统计单词 ............................. 181 7.3 创建更复杂的应用程序 .......... 187 7.3.1 Text Editor 项目 .................. 187 7.3.2 创建工具栏 ......................... 187 目 录 XI 7.3.3 创建状态栏 ..........................191 7.3.4 创建编辑框 ..........................193 7.3.5 清除编辑框 ..........................194 7.3.6 响应工具栏按钮 ..................197 7.4 使用多个窗体 .......................... 202 7.5 小结 .......................................... 205 7.6 练习 .......................................... 206 第 8 章 显示对话框 ........................... 207 8.1 MessageBox 对话框 ................ 207 8.1.1 MessageBox 中的可用 图标 ......................................208 8.1.2 MessageBox 中的可用 按钮 ......................................208 8.1.3 设置默认按钮 ......................209 8.1.4 其他选项 ..............................209 8.1.5 Show 方法的语法 ................209 8.1.6 MessageBox 的示例 ............. 211 8.2 OpenFileDialog 控件 ............... 214 8.2.1 OpenFileDialog 控件 ............214 8.2.2 OpenFileDialog 的属性 ........215 8.2.3 OpenFileDialog 的方法 ........216 8.2.4 使用 OpenFileDialog 控件 ...216 8.3 SaveFileDialog 控件 ................ 220 8.3.1 SaveFileDialog 的属性 ........221 8.3.2 SaveFileDialog 的方法 ........221 8.3.3 使用 SaveFileDialog 控件 ....221 8.4 FontDialog 控件 ....................... 225 8.4.1 FontDialog 的属性 ...............225 8.4.2 FontDialog 的方法 ...............225 8.4.3 使用 FontDialog 控件 ..........225 8.5 ColorDialog 控件 ..................... 228 8.5.1 ColorDialog 的属性 .............228 8.5.2 使用 ColorDialog 控件 ........229 8.6 PrintDialog 控件 ...................... 230 8.6.1 PrintDialog 的属性 ...............231 8.6.2 使用 PrintDialog 控件 ..........231 8.6.3 PrintDocument 类 .................231 8.6.4 打印文档 ..............................232 8.7 FolderBrowserDialog 控件 ...... 238 8.7.1 FolderBrowserDialog 控件 的属性 ................................. 238 8.7.2 使用 FolderBrowserDialog 控件 ..................................... 238 8.8 小结 .......................................... 241 8.9 练习 .......................................... 242 第 9 章 创建菜单 .............................. 243 9.1 菜单功能概述 .......................... 243 9.1.1 图形 ..................................... 243 9.1.2 访问键 ................................. 244 9.1.3 快捷键 ................................. 244 9.1.4 复选标记 ............................. 244 9.1.5 Properties 窗格 .................... 245 9.2 创建菜单 .................................. 246 9.2.1 设计菜单 ............................. 246 9.2.2 添加工具栏和控件 .............. 247 9.2.3 为菜单编写代码.................. 249 9.2.4 为 View 菜单和工具栏编写 代码 ..................................... 253 9.2.5 测试代码 ............................. 254 9.3 上下文菜单 .............................. 256 9.3.1 创建上下文菜单.................. 256 9.3.2 激活或禁用菜单项和工具栏 按钮 ..................................... 259 9.4 小结 .......................................... 262 9.5 练习 .......................................... 263 第 10 章 调试和错误处理 ................. 265 10.1 主要错误类型 ........................ 265 10.1.1 语法错误 ......................... 266 10.1.2 执行错误 ......................... 269 10.1.3 逻辑错误 ......................... 269 10.2 调试 ........................................ 270 10.2.1 创建示例项目 ................. 270 10.2.2 设置断点 ......................... 285 10.2.3 使用 Watch 窗格和 QuickWatch 对话框 进行调试 ......................... 291 10.2.4 使用 Autos 窗格进行 调试 ................................. 293 Visual Basic 2010 入门经典(第 6 版) XII 10.2.5 使用 Locals 窗格进行 调试 ..................................293 10.3 错误处理 ................................ 294 10.4 小结 ........................................ 298 10.5 练习 ........................................ 298 第 11 章 构建对象 ............................. 299 11.1 对象的概念 ............................ 299 11.1.1 封装 ..................................300 11.1.2 方法和属性 ......................300 11.1.3 事件 ..................................301 11.1.4 可见性 ..............................301 11.1.5 类的概念 ..........................302 11.2 构建类 .................................... 302 11.3 重用性 .................................... 303 11.4 设计对象 ................................ 304 11.4.1 状态 ..................................305 11.4.2 行为 ..................................305 11.4.3 存储状态 ..........................305 11.4.4 属性 ..................................308 11.4.5 读/写属性 ......................... 311 11.4.6 IsMoving 方法 ..................313 11.5 构造函数 ................................ 315 11.6 继承 ........................................ 317 11.6.1 添加新方法和属性 ..........318 11.6.2 添加 GetPowerToWeightRatio 方法 ...................................320 11.6.3 改变默认值 ......................321 11.6.4 多态性 ..............................323 11.6.5 重写更多的方法 ..............324 11.6.6 从对象类中继承 ..............326 11.7 对象和结构 ............................ 326 11.8 .NET Framework 类 ............... 326 11.8.1 名称空间 ..........................327 11.8.2 Imports 语句 .....................328 11.8.3 创建自己的名称空间 ......329 11.8.4 .NET Framework 中 的继承 ...............................331 11.9 小结 ........................................ 332 11.10 练习 ...................................... 332 第 12 章 面向对象的高级技术 .......... 333 12.1 构建收藏页浏览应用程序 .... 333 12.1.1 Internet 快捷方式和 收藏页 .............................. 333 12.1.2 使用类 ............................. 336 12.1.3 遍历收藏页 ..................... 341 12.1.4 查看收藏页 ..................... 347 12.2 另一个收藏页浏览应用 程序 ........................................ 349 12.2.1 构建收藏页的系统托盘 图标 ................................. 350 12.2.2 显示收藏页 ..................... 351 12.3 使用共享属性和方法 ............ 354 12.3.1 使用共享属性 ................. 355 12.3.2 使用共享方法 ................. 358 12.4 理解面向对象编程和内存 管理 ........................................ 360 12.4.1 垃圾回收 ......................... 361 12.4.2 释放资源 ......................... 361 12.4.3 整理碎片和压缩 ............. 362 12.5 小结 ........................................ 363 12.6 练习 ........................................ 364 第 13 章 建立类库 ............................ 365 13.1 理解类库 ................................ 365 13.1.1 创建类库 ......................... 366 13.1.2 为 Favorites Viewer 项目 创建类库 .......................... 367 13.1.3 多层应用程序 ................. 370 13.2 使用强名 ................................ 371 13.2.1 对程序集签名 ................. 371 13.2.2 程序集的版本 ................. 373 13.3 注册程序集 ............................ 374 13.3.1 Gacutil 实用程序 ............. 374 13.3.2 程序集在 References 对话框中不可见的原因 ... 374 13.4 设计类库 ................................ 375 13.5 使用第三方类库 .................... 375 13.6 用对象浏览器查看类 ............ 376 13.7 小结 ........................................ 377 13.8 练习 ........................................ 378 目 录 XIII 第 14 章 创建 Windows 窗体用户 控件 ................................... 379 14.1 Windows 窗体控件 ................ 379 14.2 创建和测试用户控件 ............ 380 14.3 给用户控件添加属性、方法 和事件 .................................... 383 14.3.1 给用户控件添加属性 ......383 14.3.2 给用户控件添加方法 ......385 14.3.3 给用户控件添加事件 ......386 14.4 设计期间或运行期间 ............ 389 14.5 创建 Command Link 控件 ..... 391 14.5.1 创建 Command Link 控件 ..................................392 14.5.2 使用 Command Link 控件 ..................................399 14.6 小结 ........................................ 402 14.7 练习 ........................................ 402 第 15 章 访问数据库 ......................... 405 15.1 数据库的概念 ........................ 405 15.1.1 Microsoft Access 对象 .....406 15.1.2 表 ......................................406 15.1.3 查询 ..................................406 15.2 SQL 中的 SELECT 语句 ....... 407 15.3 Access 中的查询 .................... 408 15.4 数据访问组件和控件 ............ 412 15.4.1 DataSet 组件 ....................412 15.4.2 DataGridView 控件 ..........413 15.4.3 BindingSource 组件 .........413 15.4.4 BindingNavigator 控件 ....413 15.4.5 TableAdapter 组件............413 15.5 数据绑定 ................................ 414 15.6 小结 ........................................ 419 15.7 练习 ........................................ 420 第 16 章 使用 SQL Server 和 ADO.NET 进行数据库编程 .................. 421 16.1 ADO.NET .............................. 422 16.1.1 ADO.NET 数据名称 空间 ..................................422 16.1.2 SqlConnection 类 .............423 16.1.3 SqlCommand 类 .............. 425 16.1.4 SqlDataAdapter 类 ........... 427 16.1.5 DataSet 类 ........................ 431 16.1.6 DataView 类 .................... 431 16.2 使用 ADO.NET 类 ................. 433 16.3 数据绑定 ................................ 441 16.3.1 BindingContext 和 CurrencyManager 对象 ... 441 16.3.2 绑定控件 ......................... 442 16.4 小结 ........................................ 468 16.5 练习 ........................................ 468 第 17 章 动态数据网站 ..................... 469 17.1 创建一个动态数据 LINQ to SQL 网站 ................ 469 17.2 定制动态数据网站的设计 .... 473 17.3 小结 ........................................ 478 17.4 练习 ........................................ 478 第 18 章 ASP.NET ........................ 479 18.1 瘦客户端体系结构 ................ 479 18.2 Web 窗体和 Windows 窗体 的比较 .................................... 480 18.2.1 Windows 窗体的优点 ..... 480 18.2.2 Web 窗体的优点 ............. 481 18.3 Web 应用程序基础 ................ 481 18.3.1 Web 服务器 ..................... 482 18.3.2 浏览器 ............................. 482 18.3.3 HTML .............................. 482 18.3.4 JavaScript ......................... 482 18.3.5 CSS .................................. 482 18.4 关于 ASP 页面 ....................... 483 18.4.1 ASP.NET Web 页面的 优点 .................................. 483 18.4.2 特殊的 Web 站点文件 .... 483 18.4.3 开发方式 ......................... 483 18.4.4 工具箱 ............................. 484 18.5 构建 Web 应用程序 ............... 484 18.5.1 为客户端和服务器端 处理创建 Web 窗体 ......... 484 Visual Basic 2010 入门经典(第 6 版) XIV 18.5.2 Visual Studio 2010 中 Web 站点的位置 ..............489 18.5.3 数据的输入和验证 ..........491 18.5.4 设计布局、主题和导航 ....496 18.5.5 使用 GridView 构建数据 驱动的 Web 窗体 .............501 18.6 小结 ........................................ 505 18.7 练习 ........................................ 506 第 19 章 Visual Basic 2010 和 XML ... 507 19.1 了解 XML .............................. 507 19.1.1 XML 简介 ........................508 19.1.2 向 Visual Basic 编程新手 介绍 XML .........................510 19.1.3 规则 ..................................510 19.2 地址簿项目 ............................ 510 19.2.1 创建项目 .......................... 511 19.2.2 SerializableData 类 ...........512 19.2.3 载入 XML 文件 ...............517 19.2.4 修改数据 ..........................519 19.2.5 发送 email ........................520 19.2.6 创建地址列表 ..................521 19.2.7 忽略成员 ..........................525 19.2.8 载入地址 ..........................527 19.2.9 添加新地址 ......................528 19.2.10 地址导航 ........................529 19.2.11 删除地址 ........................531 19.3 集成地址簿应用程序 ............ 533 19.3.1 集成规则 ......................... 533 19.3.2 从其他应用程序中读取 地址簿 .............................. 534 19.4 小结 ........................................ 539 19.5 练习 ........................................ 540 第 20 章 部署应用程序 ..................... 541 20.1 部署简介 ................................ 541 20.1.1 ClickOnce 部署 ............... 542 20.1.2 XCOPY 部署 ................... 546 20.2 创建 Visual Studio 2010 安装 程序 ........................................ 547 20.3 UI 编辑器 ............................... 550 20.4 部署不同的解决方案 ............ 553 20.4.1 私有程序集 ..................... 553 20.4.2 共享程序集 ..................... 554 20.4.3 部署桌面应用程序 ......... 554 20.4.4 部署 Web 应用程序 ........ 554 20.4.5 部署 XML Web 服务 ....... 555 20.4.6 一些有用的工具 ............. 555 20.5 小结 ........................................ 555 20.6 练习 ........................................ 556 附录 A 练习题答案 ........................... 557 附录 B 如何深入学习 ....................... 569
还剩99页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 6 金币 [ 分享pdf获得金币 ] 6 人已下载

下载pdf

pdf贡献者

w12wangbo

贡献于2013-08-17

下载需要 6 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf