78

新建 Microsoft Word 文档 · 周围的文本直接相关。 提示:技巧、暗示以及当前所讨论内容的话外之音。 Visual Basic 2012入门经典(第7 版) VI 发送勘误表将节省其他读者的时间,同时也会帮助我们提供更高质量的信息。

  • Upload
    others

  • View
    28

  • Download
    0

Embed Size (px)

Citation preview

.NET 开发经典名著

Visual Basic 2012 入门经典 (第 7 版)

[美] Bryan Newsome 著

李周芳 陶永才 译

北 京

Bryan Newsome Beginning Visual Basic 2012 EISBN:978-1-118-31181-3 Copyright © 2012 by Wiley Publishing, Inc. All Rights Reserved. This translation published under license.

本书中文简体字版由 Wiley Publishing, Inc. 授权清华大学出版社出版。未经出版者书面许可,不得以任何方式

复制或抄袭本书内容。

北京市版权局著作权合同登记号 图字:01-2013-3402

Copies of this book sold without a Wiley Sticker on the cover are un authorized and illegal.

本书封面贴有 Wiley 公司防伪标签,无标签者不得销售。

版权所有,侵权必究。侵权举报电话:010-62782989 13701121933

图书在版编目(CIP)数据 Visual Basic 2012 入门经典(第 7 版) / (美)纽瑟姆(Newsome, B.) 著;李周芳,陶永才 译. —北京:清华大学

出版社,2013.8

(.NET 开发经典名著)

书名原文:Beginning Visual Basic 2012

ISBN 978-7-302-33415-6

Ⅰ. ①V… Ⅱ. ①纽… ②李… ③陶… Ⅲ. ①BASIC 语言-程序设计 Ⅳ. ①TP312

中国版本图书馆 CIP 数据核字(2013)第 180807 号

责任编辑:王 军 于 平 装帧设计:牛静敏

责任校对:成凤进

责任印制:

出版发行:清华大学出版社

网 址:http://www.tup.com.cn,http://www.wqbook.com 地 址:北京清华大学学研大厦 A 座 邮 编:100084 社 总 机:010-62770175 邮 购:010-62786544 投稿与读者服务:010-62776969, [email protected] 质量反馈:010-62772015, [email protected]

印 刷 者: 装 订 者: 经 销:全国新华书店 开 本:185mm×260mm 印 张:37.25 字 数:999 千字 版 次:2013 年 8 月第 1 版 印 次:2013 年 8 月第 1 次印刷 印 数:1~4000 定 价:79.80 元 —————————————————————————————————————————————— 产品编号:

作 者 简 介

Bryan Newsome 领导一个由顶尖开发人员组成的团队,致力于微软解决方案。自从开始

建立 Visual Basic 5 解决方案以来,他掌握了 Visual Basic 的每个新版本,目前创建的所有新的

解决方案都利用了.NET 平台和 VB.NET。他为客户提供解决方案,并时刻关注微软的最新技

术。Bryan 是 Visual Basic .NET 方面的微软认证程序开发专家(MCPD)。

技术编辑简介

Rod Stephens 最初是一名数学家,但是当在 MIT 工作时,他发现编程是一件非常有趣的

事情,从此,开始专业从事编程工作。他从事各种领域的应用程序的开发,比如电话开关、

计费、维修调度、税务处理、废水处理、音乐会门票销售、制图以及职业足球运动员训练。

Rod 是 Microsoft Visual Basic MVP,在 ITT 技术研究所讲授编程,同时还编写了 20 多本书(已被翻译成多种语言)并发表了250多篇关于C#、Visual Basic、Visual Basic for Application、Delphi和 Java 的杂志文章。他最受欢迎的 VB Helper 网站(www.vb-helper.com)每个月的点击量达到

几百万次,该网站为 Visual Basic 程序员提供了提示、技巧和示例程序。而他的 C# Helper 网站(www.csharphelper.com)为C#程序员提供了类似的资料。你可以通过RodStephens@vb-helper或 [email protected] 与 Rod 联系。

致 谢

感谢那些辛勤工作以使本书面世的所有人,特别要感谢的是 Maureen Spears,是他帮助

我按时完成本书的编写工作。 —— Bryan

前 言

Visual Basic 2012 是微软公司较为流行的 VB.NET 编程语言的最新版本,是 Visual Studio 2012 环境支持的几种语言之一。Visual Basic 2012 的优势在于其易用性和高速度,利用该语

言可以轻松、快捷地编写出 Windows Forms 以及 Windows 8 应用程序、WPF Windows 应用程

序、Web 应用程序、WPF Browser 应用程序、移动设备应用程序和 Web 服务。 本书将全面介绍 Visual Basic 2012 的各种编程知识,展示如何创建上述应用程序类型和

服务。同时,你也可以学习面向对象的编程技术,掌握创建业务对象和 Windows 控件的方法。 微软的.NET Framework 使 Visual Basic 2012 程序员能像 C#或 C++程序员一样创建完全

面向对象的各种程序。.NET Framework 提供了一套对 Visual Studio 2012 中所有的编程语言都

通用的基类,这样一来,使用 VB.NET 的程序员就可以像使用 C#或 C++的程序员那样创建

面向对象的应用程序。 本书将使你在 Visual Basic 2012 编程方面打下坚实的基础,并给你带来编程的无限乐趣。

0.1 本书读者对象

本书的目的是教你如何尽可能快捷地运用 Visual Basic 2012 编写有用的程序。 本书适合于以下两类初学者: ● 一类是编程的初学者,他们选择从 Visual Basic 2012 开始学起。这是个很好的选择!

Visual Basic 2012 不但易学易用,而且功能强大。 ● 另一类是曾用其他语言进行编程,但初次接触.NET 编程知识的人员。这类初学者现在

选择学习Visual Basic 2012是一个不错的主意。不管你熟悉的语言是Fortran还是Cobol,本书都将帮助你迅速掌握 Visual Basic 2012。

0.2 本书主要内容

Visual Basic 2012 提供了工具和语言方面的大量功能。当然,一本书不可能包含 Visual Basic 2012 的所有内容,这些内容要用一个书库来容纳。本书的目的是让你尽快入门,它相

提示:Microsoft 将软件名称“Metro Style Apps”更改为“Windows 8 Apps”。但在本书中,在 Visual Studio 中所使用的实际名称可能略有不同。在本书完

成之后,这些变化也没有被引入到 Visual Studio 中。

Visual Basic 2012 入门经典(第 7 版)

IV

当于一个路标,可以指导你的学习。在介绍创建应用程序的基础知识(如创建窗口和控件,如

何用代码处理突发事件,什么是面向对象的程序设计以及如何在应用程序中使用它等)之余,

本书还为你提供了亲自动手的机会。本书的组织结构如下: ● 第 1~9 章介绍 Visual Studio 2012 和 Windows 编程的基础知识。 ● 第 6、7 章介绍 XAML 和 WPF(Windows Presentation Foundation)编程。 ● 第 10 章阐述应用程序的调试和错误处理方法。 ● 第 11~13 章介绍面向对象编程技术以及如何创建对象。 ● 第 14 章介绍如何创建 Windows Forms 用户控件。 ● 第 15、16 章介绍如何利用数据库进行编程,同时涵盖 Access、SQL Server 及 ADO.NET

等知识。 ● 第 17、18 章简述动态数据网站、ASP.NET,并讨论如何编写 Web 应用程序。 ● 第 19 章介绍使用 ClickOnce(一键部署)技术部署应用程序。 ● 第 20 章介绍如何创建 Windows 8 应用程序,以及如何为触摸界面设计原则。

0.3 Visual Basic 2012 所需的运行环境

除了学习的热情之外,我们还需要一台能够运行 Windows 8(首选)、Windows 7、Windows Server 2008 R2 或 Windows Server 2012 系统以及 Internet Explorer 的计算机。当然,还要安装

下列软件之一: ● Microsoft Visual Basic 2012 Professional Edition ● Microsoft Visual Basic 2012 Premium Edition ● Microsoft Visual Basic 2012 Ultimate Edition ● Microsoft Visual Basic 2012 Team System 对于涉及数据库的章节来说,还应该安装 SQL Server 2012 Express,对于所使用的任何版

本,都不需要进行大的修改。 对于书中的大部分练习,都可以使用该软件的 Express 版本来完成。但最好还是安装多个

Express 版本。 ● Express for Web ● Express for Windows 8 到目前为止,Express for Windows Forms 还没有发布,但估计在本书出版时应该会发布。

0.4 约定

为了帮助读者更好地从文本中获取知识,并了解所发生的一切,在本书中,我们使用了一

些约定。

前 言

V

试一试:

“试一试”是一个你应该完成的练习,它主要包括以下内容: 1. 由一组步骤组成。 2. 每个步骤都有一个编号。 3. 通过使用数据库的副本完成相关步骤。

示例说明 在每个“试一试”练习之后,你所输入的代码将被详细解释。

0.5 源代码

在练习书中的示例时,可以选择手动输入代码或者使用本书附带的源代码文件。书中用

到的所有源代码都可以从 www.wrox.com 下载。进入站点 http://www.worx.com 后,只需要找

到本书的书名(使用 Search 搜索框或书名列表),单击本书详细信息页面上的 Download Code链接,就可以得到本书所有的源代码。

下载完代码后,用你喜欢的压缩工具把它解压缩。此外,也可以去 Wrox 的主下载页面

www.worx.com/dynamic/books/download.aspx 找到本书或 Wrox 出版的其他书籍的代码。

0.6 勘误表

尽管我们竭尽所能来确保在正文和代码中没有错误,但人无完人,错误难免会发生。如

果你在 Wrox 出版的书中发现了错误(例如拼写错误或代码错误),我们将非常感谢你的反馈。

注意:因为很多书的书名都相似,所以用 ISBN 搜索更为容易。本书英文版

的 ISBN 是 978-1-118-31181-3。

警告:类似于这样的方框中包含了重要且不能忘记的信息,这些信息与

周围的文本直接相关。

提示:技巧、暗示以及当前所讨论内容的话外之音。

Visual Basic 2012 入门经典(第 7 版)

VI

发送勘误表将节省其他读者的时间,同时也会帮助我们提供更高质量的信息。 要找到本书的勘误页面,可以进入 www.wrox.com,使用 Search 搜索框或书名列表找到

本书,然后在本书的详细信息页面上单击 Book Errata 链接。在这个页面上可以查看为本书提

交的、Wrox 编辑粘贴上去的所有错误。完整的书名列表(包括每本书的勘误表)也可以从

www.wrox.com/misc-pages/booklist.shtml 上获得。 如果在本书的勘误页面上没有看到你发现的错误,可以到 www.wrox.com/contact/

techsupport.shtml 上填写表单,把你发现的错误发给我们。我们会检查这些信息,如果属实,

就把它添加到本书的勘误页面上,并在本书随后的版本中更正错误。

0.7 p2p.wrox.com

如果想和作者或同行进行讨论,请加入 p2p.wrox.com 上的 P2P 论坛。该论坛是一个基

于 Web 的系统,你可以发布有关 Wrox 图书及相关技术的消息,与其他读者或技术人员交流。

该论坛提供了订阅功能,当你感兴趣的主题有新帖子发布时,系统会邮件通知。Wrox 的作者、

编辑、其他业界专家和像你一样的读者都会出现在这些论坛中。 在 p2p.wrox.com 网站上,你会找到很多不同的论坛,它们不但有助于你阅读本书,还有

助于你开发自己的应用程序。加入论坛的步骤如下: (1) 进入 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 2012 ................1 1.1 事件驱动编程...................................2 1.2 安装 Visual Basic 2012.....................3 1.3 Visual Basic 2012 集成开发环境 .....5

1.3.1 初始化开发环境 ...................5 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

第 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 执行代码 .............................23

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 算法 .................................... 30 3.1.2 什么是编程语言 ................ 30

3.2 使用变量 ........................................ 31 3.3 注释和空白 .................................... 34

3.3.1 注释 .................................... 34 3.3.2 空白 .................................... 35

3.4 数据类型 ........................................ 35 3.4.1 使用数字 ............................ 35 3.4.2 常见的整型数学运算 ........ 36 3.4.3 整型运算的缩写方式 ........ 39 3.4.4 浮点型数学运算 ................ 40 3.4.5 使用字符串 ........................ 42 3.4.6 使用日期 ............................ 50 3.4.7 布尔类型 ............................ 56

3.5 存储变量 ........................................ 56 3.5.1 二进制 ................................ 56 3.5.2 位和字节 ............................ 57 3.5.3 值的表示 ............................ 57 3.5.4 值的转换 ............................ 58

3.6 方法 ................................................ 60 3.6.1 使用方法的原因 ................ 60 3.6.2 前面曾介绍过的方法 ........ 61 3.6.3 创建方法 ............................ 64 3.6.4 选择方法名称 .................... 66 3.6.5 作用域 ................................ 67

3.7 小结 ................................................ 69

第 4 章 流程控制 ....................................71 4.1 作出决策 ........................................ 71 4.2 If 语句 ............................................ 72

4.2.1 Else 语句 ............................ 73 4.2.2 可进行多重选择的 ElseIf

语句 .................................... 74 4.2.3 嵌套的 If 语句 ................... 75

Visual Basic 2012 入门经典(第 7 版)

VIII

4.2.4 单行 If 语句 ........................76 4.2.5 比较运算符 .........................76 4.2.6 字符串比较 .........................84

4.3 Select Case 语句 .............................85 4.3.1 不区分大小写的 Select

Case 语句 ............................88 4.3.2 多重选择 .............................91 4.3.3 Case Else 语句 ....................91 4.3.4 Select Case 中的不同数据

类型 .....................................92 4.4 循环.................................................92

4.4.1 For…Next 循环..................93 4.4.2 Do…Loop 循环...................98 4.4.3 嵌套循环 ...........................102 4.4.4 提前退出循环 ...................104 4.4.5 无限循环 ...........................106

4.5 小结...............................................107

第 5 章 处理数据结构 ...........................109 5.1 数组...............................................110

5.1.1 定义和使用数组 ...............110 5.1.2 使用 For Each…Next

循环 ...................................113 5.1.3 将数组作为参数传递 .......115 5.1.4 数组的排序 .......................117 5.1.5 反向检索 ...........................118 5.1.6 用值初始化数组 ...............119

5.2 枚举...............................................120 5.2.1 使用枚举 ...........................120 5.2.2 确定状态 ...........................124 5.2.3 设置无效值 .......................126

5.3 常量...............................................126 5.3.1 使用常量 ...........................126 5.3.2 各种常量类型 ...................128

5.4 结构...............................................128 5.4.1 创建结构 ...........................129 5.4.2 为结构添加属性 ...............131

5.5 ArrayList .......................................132 5.5.1 使用 ArrayList ..................132

5.5.2 在 ArrayList 中进行 删除操作 .......................... 136

5.5.3 显示 ArrayList 中的项..... 139 5.6 集合 .............................................. 140

5.6.1 创建 CustomerCollection 类 ...................................... 141

5.6.2 添加 Item 属性 ................. 142 5.7 使用 HashTable 创建查询表 ....... 144

5.7.1 使用 HashTable ................ 144 5.7.2 Remove、RemoveAt 和

Clear 方法 ........................ 147 5.7.3 区分大小写 ...................... 149

5.8 高级数组操作 .............................. 151 5.8.1 动态数组 .......................... 151 5.8.2 使用 Preserve 关键字 ...... 152

5.9 小结 .............................................. 153

第 6 章 可扩展应用程序标记语言 (XAML).....................................155

6.1 什么是 XAML ............................. 155 6.2 XAML 语法 ................................. 156 6.3 WPF.............................................. 159

6.3.1 创建一个富 WPF 用户界面 .......................... 160

6.3.2 使用 WPF 通用控件 ........ 165 6.3.3 连接事件 .......................... 168

6.4 小结 .............................................. 172

第 7 章 构建 Windows 应用程序 ..........173 7.1 响应事件 ...................................... 173 7.2 创建简单的应用程序 .................. 180

7.2.1 统计字符 .......................... 183 7.2.2 统计单词 .......................... 185

7.3 创建更复杂的应用程序 .............. 191 7.3.1 Text Editor 项目 ............... 191 7.3.2 创建工具栏 ...................... 192 7.3.3 创建状态栏 ...................... 196 7.3.4 创建编辑框 ...................... 197 7.3.5 清除编辑框 ...................... 199 7.3.6 响应工具栏按钮 .............. 202

目 录

IX

7.4 使用多个窗体...............................207 7.5 小结...............................................210

第 8 章 显示对话框 ...............................213 8.1 MessageBox 对话框 .....................213

8.1.1 MessageBox 中的可用 图标 ...................................214

8.1.2 MessageBox 中的可用 按钮 ...................................214

8.1.3 设置默认按钮 ...................215 8.1.4 其他选项 ...........................215 8.1.5 Show 方法的语法 .............216 8.1.6 MessageBox 的示例 .........217

8.2 OpenFileDialog 控件 ....................220 8.2.1 OpenFileDialog 控件 ........220 8.2.2 OpenFileDialog 的属性 ....221 8.2.3 OpenFileDialog 的方法 ....222 8.2.4 使用 OpenFileDialog

控件 ...................................222 8.3 SaveFileDialog 控件 .....................227

8.3.1 SaveFileDialog 的属性 .....227 8.3.2 SaveFileDialog 的方法 .....228 8.3.3 使用 SaveFileDialog

控件 ...................................228 8.4 FontDialog 控件............................231

8.4.1 FontDialog 的属性............231 8.4.2 FontDialog 的方法............232 8.4.3 使用 FontDialog 控件.......232

8.5 ColorDialog 控件..........................234 8.5.1 ColorDialog 的属性 ..........235 8.5.2 使用 ColorDialog 控件 .....235

8.6 PrintDialog 控件 ...........................237 8.6.1 PrintDialog 的属性 ...........237 8.6.2 使用 PrintDialog 控件 ......238 8.6.3 PrintDocument 类 .............238 8.6.4 打印文档 ...........................238

8.7 FolderBrowserDialog 控件 ...........244 8.7.1 FolderBrowserDialog

控件的属性 .......................245

8.7.2 使用 FolderBrowserDialog 控件 .................................. 245

8.8 小结 .............................................. 248

第 9 章 创建菜单 ..................................249 9.1 菜单功能概述 .............................. 249

9.1.1 图像 .................................. 250 9.1.2 访问键 .............................. 250 9.1.3 快捷键 .............................. 250 9.1.4 复选标记 .......................... 250 9.1.5 Properties 窗格 ................. 251

9.2 创建菜单 ...................................... 252 9.2.1 设计菜单 .......................... 252 9.2.2 添加工具栏和控件 .......... 254 9.2.3 为菜单编写代码 .............. 255 9.2.4 为 View 菜单和工具栏

编写代码 .......................... 259 9.2.5 测试代码 .......................... 260

9.3 上下文菜单 .................................. 262 9.3.1 创建上下文菜单 .............. 263 9.3.2 启用或禁用菜单项和

工具栏按钮 ...................... 265 9.4 小结 .............................................. 269

第 10 章 调试和错误处理 .....................271 10.1 主要错误类型 ............................ 272

10.1.1 语法错误 ...................... 272 10.1.2 执行错误 ...................... 275 10.1.3 逻辑错误 ...................... 275

10.2 调试 ............................................ 276 10.2.1 创建示例项目 .............. 277 10.2.2 设置断点 ...................... 291 10.2.3 使用 Watch 窗口和

QuickWatch 对话框进行 调试 .............................. 298

10.2.4 使用 Autos 窗口进行 调试 .............................. 300

10.2.5 使用 Locals 窗口进行 调试 .............................. 300

10.3 错误处理 .................................... 301

Visual Basic 2012 入门经典(第 7 版)

X

10.4 小结.............................................304

第 11 章 构建对象 .................................307 11.1 对象的概念 .................................307

11.1.1 封装 ...............................308 11.1.2 方法和属性 ...................308 11.1.3 事件 ...............................309 11.1.4 可见性 ...........................309 11.1.5 类的概念 .......................310

11.2 构建类 .........................................310 11.3 重用性 .........................................311 11.4 设计对象 .....................................312

11.4.1 状态 ...............................313 11.4.2 行为 ...............................313 11.4.3 存储状态 .......................314 11.4.4 属性 ...............................316 11.4.5 读/写属性 ......................319 11.4.6 自实现属性 ...................321 11.4.7 IsMoving 方法 ..............321

11.5 构造函数 .....................................323 11.6 继承 .............................................325

11.6.1 添加新方法和属性 .......326 11.6.2 添加 GetPowerTo-

WeightRatio 方法..........328 11.6.3 改变默认值 ...................329 11.6.4 多态性:可怕的单词,

简单的概念 ...................331 11.6.5 重写更多的方法 ...........332 11.6.6 从对象类中继承 ...........333

11.7 对象和结构 .................................334 11.8 框架类 .........................................334

11.8.1 名称空间 .......................334 11.8.2 Imports 语句..................337 11.8.3 创建自己的名称空间 ...337 11.8.4 .NET Framework 中的

继承...............................340 11.9 小结 .............................................341

第 12 章 面向对象的高级技术 ..............343 12.1 构建收藏页浏览应用程序 .........343

12.1.1 Internet 快捷方式和 收藏页 .......................... 344

12.1.2 使用类 .......................... 346 12.1.3 遍历收藏页 .................. 351 12.1.4 查看收藏页 .................. 358

12.2 另一个收藏页浏览应用程序 .... 360 12.2.1 构建收藏页的系统

托盘图标 ...................... 360 12.2.2 显示收藏页 .................. 361

12.3 使用共享属性和方法 ................ 364 12.3.1 使用共享属性 .............. 365 12.3.2 使用共享方法 .............. 369

12.4 理解面向对象编程和内存管理... 370 12.4.1 垃圾回收 ...................... 371 12.4.2 释放资源 ...................... 372 12.4.3 整理碎片和压缩 .......... 373

12.5 小结 ............................................ 374

第 13 章 建立类库 ................................375 13.1 理解类库 .................................... 376

13.1.1 创建类库 ...................... 376 13.1.2 为 Favorites Viewer

项目创建类库 .............. 378 13.1.3 多层应用程序 .............. 380

13.2 使用强命名 ................................ 381 13.2.1 对程序集签名 .............. 382 13.2.2 程序集版本 .................. 384

13.3 注册程序集 ................................ 384 13.3.1 Gacutil 实用程序 ......... 385 13.3.2 程序集在 References

对话框中不可见的 原因 .............................. 385

13.4 设计类库 .................................... 385 13.5 使用第三方类库 ........................ 386 13.6 用对象浏览器查看类 ................ 387 13.7 小结 ............................................ 388

第 14 章 创建 Windows 窗体用户控件 ...391 14.1 Windows 窗体控件 .................... 391 14.2 创建和测试用户控件 ................ 392

目 录

XI

14.3 公开用户控件的属性 .................395 14.3.1 给用户控件添加属性 ....396 14.3.2 公开用户控件的方法 ....397 14.3.3 给用户控件添加事件 ....398

14.4 设计期间或运行期间 .................402 14.5 创建 Command Link 控件..........405

14.5.1 创建 Command Link 控件...............................405

14.5.2 使用 Command Link 控件...............................413

14.6 小结.............................................415

第 15 章 使用结构化查询语句访问 数据库 ....................................417

15.1 完成本章练习所需要掌握的 知识 .............................................418

15.2 什么是数据库 .............................419 15.2.1 数据库表 .......................419 15.2.2 主键和外键 ...................423 15.2.3 查询...............................425

15.3 理解基本的 SQL 语法 ...............426 15.3.1 使用 SELECT 语句 ......426 15.3.2 使用 JOIN 语句 ............427 15.3.3 使用 UPDATE 语句......428 15.3.4 使用 DELETE 语句......429 15.3.5 使用 INSERT 语句 .......429 15.3.6 使用 SQL 注释 .............430

15.4 在 SQL Server 中执行查询 ........431 15.5 小结.............................................434

第 16 章 使用 SQL Server 和 ADO.NET 进行数据库编程 ......................435

16.1 ADO.NET ...................................436 16.2 ADO.NET 数据名称空间 ..........436

16.2.1 SqlConnection 类 ..........437 16.2.2 使用连接字符串参数 ....437 16.2.3 打开和关闭连接 ...........438 16.2.4 SqlCommand 类 ............438 16.2.5 SqlDataAdapter 类 ........440 16.2.6 DataSet 类 .....................444

16.2.7 DataView 类 ................. 444 16.3 使用 ADO.NET 类..................... 446 16.4 数据绑定 .................................... 454

16.4.1 BindingContext 和 CurrencyManager 对象... 455

16.4.2 绑定控件 ...................... 456 16.5 小结 ............................................ 482

第 17 章 动态数据网站 .........................485 17.1 创建一个动态数据实体网站 .... 485 17.2 定制动态数据网站的设计 ........ 490

17.2.1 页面模板 ...................... 490 17.2.2 实体模板 ...................... 490 17.2.3 字段模板 ...................... 490 17.2.4 过滤器模板 .................. 490

17.3 小结 ............................................ 495

第 18 章 ASP.NET................................497 18.1 瘦客户端体系结构 .................... 498 18.2 Web 窗体和 Windows 窗体

的比较 ........................................ 498 18.2.1 Windows 窗体的优点 ... 499 18.2.2 Web 窗体的优点 .......... 499

18.3 Web 应用程序基础 .................... 499 18.3.1 Web 服务器 .................. 500 18.3.2 浏览器 .......................... 500 18.3.3 超文本标记语言 .......... 500 18.3.4 JavaScript ..................... 500 18.3.5 CSS............................... 501

18.4 关于 ASP 页面........................... 501 18.4.1 ASP.NET Web 页面的

优点............................... 501 18.4.2 特殊的 Web 站点文件... 501 18.4.3 开发方式 ...................... 502 18.4.4 工具箱 .......................... 502

18.5 构建 Web 应用程序 ................... 502 18.5.1 为客户端和服务器端

处理创建 Web 窗体 ..... 502 18.5.2 Visual Studio 2012 中

Web 站点的位置 .......... 507

Visual Basic 2012 入门经典(第 7 版)

XII

18.5.3 数据的输入和验证 .......509 18.5.4 设计布局、主题和

导航 ...............................514 18.5.5 使用 GridView 构建数据

驱动的 Web 窗体 ..........518 18.6 小结.............................................522

第 19 章 部署应用程序 .........................525 19.1 什么是部署.................................525

19.1.1 ClickOnce 部署.............526 19.1.2 XCOPY 部署 ................531

19.2 创建 Visual Studio 2012 安装程序......................................531

19.3 自定义用户界面 .........................536 19.4 部署不同的解决方案 .................537

19.4.1 私有程序集 ...................537 19.4.2 共享程序集 ...................538 19.4.3 部署桌面应用程序 .......538 19.4.4 部署 Web 应用程序......538 19.4.5 部署 XML Web 服务 ....539

19.4.6 一些有用的工具 .......... 539 19.5 小结 ............................................ 539

第 20 章 Windows 8 应用程序..............541 20.1 Windows 8 应用程序的

设计原则 .................................... 542 20.1.1 使用触摸 ...................... 542 20.1.2 应用程序命令 .............. 542 20.1.3 Windows 8 控件 ........... 543 20.1.4 创建第一个 Windows 8

应用程序 ...................... 544 20.2 应用程序布局 ............................ 556

20.2.1 应用程序视图 .............. 556 20.2.2 屏幕大小和方向 .......... 557

20.3 小结 ............................................ 562

附录 A 练习题答案 ...............................563

附录 B 如何深入学习............................577

初识Visual Basic 2012

本章主要内容: ● 事件驱动编程 ● Visual Basic 2012 的安装 ● Visual Basic 2012 集成开发环境(Integrated Development Environment, IDE) ● 创建简单的 Windows 程序 ● 使用集成帮助系统 本章的 wrox.com 代码下载 你可以从 www.wrox.com/remtitle.cgi?isbn=1118311813 的 Download Code 选项卡中找到本章的

wrox.com 代码。该代码位于 311813 C01.zip 下载文件中。 用 Visual Basic 2012 和 Windows 8 进行编程是令人兴奋的。Windows 8 是微软最新发布的

Windows 操作系统,其中包含许多使 Windows 编程更加有趣的新功能。Windows 用户界面和 Visual Basic 2012 中的重大改变,非常便于编写专业的 Windows 应用程序、Web 应用程序和 Web 服务。你

还没有升级到 Windows 8 吗?不必担心,Visual Basic 2012 也可为 Windows 的以前版本编写专业的

应用程序。 即使你以前从未编写过任何程序,通过本书的学习,也仍然可以快速掌握 Visual Basic 2012 编

程语言。我们将循序渐进地介绍Visual Basic 2012 的基础知识,并在后续章节中根据所学到的相关知

识构建应用程序。首先请深吸一口气,并缓慢吐出,并告诉自己可以毫不费力地掌握它。 编写计算机程序非常类似于教小孩系鞋带。要想成功,必须找到给出指令的正确方式。使用

Visual Basic 2012 语言就可以告诉计算机该如何去做。但计算机像小孩子一样,只有把事情解释得

非常清楚,它才会明白。如果你以前从未编写过程序,可能学习起来会费劲些。然而,Visual Basic 2012 是一种可用来解释某些复杂任务的简单语言。能理解最基础的知识固然很好,而 Visual Basic 2012 能把编程人员从编写复杂 Windows 程序的繁琐工作中解放出来,让他们集中精力去解决实际

问题。

1 第 章

Visual Basic 2012 入门经典(第 7 版)

2

Visual Basic 2012 有助于创建运行在 Windows 操作系统(如 Windows 8、Windows Server 2008 和

Windows Phone)下的应用程序。如果正在看这本书,那么你可能希望或需要创建这类程序。即使你

以前从未接触过编程,但通过阅读本书中“试一试”部分的内容,也会逐渐熟悉 Visual Basic 2012语言的方方面面,以及 Microsoft .NET Framework 的基础知识。你会发现,其实它比我们想象的要

容易。在了解这一点之前,你将感受到可以轻松地使用 Visual Basic 2012 创建各种不同的程序。 Visual Basic 2012 也可用于创建 Web 应用程序和 Web 服务,以及可在 Pocket PC 或智能手机上

运行的移动应用程序。然而,在扩展到其他平台之前,首先应该先学习 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 来创建可供用户直接访

问的数据库应用程序(即所谓的前端应用程序),不再需要依赖第三方的控件。微软使用数据访问对

第 1 章 初识 Visual Basic 2012

3

象(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已经在编程领域占据了主导地位。它可以帮助开发人员在数字化时代编写出健壮的、可维护的应用

程序。 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 2012 的发布继续保

持了这一优势。Visual Basic .NET 编程语言的每次新发布都带来了许多新变化、新功能和新改进,

使其成为不同水平程序员的最佳选择。

1.2 安装 Visual Basic 2012

Visual Basic 2012 有如下两个版本: ● 作为 Visual Studio 2012 的一部分,Visual Studio 2012 是一个套装语言软件,其中还包含

C#(读作C-sharp)和Visual C++。Visual Studio 2012产品系列包括Visual Studio Professional Edition 或 Visual Studio Tools Team Edition。Team Edition 附带的工具可用于创建和管理

大型企业应用程序的开发。 ● Visual Basic 2012 Express 版本(针对学生和初学者的免费版本),包括 Visual Basic 2012 语

言和 Visual Studio 2012 附带的一些工具和功能的简化版本。

这两个版本都可以用于创建在 Windows 平台下运行的应用程序,安装过程都非常简单。事实上,

Visual Studio 安装程序可以非常智能地确定计算机需要安装什么内容。 下面的“试一试”部分基于 Visual Studio 2012 Professional Edition Beta 1 的安装过程。大多数

安装过程都十分简单,在大多数环境下只需要接受默认安装设置即可。不管安装的是哪一种版本,

只要选择默认的安装选项,安装过程都可顺利完成。

试一试: 安装 Visual Basic 2012

可以使用两种常用的方法来安装 Visual Studio。首先可以从下载的镜像文件中刻录 DVD,或者

也可以使用 Web 安装程序。如果使用 Web 安装程序,则需要按照屏幕上的提示进行操作。而如果

选择刻录 DVD,则应按照下列步骤进行操作。

Visual Studio 2012 光盘有自动运行的功能,但如果在插入光盘后没有出现安装界面,就必须从

光盘的根目录下运行 setup.exe 文件进行安装。为此,应执行如下步骤:

Visual Basic 2012 入门经典(第 7 版)

4

(1) 单击 Windows 桌面中的“开始”菜单(通常在屏幕的左下角),并选择“运行”命令或浏览

至光盘上的 Setup 程序。在“运行”对话框中,可单击“浏览”按钮,定位至光盘上的 setup.exe 程

序。然后单击“运行”对话框中的 OK 按钮启动安装程序。安装程序初始化后,会出现如图 1-1 所

示的界面。

图 1-1

(2) 图 1-1 所示的对话框显示了安装的位置和大小。同时,还需要选择条款前面的复选框,从而

同意相关的条款和条件。然后你将会看到一个 Install Visual Studio 的超链接。请选择复选框并单击

Install 开始安装。

(3) 一旦完成安装,你将会看到一个如图 1-2 所示的显示安装状态的对话框。通过该对话框,可

以启动 Visual Studio。单击 LAUNCH 按钮以启动应用程序。

提示:如果你是 Windows Vista、Windows 7 或者 Windows 8 的用户,那么可

能会被提示需要运行安装程序,在这种情况下,要拥有相关权限才能让安装程序

继续。一旦运行了安装程序,你就可以休息一下,直到所有功能设置完毕。根据

你所选择的安装功能以及计算机的速度,整个安装过程可能要花费 20 分钟或者

更长时间。

第 1 章 初识 Visual Basic 2012

5

单击 LAUNCH 按钮以启动应用程序

图 1-2

完成了更新过程后,就可以使用Visual Studio 2012 了。现在让我们畅游Visual Basic 2012 世界吧!

1.3 Visual Basic 2012 集成开发环境

用 Visual Basic .NET 语言编写应用程序并不需要 Visual Basic 2012,.NET Framework 具备运行

Visual Basic .NET 代码的能力。所以,使用像 Notepad 这类文本编辑器就可以编写所有的 Visual Basic .NET 代码。可以用鞋子充当锤子来敲钉子,但灵巧的气动钉枪要有效得多。同样,到目前为

止,编写 Visual Basic .NET 代码最简单的方法是使用 Visual Studio 2012 集成开发环境(IDE),即运行

Visual Basic 2012 时出现的窗口、对话框等。IDE 提供了普通文本编辑器没有的丰富功能,例如代码

检查、已完成应用程序的可视化表示,以及一个显示构成项目的所有文件的浏览器。

1.3.1 初始化开发环境

IDE 集成了一组工具,使开发软件变得更为简便。启动 Visual Studio 2012,如果使用默认安装

选项,就应从 Windows 的“开始”菜单中选择“所有程序”| Visual Studio 11 命令。在显示一个闪

屏后,会马上出现 Choose Default Environment Settings 对话框。选择 Visual Basic Development Settings选项,然后单击 Start Visual Studio。Visual Studio 根据所选的设置配置环境后,会显示 Microsoft Development Environment,如图 1-3 所示。

Visual Basic 2012 入门经典(第 7 版)

6

图 1-3

1.3.2 菜单

至此,你可能希望开始编写代码。但请等一下,我们将从菜单和工具栏开始 Visual Basic 2012探险之旅。实际上,这些菜单和工具栏与其他 Windows 应用程序中的菜单和工具栏没有太大的区别

(但与 Office 2007 的功能区和某些较新的 Windows 应用程序不同)。 Visual Studio 2012 的菜单是动态的,可以根据需要添加或删除菜单项。在浏览空白 IDE 时,菜

单栏中只有 File、Edit、View、Tools、Test、Window 和 Help 菜单。但是,当开始一个新项目时,就

会显示 Visual Studio 2012 的完整菜单,如图 1-4 所示。

图 1-4

其实没有必要详细介绍每个菜单,在学习本书的过程中,你会逐渐熟悉它们。下面简述每个菜

单的功能: ● File:大部分软件程序都有 File 菜单。它已经成为一个标准,通常可从中找到退出应用程序

的选项。这个菜单还有打开、关闭单个文件和整个项目的选项。 ● Edit:Edit 菜单提供的选项有 Undo、Redo、Cut、Copy、Paste 和 Delete。 ● View:通过 View 菜单可以快速访问 IDE 中的窗口,如 Solution Explorer、Properties、Output

和 Toolbox(工具箱)窗口等。 ● Project:Project 菜单允许向应用程序中添加各种文件,如窗体和类。 ● Build:当编写完应用程序后,并且希望在不使用Visual Basic 2012环境的情况下运行它时(直

接从 Windows 的“开始”菜单运行,像其他应用程序(如 Word 或 Access 那样),Build 菜单

就显得非常重要。

第 1 章 初识 Visual Basic 2012

7

● Debug:通过 Debug 菜单可以在 Visual Basic 2012 IDE 中启动和停止运行应用程序。同时还

可以访问 Visual Studio 2012 调试器。调试器允许单步执行代码,以观察它的执行情况。 ● Team:该菜单可以连接到 Team Foundation Server。当与一个团队合作开发软件时可以使

用该菜单。 ● SQL:SQL 菜单允许使用数据库,并在 IDE 中创建 SQL。 ● Data:通过 Data 菜单可以使用数据库中的信息。该菜单允许查看、添加数据源及预览数据。

第 15 章和第 16 章将介绍如何使用数据库。 ● Format:该菜单可以格式化控件。当设计一个 Windows 窗体时,可以使用该菜单最终确定

窗体的设计、对齐控件以及调整控件大小,从而使窗体看起来更加完美。 ● Tools:Tools 菜单有配置 Visual Studio 2012 IDE 的命令,以及启动其他已安装的外部工具

的链接。 ● Unit Test:Unit Test菜单可以创建和查看应用程序的单元测试,以便在不同场景中运用源代码。 ● Window:Window 菜单也是标准的。它允许像 Word 和 Excel 那样同时打开多个窗口。通

过这个菜单中的命令可以在 IDE 中切换窗口。 ● Help:通过 Help 菜单可以访问 Visual Studio 2012 文档。访问该文档有多种方式,如通过帮

助目录、索引或搜索。Help 菜单中的选项还可以连接到微软的 Web 站点上,从而获取更新

内容或报告问题。

1.3.3 工具栏

IDE 中有许多工具栏,包括 Formatting、Image Editor 和 Text Editor,通过选择 View | Toolbars命令,可以在 IDE 中添加或删除这些工具栏。每个工具栏都提供了对常用命令的快速访问,而不必

选择相应的菜单项。例如,单击图 1-5 所示的默认工具栏(标准工具栏)最左边的图标(New Project),就相当于选择了 File | New Project 命令。

图 1-5

在这个工具栏中,相关的选项被分组并用竖线分开。 ● Navigation:第一组图标可用来在代码中移动光标。在代码中可以使用这些图标来前后移动

光标。 ● Project and file options:通过使用接下来的四个图标,可以实现 File 和 Project 菜单所实现的

常用的项目和文件操作,比如打开和保存文件。 ● Code commenting:第 3 组图标用于注释和取消注释某段代码。在调试时,如果需要注释一

段代码,以确定不执行这些代码会有什么结果,就可以使用这组图标。 ● Managing Code edits:第 4 组图标用于执行撤消与恢复操作,以及在代码中移动光标。 ● Code step through:第 5 组图标用于启动(绿色的三角形)、暂停和停止运行应用程序。同时,

还可以使用该组的 3 个图标单步执行代码、跳过整块代码和跳出过程。可以使用解决方案配

置来生成项目,以便调试代码或者产生可向用户发布的软件。第 10 章将深入介绍这些图标。 ● Find in files dialog:最后一个图标可以访问 Find In Files 对话框。这是一个常用且非常重要

的功能。此外,还可以通过按下 Ctrl+F 组合键访问该对话框。

Visual Basic 2012 入门经典(第 7 版)

8

如果忘了某个图标的用途,可以把鼠标指针悬停在它上面,就会出现一个工具提示,显示这个

工具栏选项的名称。 如果想查看 IDE 中的每个窗口,可以单击 View 菜单,并选择相应的窗口;但此时这些窗口都

是空的,因此没有太大的意义。了解 IDE 功能的最好方法是用它来编写一些代码。

1.4 创建简单的应用程序

如果想完成对 IDE 的探索工作,需要创建一个项目,从而使前面介绍的图 1-3 所示的窗口内出

现一些有趣的内容。

试一试: 创建 Hello User 项目 下面的“试一试”练习将创建一个非常简单的应用程序 Hello User,该程序允许用户输入一个

人名,并在消息框中显示对这个人的问候信息。 (1) 单击工具栏上的 New Project 按钮。 (2) 在 New Project 对话框中,选择左侧 Installed Templates 树状列表中的 Visual Basic,再选择它

下面的 Windows。右边的 Templates 面板将显示所选项目类型的所有可用模板。选择 Windows Forms Application 模板。

(3) 在 Name 文本框中输入 Hello User 并单击 OK 按钮。New Project 对话框如图 1-6 所示。

图 1-6

Visual Studio 2012 允许将应用程序面向特定版本的.NET Framework。New Project 对话框中

Templates 面板顶部的组合框中默认选择了.NET Framework 4.5,但也可以将应用程序面向.NET

第 1 章 初识 Visual Basic 2012

9

Framework 的更早版本。 IDE 将创建一个空的 Windows 应用程序。目前,Hello User 程序只包含一个空窗口 Windows

Form(有时只是一个窗体),其默认名称为 Form1.vb,如图 1-7 所示。

图 1-7

无论何时,不管是由 Visual Studio 2012 创建一个新文件作为项目创建过程的一部分,还是由用

户创建一个新文件,都会用一个名称来描述这个文件(本例中是 Form),并在其后加上一个数字。

Visual Studio 2012 集成开发环境中的窗口

现在,IDE 中的各种窗口将一一亮相。在继续上面的示例之前,先简要介绍一下这些窗口。 下面介绍最常用的窗口: ● Toolbox:Toolbox 包括可添加到应用程序的可重用控件和组件。其中包括按钮、数据连接

器、可购买或自行开发的定制控件。 ● Design:许多操作都是在 Design 窗口中进行的。在 Design 窗口中,可以绘制用户界面。这

个窗口有时也称为设计器。 ● Solution Explorer:Solution Explorer 窗口可分级显示解决方案。一个解决方案可以包括多

个项目,而一个项目可以包含解决某个特定问题的窗体、类、模块和组件。

注意:如果某个窗口在屏幕上未出现,可以使用 View 菜单显示它。如果对某个

窗口的位置不满意,可以单击该窗口的标题栏(顶部的蓝条)并将其拖到一个新的位置。

IDE 中的窗口可以浮动,也可停靠(见图 1-7)。

Visual Basic 2012 入门经典(第 7 版)

10

● Properties:Properties 窗口显示了所选对象的可用属性。虽然可以在代码中设置这些属性,

但有时在设计应用程序时设置它们会更容易,例如,在窗体上绘制控件。注意 File Name 属性的值为 Form1.vb,这是窗体代码和布局信息的物理文件名。

试一试: 继续创建 Hello User 项目 接下来,对窗体命名并设置一些属性。 (1) 把窗体的名称改为更能反映这个应用程序的名称。在 Solution Explorer 窗口中单击

Form1.vb,接着在Properties窗口中把File Name属性的值从Form1.vb改为HelloUser.vb,然后按Enter键,如图 1-8 所示。在修改属性时,必须按下Enter 键或单击另一属性,才能使该属性设置发挥作用。

(2) 当更改相关属性时,必须按 Enter 键或者单击其他属性,以便使所做的更改生效。注意,此

时 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 2012,并按下 Enter 键。注意,这时窗体的标题已更新,以反映所做的更改。

图 1-8 图 1-9

注意:Properties 窗口已经有了很大的不同,原因是同一文件有两个不同的视图。

当窗体的名称在 Solution Explorer 窗口中被突出显示时,Properties 窗格显示的是窗体

的物理文件属性。当窗体的名称在 Design 窗口中被突出显示时,Properties 窗口显示

的是窗体的可视化属性和逻辑属性。

第 1 章 初识 Visual Basic 2012

11

(5) 现在就完成了应用程序的创建。单击 Visual Studio 2012 工具栏上的 Start 按钮(绿色三角形),

运行该应用程序。在阅读本书时,如果碰到“运行项目”或“启动项目”,就是指单击 Start 按钮。

此时会显示一个名为 Hello from Visual Basic 2012 的空窗口。

一切都非常简单,但此刻这个小程序什么也不能做,下面给它添加一些交互功能。为此,先在

窗体中添加一些控件:一个标签、一个文本框和两个按钮。在这些添加操作中,可以看出工具箱是

如何使添加功能变得非常简便的。当你查看相关代码时可能会感到惊讶!Visual Basic 2012 的一个优

点是它可以完成应用程序中的许多工作,却不用编写任何代码。当然,代码依旧存在,只是在后台,

并且由 Visual Basic 2012 编写。

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 2012 入门经典(第 7 版)

12

可以按任意顺序将控件添加到窗体中,所以,在文本框控件后添加标签控件,或者在标签控件

前添加按钮都是可行的。

试一试: 向 Hello User 应用程序添加控件 在接下来的“试一试”练习中,我们开始添加一些控件。 (1) 如果项目正在运行,请首先将其停止运行,因为下面要在窗体中添加一些控件。停止项目

最简单的方法是单击窗体右上角的“关闭”(X)按钮,或者单击 IDE 中的蓝色方块(如果把鼠标指针

悬停在它上面,就会显示工具提示 Stop Debugging)。

(2) 给窗体添加一个 Label 控件。单击工具箱中的 Label,将其拖放到窗体设计器的合适位置(要在窗体上添加控件,还可以在工具箱中双击所需的控件;或者在工具箱中单击所需的控件,然后将

其拖放到窗体上)。 (3) 如果刚才拖放的 Label 控件不在希望的位置,或者大小不合适,那也不必担心。将该控件拖

放到窗体中后,就可以调整它的尺寸,或者在窗体中移动它。图 1-11 所示为 Label 控件被拖放到窗

体中的样子。要移动它,可以单击该控件,将它拖到需要的位置。Label 控件会根据 Text 属性的设

置自动调整尺寸。 (4) 在窗体中绘制好一个控件后,就可以为其设定名称和要显示的文本。Designer 窗口右边的

Properties 窗口现在已经变为 Label1,说明当前正在查看它的属性。在 Properties 窗口中,将新标签

的 Text 属性设置为 Enter Your Name。注意,只有按下 Enter 键或单击另一个属性后,窗体上的标签

才会根据 Text 属性的设置值自动调整尺寸。现在将它的 Name 属性设置为 lblName。 (5) 在标签的下面添加一个文本框,以便输入一个名称。重复添加标签的过程,但这次是从工

具箱中选择 TextBox 控件。一旦把这个控件拖放(或双击)到合适的位置,就可以使用 Properties 窗口,

将它的 Name 属性设置为 txtName,如图 1-12 所示。注意控件左边和右边的尺寸调整句柄,它们可

以水平地调整文本框的尺寸。

图 1-11 图 1-12

(6) 在窗体的左下角,添加一个 Button 控件,方法与添加标签和文本框的方法完全相同。将它

的 Name 属性设置为 btnOK,将 Text 属性设置为&OK。现在窗体应如图 1-13 所示。 按钮的 Text 属性中使用了&符号,以创建键盘快捷方式(即热键)。&符号后面的字母会被加上下

划线,如图 1-13 所示,说明除了使用鼠标外,还可以同时按 Alt 和这个字母键来选择这个按钮(在一

第 1 章 初识 Visual Basic 2012

13

些配置中,在用户按下 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 2012 中的表示法就被称为改进型匈

牙利表示法。表 1-1 列出了本书常用的一些前 。

图 1-13

Visual Basic 2012 入门经典(第 7 版)

14

表 1-1 Visual Basic 2012 中常用的前缀

控 件 前 缀

Button(按钮) btn

ComboBox(组合框) cbo

CheckBox(复选框) chk

Label(标签) lbl

ListBox(列表框) lst

MainMenu(主菜单) mnu

RadioButton(单选按钮) rdb

PictureBox(图形框) pic

TextBox(文本框) txt

在查看别人编写的代码或自己数月前编写的代码时,使用匈牙利表示法的代码将大大节省我们

的时间,然而,最重要的是它使控件的命名规则保持一致。当开始编写代码时,应选择一个命名约

定。在 Visual Basic 2012 中,推荐使用标准的改进型匈牙利表示法,但并不是必须这么做。一旦选

择了命名约定,就应一直使用它。当修改别人的代码时,就应使用他们的命名约定。如果一个项目

始终遵循标准的命名规则,维护应用程序时就可以节省大量时间。现在再回到应用程序,并编写一

些代码。

1.4.3 代码编辑器

前面定义了 HelloUser 窗体,接下来要添加一些代码,让它完成一些有意义的操作。在窗体中

添加控件非常简单,给屏幕上的元素添加功能也不困难。要为控件添加代码,只要双击控件,打开

主窗口中的代码编辑器,如图 1-16 所示。

图 1-16

注意,在主窗口中创建了另一个标签,因此现在有 Design 标签和 Code 标签,它们都包含了当

前窗体的名称。前面在 Design 标签的窗体上绘制了一些控件,下面在 Code 标签的窗体上编写代码。

要注意的是,Visual Studio 2012 已为代码创建了一个文件。窗体的可视化定义及后台代码都放在单

独的文件中,即 HelloUser.Designer.vb 和 HelloUser.vb。这也是为什么使用 Visual Basic 2012 建立应

用程序会如此灵活简单的原因。使用 Design 模式可以以可视化的方式布局应用程序,然后,使用

Code 视图可以添加部分代码,实现所需的功能。 代码编辑器的顶部有两个组合框,它们提供了到达代码各个部分的快捷方式。左边是Class Name

组合框,如果展开该组合框,就会列出窗体中的所有对象。右边是 Method Name 组合框。打开该组

第 1 章 初识 Visual Basic 2012

15

合框,会显示 Class Name 组合框中所选对象的所有已定义的函数和事件。如果在这个窗体中有许多

后台代码,那么这两个组合框可以很快定位到我们希望查看的区域—— 跳转到所选的代码区域。然

而,因为该项目所有的代码都在窗口中,所以不必担心找不到它们。

试一试: 向 Hello User 项目添加代码 (1) 在添加必要的代码之前,先单击 Design 标签,再次显示窗体,然后双击 OK 按钮。代码窗

口将再次打开,并显示如下代码,这只是按钮的 Click 事件的“外壳”。我们可以在此输入单击按钮

时希望运行的代码。这段代码叫做事件处理程序,有时也称为事件过程。

Private Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.Click

End Sub

由于出版时受印刷限制,不可能把 Sub 声明放在一行中。Visual Basic 2012 允许使用下划线符

号(_)把代码行断开,以表示这是前一行的续行,而下划线前必须有空格,下一行中代码前的所有空

格可忽略。在某些情况下,也可以像下面代码所显示的那样,不使用下划线而直接断开代码行。后

面,我们将学习更多关于断开代码行的相关规则。

Private Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.Click

End Sub

Sub 是一个关键字。在编程术语中,关键字是一种特殊的词,用来让 Visual Basic 2012 完成一

些特殊的操作。在本例中,Sub 告诉 Visual Basic 2012 这是一个子例程(一个不返回值的过程)。在

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 2012.", _ "Hello User Message")

End Sub

在本书中,有一些代码应被输入到程序中。通常,我们会提示应在什么位置输入这些代码,并

解释其作用。带有灰色背景的代码是应输入到程序中的代码。 (3) 添加完代码后,返回 Design 标签,并双击 Exit 按钮。在 btnExit_Click 事件过程中添加下面

突出显示的代码。

Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click 'End the program and close the form

Visual Basic 2012 入门经典(第 7 版)

16

Me.Close() End Sub

(4) 代码添加完毕后,运行该应用程序。首先,为了保存工作成果,在菜单栏中选择 File | Save All 命令或者单击工具栏上的 Save All 按钮,打开如图 1-17 所示的 Save Project 对话框,输入名称和

保存项目的位置。 默认情况下,项目保存在以项目名命名的文件夹中,本例中是 Hello User。因为这是解决方案

中唯一的项目,所以不需要为与项目同名的解决方案创建单独的文件夹,因此不必选择 Create directory for solution 复选框。

图 1-17

(5) 单击工具栏上的 Start 按钮,Visual Studio 2012 就会编译这些代码。编译过程就是提取刚才

编写的 Visual Basic 2012 源代码,把它转换成机器能理解的形式。编译完成后,Visual Studio 2012将运行(也叫执行)程序,并显示运行结果。

如果 Visual Basic 2012 遇到错误,就会把错误作为任务显示在 Error List 窗口中。双击一个任务,

就会显示有错误的代码行。第 3 章将详细讨论如何调试代码中的错误。 (6) 当应用程序载入时,会显示主窗体。输入一个名称并单击 OK 按钮(或按下 Alt+O 组合键),

如图 1-18 所示。 这时就出现了如图 1-19 所示的消息框,内容是欢迎 Chris 进入 Visual Basic 2012 世界,Chris 是

刚才输入到窗体文本框中的人名。

图 1-18 图 1-19

(7) 单击 OK 按钮,关闭消息框后,再单击窗体中的 Exit 按钮,就关闭了应用程序,返回到 Visual Basic 2012 IDE。

第 1 章 初识 Visual Basic 2012

17

示例说明 为 OK 按钮的 Click 事件添加的代码提取了在文本框中输入的名字,并把它作为在如图 1-19 所

示的对话框中显示的消息的一部分。 在这个过程中输入的第一行文本('Display a message box greeting to the user)实际上是一个注释。

这行文本仅由编写或维护代码的编程人员阅读,计算机并不理会。Visual Basic 2012 中的注释以一个

单引号(')开头,其后的所有内容都被编译器看作注释而被忽略。有关注释的内容详见第 3 章。 MessageBox.Show 方法显示一个消息框,它可以接收各种参数。在本示例的代码中,其参数是

要在消息框中显示的字符串文本。该文本连接了括在引号中的文本所定义的字符串常量。将多个字

符串连接成一个长字符串应使用宏字符(&)来实现。 在下面的代码中,连接了一个字符串常量"Hello,"、后面紧跟在 txtName 文本框控件的 Text 属性

中包含的值,以及字符串常量"! Welcome to Visual Basic 2012."。传递给 MessageBox.Show 方法的第

2 个参数是用在消息框标题栏中的标题。 最后,在代码行末尾使用的下划线字符( _ ),从而允许把代码拆分到多个行中。这告诉编译器

参数的剩余代码在下一行中。在创建较长的字符串时,这是很有用的,因为它允许在代码编辑器中

查看全部代码,而不需要向右滚动代码编辑窗口。

Private Sub btnOK_Click(sender As Object, e As 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(sender As Object, e As EventArgs) Handles btnExit.Click 'End the program and close the form Me.Close()

End Sub

1.5 使用帮助系统

Visual Basic 2012 的帮助系统在原有版本的基础

上进行了改进。随着对 Visual Basic 2012 的进一步学

习,用户会越来越熟悉这个帮助系统。为了帮助用户

快速搜索到信息,现在概述一下这个帮助系统。 Help 菜单如图 1-20 所示。 如你所见,这个菜单包含的项比一般的 Windows

应用程序多。主要的原因是文档太大,几乎没人能把

这些信息全部记住。所幸的是,这并不是问题,因为

总是可以简便而迅捷地使用帮助系统,或者在论坛上

图 1-20

Visual Basic 2012 入门经典(第 7 版)

18

搜索有经验的完成过类似编程任务的人。就把它当作你大脑的安全网络吧。 在代码编辑器中单击某个关键字或按下 F1 键,就可以快速访问特定主题的帮助文档。

1.6 小结

可以看出,使用 Visual Basic 2012 创建基本的应用程序并不困难。本章介绍了 IDE,以及如何

运用它快速开发软件。利用工具箱可在窗体上添加控件并快速简便地设计用户界面;Properties 窗口

能迅速配置这些控件;Solution Explorer 提供了一个概览图,列出了构成项目的所有文件。此外我们

还编写了少量的代码。 后面的章节将详细介绍如何编写代码。在进一步学习 Visual Basic 2012 之前,第 2 章将首先介

绍.NET Framework。这个架构将使所有的.NET 语言都变得易学易用,并便于进行交互操作。

练习 你可以从附录 A 中找到本书中每一章节结尾处练习的答案。 1.使用一个 Textbox 和一个 Button 控件创建一个 Windows 应用程序,当用户单击按钮时在文

本框中显示所输入的内容。

本章的主要内容

主 题 概 念

集成开发环境(IDE) 如何在 IDE 中创建项目,如何在设计视图和代码视图之间切换,如何运行和调试项目

在设计器中为窗体添加控件 如何使用工具箱把控件拖放到窗体上,如何在窗体上移动控件、调整控件的大小

设置控件的属性 如何显示控件中的文本,给控件指定有意义的名称

在代码窗口中为窗体添加代码 如何添加代码来控制程序的行为

可扩展应用程序标记语言(XAML)

本章主要内容: ● 什么是 XAML 以及如何将其应用于.NET Framework ● XAML 如何与 WPF(Windows Presentation Foundation)相关 ● 如何在 Visual Studio 2012 中创建 WPF 应用程序 本章的 wrox.com 代码下载 你可以从 www.wrox.com/remtitle.cgi?isbn=1118311813 的 Download Code 选项卡中找到本章的

wrox.com 代码。该代码位于 311813 C06.zip 下载文件中。 过去,UI 设计人员常常依靠 Dreamweaver 和 Photoshop 等软件来开发 Windows 应用程序的屏幕

模型和 Web 应用程序的 HTML。尽管这些工具为设计人员提供了创建图形的先进工具,但它们只能

创建图形,而创建实际的 Windows 窗体和 Web 窗体的功能却有限。到目前为止,这些有限的工具

阻碍了 UI 设计人员创建丰富的用户界面,使他们被迫依赖于使用诸如 Visual Studio 这些工具的开发

人员。 微软认识到了 UI 设计人员和开发人员之间的责任区分,创建了一种新语言和一组新工具来帮

助UI设计人员,允许他们创建将由开发人员用来创建世界级应用程序的Windows窗体和Web窗体。 这一新语言以 XAML(Extensible Application Markup Language,可扩展应用程序标记语言)的形

式出现,读作 Zammel。XAML 是可扩展应用程序标记语言,该语言定义了用户界面的元素。它不

仅能够让微软公司创建用来设计用户界面的工具,例如 Expression Blend 和 Expression Design,其他

公司也可以。例如 Mobiform Software 的 Aurora XAML Designer,它允许 UI 设计人员为 Windows和 Web 应用程序创建用户界面。

6.1 什么是 XAML

如前所述,XAML是可扩展应用程序标记语言。其确切含义是什么呢?维基百科(www.wikipedia.org)

第 章

Visual Basic 2012 入门经典(第 7 版)

156

把 XAML 定义为用于初始化结构化值和对象的、声明性的、基于 XML 的语言。也有人把 XAML看作定义对象及其属性的声明性的、基于 XML 的语言。

通过这些定义可以了解这一新语言的首字母缩写词是如何形成的。这一语言基于 XML,而 XML已成为在应用程序间共享结构化数据的行业标准。XAML 中的 A 是指 application,上述定义中的“声

明性”是指该语言声明对象(表示窗体上的控件)的能力。 因此,通过在窗体上定义控件,这个新语言用 XML 类型的语言定义了应用程序的 UI。可以将

XAML 定义的控件映射到.NET Framework 中的类。记住,XAML 是用于定义用户界面的应用程序

标记语言,不要与 Visual Basic 2012 等编程语言相混淆。 为了说明这一点,图 6-1 列出了 XAML 定义的基本 Windows 应用程序及其输出。可以看出,

XAML 与 XML 非常相像,因为它是一种基于 XML 的语言,并遵循 XML 标准。还可看出,示例

中定义的控件映射.NET Framework 中的类,其输出看上去像前几章创建的标准 Windows 应用程序。

图 6-1

根据 XAML 的本质及其生成的输出,可看出 XAML 如何将 UI 设计人员和开发人员的职责分

离完全开来。UI设计人员通常使用诸如Expression Blend、Expression Design或Aurora XAML Designer之类的工具以可视方式创建 Windows 窗体并让工具创建 XAML,从而创建图 6-1 中所示的 XAML代码。

下一步就是 UI 设计人员给开发人员提供 XAML 代码,它存储在带有.xaml 扩展名的文件中。

开发人员将 XAML 文件导入到 Visual Basic 2012 中,然后编写代码,使图 6-1 所示的窗体具有功能

意义,以便当用户单击按钮时会执行有用的操作。 这为 XAML 提供了更广阔的前景,并说明了 XAML 的概念以及开发人员将来在其中扮演的角

色。在由一人或一个团队负责创建用户界面的大型组织中,这一方案将很快成为现实。开发人员在

该组织中的工作是编写使这些用户界面具有功能的代码。

6.2 XAML 语法

了解 XAML 语法及其工作原理的最好方法是深入到实际示例。本节将把图 6-1 所示的 XAML

第 6 章 可扩展应用程序标记语言(XAML)

157

代码分成小段并讲解其语法,以便读者了解它们如何组装在一起,如何与.NET Framework 相关。 XAML 文件中的每个元素都映射到一个.NET Framework 类上,从而在运行时创建相应对象。

虽然 XAML 文件通常是应用程序的一部分,并可编译成可执行文件,但也可在运行时分析。 下列代码定义了前面章节中使用的基本 Windows 窗体。注意,元素名为 Window,它对应.NET

Framework 中的 Window 类,而不是我们一直使用的 Form 类。Window 元素是这个 XAML 文档中

的根元素,和所有格式良好的 XML 文档一样,XAML 文档也只能包含一个根元素。

<Window x:Class="MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="164" Width="207">

</Window>

Window 元素的特性定义了在这个XAML 文档中使用的名称空间,并映射到Window 类的属性。

XML 标准特性(大部分 XML 文档都有这个特性)xmlns 定义了 XAML 文档所使用的模式。xmlns:x特性使用名称 x 定义文档中的自定义名称空间,自定义名称空间也可位于其他复杂的 XML 文档中。

x:Class 特性提供了 Window 类的名称,在这一示例中,类名为 MainWindow。Title 特性可映射

到 Window 类的 Title 属性,设置窗口中显示的标题,如图 6-1 中的窗体所示。 Height 和 Width 特性映射到 Window 类的 Height 和 Width 属性。这些特性用于定义窗口的高度

和宽度,如图 6-1 所示。 和前面章节中使用的 Windows 窗体不同,Window 类没有允许拖放控件的设计界面;它需要有

一个容器控件来容纳其他控件。XAML 中可使用几个不同的容器控件,它们都有各自的功用。不过,

Grid 类是默认的容器,在使用 Visual Studio 2012 设计 XAML 窗口时,Grid 会添加到 XAML 中,在

下列代码中由 Grid 元素来表示。 Grid 元素允许使用列和行在窗口中精确定位控件,基本上与我们一直使用的窗体的工作方式相

同。可以在 Grid 控件中增加行和列,把控件放在 Grid 的表格布局中。本章将不会向 Grid 控件增

加行和列:

<Window x:Class="MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="164" Width="207"> <Grid>

</Grid> </Window>

在代码中: ● 图 6-1 所示窗口中的第一个控件就是标签,它包含了文本 Enter your name:。这在 XAML 中

由 Label 元素表示,它映射到.NET Framework 中的 Label 类。 ● Label 元素的 Name 特性映射到 Label 类的 Name 属性,也就是在代码中要引用的名称,可

以使用该特性更改在标签中所显示的文本。Height 和 Width 特性映射到 Label 类的 Height和 Width 属性,并用于指定窗口中标签的高度和宽度。

Visual Basic 2012 入门经典(第 7 版)

158

● VerticalAlignment 特性映射到 Label 类中的相应属性,用于设置标签在 Grid 中垂直对齐。该

特性默认的值是 Top,表明该控件应与 Grid 的顶端对齐。其他的可能值有 Center、Bottom和 Stretch。

● HorizontalAlignment 特性指定 Label 在 Grid 中水平对齐,可映射到 Label 类中的同名属性。

这个特性的可能值有 Left、Right、Center 和 Stretch。 ● Margin 特性映射到 Label 类的 Margin 属性,用来指定元素的外边距。Margin 属性定义了一

个 Thickness 结构,该结构包含了矩形框的 Left、Top、Right 和 Bottom 4 个边的 Double 值。

从这个角度来看,Enter your name:标签的 Left 边距为 11,Top 边距为 15。如果这两个边距

设置为 0,标签就与 Grid 的最左边和最上边对齐。 ● Label 元素的内部文本是在窗体上显示的文本。到目前为止,在一直使用的Windows 窗体中,

标签显示的文本是用Text属性来设置。XAML中Label元素的内部文本映射到.NET Framework中 Label 类的 Content 属性。这令人有些糊涂,不过还是要记住这一点,以防后面想在代码

中改变标签的文本。 现在,通过各种 XAML 元素及其特性,一个完整的窗口已具雏形。

<Window x:Class="MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="164" Width="207"> <Grid>

<Label Name="Label1" Height="23" Width="106" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="11,15,0,0">Enter your name:</Label>

</Grid> </Window>

继续为这个简单的窗体构建代码,以便了解下一元素(即文本框控件)如何用 Margin 特性进行对

齐。在下面的代码中,文本框控件用 TextBox 元素表示,它映射到.NET Framework 中的 TextBox 类。

Name 特性也映射到该类的 Name 属性,可用来在代码中访问此控件中的文本。 继续讨论代码: ● Height 和 Width 特性也映射到.NET Framework 中 TextBox 类的对应属性,用来指定文本框

的高度和宽度。VerticalAlignment 和 HorizontalAlignment 特性用于设置在网格上垂直和水平

对齐,指定控件应与 Grid 的左边和顶边对齐。 ● Margin 特性特别有趣。该特性映射到 TextBox 类的 Margin 属性,工作方式和 Label 元素的

Margin 特性一样。记住,Margin 特性定义了一个 Thickness 结构,该结构包含了矩形框的

Left、Top、Right 和 Bottom 4 个边的 Double 值。 ● Left 特性指定了控件与 Grid 左边的距离。 ● 同样,Top 特性指定了控件的顶边与 Grid 顶边的距离,而不是与前一控件底边的距离。 ● 如果想为 TextBox 元素指定初始文本,应创建</TextBox>结束标记,像在 Label 元素中指定

的那样将文本放在开始和结束标记之间。也可通过查询 TextBox 类的 Text 属性,在代码中

访问用户输入的文本。

<Window x:Class="MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

第 6 章 可扩展应用程序标记语言(XAML)

159

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="164" Width="207"> <Grid>

<Label Name="Label1" Height="23" Width="106" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="11,15,0,0">Enter your name:</Label>

<TextBox Name="txtFirstName" Height="21" Width="121" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="16,42,0,0" />

</Grid> </Window>

● 这个 XAML 示例代码中的最后一个控件是 Button。下列代码中的 Button 元素映射到.NET Framework 中的 Button 类,指定的所有特性都映射 Button 类的对应属性,其行为和前面讨

论的一样。 按钮上显示的文本放在 Button 元素的开始和结束标记之间。和 Label 元素一样,这一文本可通

过 Content 属性在代码中访问。

<Window x:Class="MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title=" Window1" Height="164" Width="207"> <Grid>

<Label Name="Label1" Height="23" Width="106" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="11,15,0,0">Enter your name:</Label>

<TextBox Name="txtFirstName" Height="21" Width="121" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="16,42,0,0" />

<Button Name="btnSubmit" Height="23" Width="74" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="16,72,0,0">Submit</Button>

</Grid> </Window>

现在,我们已经了解了什么是 XAML 及其可以产生的结果。你应对 XAML 及其如何与 XML和.NET Framework 相关有个基本的了解。尚未介绍的内容是 XAML 如何与 WPF 相关,下面就讨论

这个主题。

6.3 WPF

WPF(Windows Presentation Foundation)是内置于.NET Framework 中的显示技术,用于构建 WPF Windows和WPF Browser应用程序中的富用户界面。WPF Windows应用程序与前面构建的Windows Forms 应用程序不同,因为它将用户界面代码与应用程序的业务逻辑代码相分离,其方式与 Web 应

用程序中的 Web 窗体很相像。其用户界面代码是 XAML。第 18 章将详细介绍 Web 窗体及代码分离

的情况。 WPF 在.NET Framework 的 PresentationFramework.dll 中,它包含了一组用来构建 WPF 中控件的

类。例如,如果在随 Visual Studio 2012 安装的 MSDN 库中显示 Button Class 主题,就会得到一个索

Visual Basic 2012 入门经典(第 7 版)

160

引结果,提示你选择合适的类:Web、WPF 或 Windows。

Windows Forms 中最常见的控件(如 Label、TextBox、ComboBox 和 Button)在 WPF 中也有。尽

管大部分属性、事件和方法是相同的,但也有一些小差别,后面将介绍到。 在 WPF 应用程序中可做哪些在 Windows Forms 应用程序中实现不了的工作呢?其实,在 WPF

应用程序中可做的大部分工作在 Windows Forms 应用程序中也能完成。不过,WPF 应用程序更便于

做一些复杂的工作,如使用视频和处理图像。 图 6-2 演示了 WPF 应用程序中 Windows Presentation Foundation 的一些强大功能。注意,窗体

中显示的图像倾斜了一定的角度,还包含了渐淡的部分图像倒影。这个窗体的显示代码是 XAML形式的,在下一个“试一试”练习中将一步步地创建该窗体。

图 6-2

6.3.1 创建一个富 WPF 用户界面

WPF Windows 应用程序的一个长处就是可以轻松地在用户界面中创建丰富的图像,如图 6-2 所

示。我们可以将二维图像倾斜一定角度,添加渐淡的图像倒影。

试一试: 创建一个富 WPF 用户界面 在这一示例中将创建图 6-2 所示的用户界面。如果想使用图 6-2 所示的信用卡图像,可到 Wrox

网站(www.wrox.com)上下载本章的代码。下载代码中包括了此图像以及本练习的代码。所有代码位

于本章压缩文件的 Credit Card 文件夹中。 (1) 启动Visual Studio 2012并选择File | New Project菜单项。在New Project对话框中,选择Project

Types 列表中的 Visual Basic 和 Templates 列表中的 WPF Application。在 Name 文本框中输入 Credit Card 并单击 OK 按钮。

第 6 章 可扩展应用程序标记语言(XAML)

161

(2) 注意,窗体设计器分为两部分。上半部分包含了窗体的可视化表示形式,下半部分包含了

用于创建该表示形式的 XAML 代码。要修改窗体的内容,可单击窗体或窗体控件,在 Properties 窗格中设置它们的属性,或是直接在 XAML 代码中修改属性。

在XAML编辑器中修改Window元素的属性,将Height属性设置为 600,Width属性设置为 800。进行修改时,窗口的大小会重置。现在把 Title 设置为 Window1。

(3) 在窗体上添加控件之前,要将信用卡图像添加到项目中。右击 Solution Explorer 中的 Credit Card 项目,并选择 Add | Existing Item 选项。浏览至下载的信用卡图像或你选择的其他图像,然后单

击 Add Existing Item 对话框中的 Add 按钮。 (4) 在窗体设计器中单击窗体的中间部分(即 Grid 控件)。从工具箱中拖放一个 Label 控件,使

之与窗格顶端对齐并且左右居中。在 Properties 窗格中,设置 Content 属性为 Apply for Your Card Today。

(5) 在 Properties 窗格中滚动至 FontSize 属性,将之设置为 18,将 FontWeight 属性设置为 Bold。 (6) 将 Label 控件的 HorizontalAlignment 属性设置为 Center,从而使其居中。 (7) Border 控件用于对图像应用各种效果。从工具箱中拖放一个 Border 控件到窗格上。在 XAML

代码编辑器中,设置 Margin 属性为“0,60,0,0”。在 Properties 窗格中设置下列属性: ● 设置 Width 为 380。 ● 设置 Height 为 200。 ● 设置 BorderThickness 为 0。 ● 设置 Name 为 Border1。 (8) 从工具箱中拖放一个 Image控件到窗体的Border控件中。在Properties窗格中设置下列属性: ● 设置 Source 为 CreditCard.jpg(或者你指定的其他图像的名称)。 ● 设置 Height 为 185。 ● 设置 Width 为 300。 (9) 在 XAML Code Editor 中,单击 Border 元素。在 XAML 窗格中,添加如下的 BitmapEffect

元素:

<Border.BitmapEffect></Border.BitmapEffect>

(10) 在 XAML Code Editor 的 BitmapEffect 属性中有子属性。向 BitmapEffect 添加下列子属性:

<Border.BitmapEffect> <DropShadowBitmapEffect Opacity="0.5" ShadowDepth="8" Softness="1" />

</Border.BitmapEffect>

(11) 这时,图像会在底部和右边显示阴影。为了使图像倾斜,需要修改 XAML 代码编辑器中

的 XAML 代码。在添加下列代码后,图像应如图 6-3 所示。

</Border.BitmapEffect> <Border.RenderTransform>

<SkewTransform CenterX="0" CenterY="0" AngleX="0" AngleY="-3" /> </Border.RenderTransform>

Visual Basic 2012 入门经典(第 7 版)

162

图 6-3

(12) 现在需要添加另一条边框来包含信用卡图像的倒影。从工具箱中拖放一个 Border 控件至第

一个 Border 控件的下方。在 Properties 窗格中设置下列属性: ● 设置 Margin 为“0,265,0,96”。 ● 设置 Width 为 300。 (13) 在 XAML Code Editor 中,添加 Border 结束元素并删除 Border 元素末尾的正斜杠来修改第

二个 Border 元素。然后,添加下列代码:

<Border Margin="0,265,0,96" Name="Border2" BorderThickness="0" HorizontalAlignment="Left" Width="300"> <Border.Background>

<VisualBrush Visual="{Binding ElementName=Image1}"> <VisualBrush.Transform>

<ScaleTransform CenterX="300" CenterY="100" ScaleX="1" ScaleY="-1" />

</VisualBrush.Transform> </VisualBrush>

</Border.Background> </Border>

(14) 现在使图像从上至下呈渐淡效果。添加下列代码:

</VisualBrush> </Border.Background> <Border.OpacityMask>

<LinearGradientBrush StartPoint="0,0" EndPoint="0,1"> <GradientStop Offset="0" Color="Black"></GradientStop> <GradientStop Offset="0.7" Color="Transparent"></GradientStop>

</LinearGradientBrush> </Border.OpacityMask>

第 6 章 可扩展应用程序标记语言(XAML)

163

(15) 最后,倾斜第二个 Border 控件中显示的图像。添加下列代码:

</LinearGradientBrush> </Border.OpacityMask> <Border.RenderTransform>

<SkewTransform CenterX="0" CenterY="0" AngleX="30" AngleY="-3.3" /> </Border.RenderTransform>

(16) 单击工具栏中的 Save All 按钮保存该项目。在保存好之后运行它,这时的窗口如图 6-4 所示。

图 6-4

示例说明 首先修改窗体的尺寸,可以在 Properties 窗格中设置 Height 和 Width 属性,或是使用 XAML 编

辑器。这里选择在 XAML 编辑器中修改 Height 和 Width 属性,当修改 Height 属性时,窗体会立即

调整大小。 接下来,在项目中添加 Image 控件中所使用的已有图像。然后,为标题添加 Label 控件,修改

该控件的属性,使其在窗体中居中并以默认的 Segoe UI 字体显示。 Border 控件有许多内置属性,可在 Border 控件中包含的对象上呈现各种效果。在 Border 控件

中添加一个 Image 控件,以便将 Border 控件中可用的效果应用于该图像。 通过将 BitmapEffect 属性设置为 DropShadowBitmapEffect,就可在图像的底边和右边创建阴影

效果。还可以微调该属性创建的阴影,方法就是设置 Opacity 子属性来控制阴影浓度、设置

ShadowDepth 子属性来控制阴影宽度,以及设置 Softness 子属性来控制阴影从一边到另一边的柔和

度。在应用 BitmapEffect 属性后,在运行期间图像的底边和右边就会出现阴影。 为了使图像倾斜一定角度,添加下列代码。RenderTransform 属性用于设置变换方式,以影响

Border 控件中内容的显示方式。SkewTransform 元素用于将二维对象变换为三维对象(此时为信用卡

Visual Basic 2012 入门经典(第 7 版)

164

图像)。

<Border.RenderTransform> <SkewTransform CenterX="0" CenterY="0" AngleX="0" AngleY="-3" />

</Border.RenderTransform>

CenterX 和 CenterY 特性指定变换的中心坐标,它们被设置为 0 以指定图像中心为中心坐标。

AngleX特性指定倾斜角的X坐标,这里是起始点。AngleY特性指定倾斜角的Y坐标,这里设置为–3。 添加到窗体中的第二个 Border 控件提供了信用卡图像的倒影效果。在添加下列代码时,会立即

显示 Image 元素中包含的信用卡图像的倒影。 边框的 Background 属性用于设置填充边框内部区域的笔刷。不过,这里并没有使用纯色来填充

边框内部区域,而是使用了 VisualBrush。VisualBrush 使用可视化图像((此时为信用卡图像))来填充

区域。下列代码中的Visual特性用于设置VisaulBrush的可视内容,并被绑定到 Image元素(由其Name属性被设置为 Image1)。指定 Binding ElementName 关键字是为了将 Image 与 Visual 特性绑定起来。

这称为数据绑定。数据绑定用于 Visual Studio 2012 的许多其他地方。 Transform属性用于将变换应用于VisualBrush包含的图像。ScaleTransform元素用于使图像颠倒。

CenterX 和CenterY 特性用于指定变换的中心点,ScaleX 和 ScaleY 特性用于指定缩放的X 轴和Y 轴。 CenterX 特性设置为图像的宽度,而 CenterY 特性设置为 100,以便只显示包含在 Image 元素中

的信用卡图像的一部分。ScaleX 设置为 1,表明图像应进行 1:1 的缩放,换句话说就是正常尺寸。

为了使图像颠倒,需要将 ScaleY 设置为–1。

<Border.Background> <VisualBrush Visual="{Binding ElementName=Image1}">

<VisualBrush.Transform> <ScaleTransform CenterX="300" CenterY="100" ScaleX="1"

ScaleY="-1" /> </VisualBrush.Transform>

</VisualBrush> </Border.Background>

OpacityMask 元素使用 Brush 元素来设置 UI 元素(这里是指第二个 Border 控件中包含的信用卡图

像)的不透明度。LinearGradientBrush 元素指定使用线性渐变(如水平方向)填充区域的笔刷。StartPoint特性指定开始渐变的二维起点,EndPoint 特性指定结束渐变的二维终点。StartPoint 和 EndPoint 特性

都可以设置为 0、1 之间的双精度值。 GradientStop 元素用于指定渐变转换点的位置和颜色。第一个 GradientStop 元素用于指定偏移量

0处为Black颜色,表明渐变向量应终止于偏移量0处。第二个GradientStop元素使用颜色Transparent,指定偏移量为 0.7。这使得图像从顶部开始(颜色最深)到底部(颜色几乎不可见)呈现渐淡效果。

<Border.OpacityMask> <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">

<GradientStop Offset="0" Color="Black"></GradientStop> <GradientStop Offset="0.7" Color="Transparent"></GradientStop>

</LinearGradientBrush> </Border.OpacityMask>

在创建第一个 Border 控件时,我们已经介绍过 RenderTransform 属性和 SkewTransform 元素。

这里,设置 AngleX 特性的值为 30,表明变换始于左上角。AngleY 特性控制右上角的角度,设置

第 6 章 可扩展应用程序标记语言(XAML)

165

为–3.3。

<Border.RenderTransform>

<SkewTransform CenterX="0" CenterY="0" AngleX="30" AngleY="-3.3" />

</Border.RenderTransform>

6.3.2 使用 WPF 通用控件

前面章节构建的 Windows Forms 应用程序中已使用了 Label、TextBox 和 Button 控件。此时,

你应相当熟悉这些控件的常见属性,即 Name 和 Text 属性。 在下面这个“试一试”练习中,将添加 Label、TextBox、Button 和 ComboBox 控件,完成 WPF

Credit Card 应用程序的用户界面。

试一试: 使用 WPF 通用控件 这个例子在添加 Label、TextBox、Button 和 ComboBox 控件并设置这些控件的属性后,就可看

出它们与 Windows Forms 对应控件有何不同。本练习的所有代码位于本章压缩文件的 Credit Card 文

件夹中。

(1) 如果项目仍在运行,就关闭它并回到 Forms Designer。从工具箱中拖放一个 Label 控件到窗

体的右上角。为了节约时间,你并不必为每个标签命名,因为在代码中并不会使用它们。然而,为

所有的控件命名时一个非常好的编程习惯。在 Properties 窗格中为该控件设置下列属性: ● 设置 Content 为 Personal Information ● 设置 Margin 为 0,38,100,0 ● 设置 FontSize 为 11 ● 设置 FontWeight 为 Bold ● 设置 HorizontalAlignment 为 Right (2) 从工具箱拖放一个 Label 控件到前一个 Label 控件的左下位置。设置其下列属性: ● 设置 Content 为 First Name ● 设置 Width 为 95 ● 设置 Margin 为 0,69,225,0 ● 设置 FontSize 为 11 ● 设置 HorizontalAlignment 为 Right (3) 从工具箱拖放一个 TextBox 控件到第二个标签的右边。Name 属性在 Properties 窗格的顶部

区域。设置下列属性: ● 设置 Name 为 txtFirstName ● 设置 Width 为 185 ● 设置 Margin 为 0,71,35,0 ● 设置 FontSize 为 11 ● 设置 HorizontalAlignment 为 Right

Visual Basic 2012 入门经典(第 7 版)

166

(4) 从工具箱拖放一个 Label 控件至第二个标签的下方并与之对齐。设置下列属性: ● 设置 Content 为 Last Name ● 设置 Width 为 95 ● 设置 Margin 为 0,99,225,0 ● 设置 FontSize 为 11 ● 设置 HorizontalAlignment 为 Right (5) 从工具箱拖放一个 TextBox 控件到窗体中前一 TextBox 控件的下方。设置下列属性: ● 设置 Name 为 txtLastName ● 设置 Width 为 185 ● 设置 Margin 为 0,101,35,0 ● 设置 FontSize 为 11 ● 设置 HorizontalAlignment 为 Right (6) 从工具箱拖放一个 Label 控件到窗体中前一 Label 控件的下方并与之对齐。设置下列属性: ● 设置 Content 为 Address ● 设置 Width 为 95 ● 设置 Margin 为 0,129,225,0 ● 设置 FontSize 为 11 ● 设置 HorizontalAlignment 为 Right (7) 从工具箱拖放一个 TextBox 控件至窗体中前一 TextBox 控件的下方。设置下列属性: ● 设置 Name 为 txtAddress ● 设置 Width 为 185 ● 设置 Margin 为 0,131,35,0 ● 设置 FontSize 为 11 ● 设置 HorizontalAlignment 为 Right (8) 从工具箱拖放一个 Label 控件到窗体中前一 Label 控件的下方并与之对齐。设置下列属性: ● 设置 Content 为 City ● 设置 Width 为 95 ● 设置 Margin 为 0,159,225,0 ● 设置 FontSize 为 11 ● 设置 HorizontalAlignment 为 Right (9) 从工具箱拖放一个 TextBox 控件至窗体中前一 TextBox 控件的下方。设置下列属性: ● 设置 Name 为 txtCity ● 设置 Width 为 185 ● 设置 Margin 为 0,161,35,0 ● 设置 FontSize 为 11 ● 设置 HorizontalAlignment 为 Right (10) 从工具箱拖放一个 Label 控件到窗体中前一 Label 控件的下方并与之对齐。设置下列属性: ● 设置 Content 为 State

第 6 章 可扩展应用程序标记语言(XAML)

167

● 设置 Width 为 95 ● 设置 Margin 为 0,189,225,0 ● 设置 FontSize 为 11 ● 设置 HorizontalAlignment 为 Right (11) 从工具箱拖放一个 ComboBox 控件至窗体中前一 TextBox 控件的下方。设置下列属性: ● 设置 Name 为 cboState ● 设置 Width 为 95 ● 设置 Margin 为 0,191,125,0 ● 设置 FontSize 为 11 ● 设置 HorizontalAlignment 为 Right (12) 从工具箱拖放一个 Label 控件到窗体中前一 Label 控件的下方并与之对齐。设置下列属性: ● 设置 Content 为 Postal Code ● 设置 Width 为 95 ● 设置 Margin 为 0,219,225,0 ● 设置 FontSize 为 11 ● 设置 HorizontalAlignment 为 Right (13) 从工具箱拖放一个 TextBox 控件至窗体中前一 ComboBox 控件的下方。设置下列属性: ● 设置 Name 为 txtPostalCode ● 设置 Width 为 95 ● 设置 Margin 为 0,221,125,0 ● 设置 FontSize 为 11 ● 设置 HorizontalAlignment 为 Right (14) 从工具箱拖放一个 Button 控件至窗体的右下角。设置下列属性: ● 设置 Name 为 btnApplyNow ● 设置 Content 为 Apply Now ● 设置 Margin 为 0,0,35,16 ● 设置 FontSize 为 11 ● 设置 VerticalAlignment 为 Bottom(默认为 Top,所以其他控件会垂直对齐)。 (15) 保存该项目并运行它。完成的窗体如图 6-5 所示。

示例说明 向 WPF 窗口添加控件与向 Windows 窗体添加控件没有什么区别,都是从工具箱拖放控件到窗

口上。不同之处在于如何定位控件以及如何与其他控件对齐。 在 Windows Forms 应用程序中,可从工具箱中拖出控件,在释放鼠标左键前用捕捉线将它与其

他控件对齐。在 WPF 应用程序中,首先拖放控件到窗体上,然后在与其他控件对齐时,是在看到

捕捉线之前重新定位控件。 和 Windows Form 应用程序中的一样,WPF 应用程序中的 TextBox 控件有一个 Text 属性,用来

指定控件中显示的文本。不过,Label 和 Button 控件不像 Windows Forms 应用程序中那样,使用 Text

Visual Basic 2012 入门经典(第 7 版)

168

属性指定控件中显示的文本,它们使用的 Content 属性。

图 6-5

必须使用 Properties 窗格中的 Margin 属性重新定位控件,而不是像在 Windows Forms 应用程序

那样使用 Location 属性。属性的不同并不仅仅在于名称。Location 属性使用一组 X、Y 坐标定位控

件相对于窗体左上角的位置。 WPF 控件的 Margin 属性指定控件的外边距为 Left、Top、Right 和 Bottom。 Properties 窗格并没有像 Windows Forms 应用程序中的 Properties 窗格那样提供丰富的界面,比

如 FontFamily 属性。在 Windows Forms 应用程序中,Font 属性提供了 Font 对话框,允许从中选择

所需的字体、样式和大小。 除了这些不同点和限制之外,WPF 应用程序能够让我们在应用程序中创建一些极漂亮的图片。

尽管 WPF 并不是大部分应用程序的标准,但它在桌面应用程序和浏览器应用程序中的应用逐渐

增多。

6.3.3 连接事件

当使用 VB 编写代码时,需要处理事件。在发生某个动作(例如单击按钮)时,就会触发事件。

第 7 章将详细介绍事件的处理。

试一试: 连接事件 在这一示例中,我们将在代码中连接一些事件处理程序,以便加载窗体上的组合框并处理被单

击的按钮。这使你可以直接看到:WPF 应用程序中的事件与 Windows Forms 应用程序中的事件非常

相似,以及如何添加代码使 WPF 应用程序起作用。本练习的所有代码位于本章压缩文件的 Credit Card 文件夹中。

第 6 章 可扩展应用程序标记语言(XAML)

169

(1) 如果项目仍在运行,就关闭它。右击 Solution Explorer 中的 MainWindow.xaml,从上下文菜

单中选择 View Code 选项。在类的顶部添加下列 Imports 语句:

Imports System.Text Class MainWindow

(2) 声明一个字符串数组来保存将被加载到组合框中的州名的缩写。为了使代码简短,我们按

字母顺序只包括了 6 个州名的缩写。向类中添加下列突出显示的代码:

Class MainWindow 'Private variables Private strStates() As String = {"AL", "AK", "AZ", "AR", "CA", "CO"}

(3) 需要向组合框中加载 strStates 数组中的数据。最好的加载时机就是在窗口加载时且在所有控

件初始化之后。在代码编辑器顶部的 Class Name 组合框中选择(Windows1 Events),然后选择 Method Name 组合框中的 Loaded 事件。在事件处理程序中添加下列突出显示的代码:

Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded 'Bind the combo box to the strStates array cboState.ItemsSource = strStates

End Sub

(4) 当用户单击窗口上的按钮时,我们希望应用程序执行一些操作。为使代码简单,只在消息

框中显示来自窗口的一些信息。从 Class Name 组合框中选择 bthApplyNow,从 Method Name 组合

框中选择 Click 事件。在事件处理程序中添加下列突出显示的代码:

Private Sub btnApplyNow_Click(sender As Object, e As RoutedEventArgs) Handles btnApplyNow.Click 'Declare and instantiate a StringBuilder object Dim objStringBuilder As New StringBuilder 'Add the question objStringBuilder.AppendLine("Is your personal " & _

"information listed here correct?") objStringBuilder.AppendLine(String.Empty) 'Add the personal information objStringBuilder.AppendLine(txtFirstName.Text & " " & _

txtLastName.Text) objStringBuilder.AppendLine(txtAddress.Text) objStringBuilder.AppendLine(txtCity.Text & ", " & _

cboState.SelectedItem.ToString() & " " & txtPostalCode.Text) 'Display a message box to verify the information If MessageBox.Show(objStringBuilder.ToString, _

My.Application.Info.Title, MessageBoxButton.YesNo, _ MessageBoxImage.Question) = MessageBoxResult.Yes Then 'Do some processing here

Else

Visual Basic 2012 入门经典(第 7 版)

170

'Return to the window and let the user correct 'their information

End If End Sub

(5) 保存该项目并运行它。在窗口的 Personal Information 部分输入一些数据,然后单击 Apply Now 按钮,结果将如图 6-6 所示。

图 6-6

示例说明 在本示例中,首先添加下列 Imports 语句。这条 Imports 语句是使用 StringBuilder 类所必需的:

Imports System.Text

strStates 变量被声明为字符串数组,因为变量名后面带有括号。接着在字符串中设置数组值,

将每个字符串值括在双引号中并用逗号隔开。字符串值的列表括在花括号中。

'Private variables Private strStates() As String = {"AL", "AK", "AZ", "AR", "CA", "CO"}

MainWindow_Loaded 事件处理程序中的代码给组合框加载 strStates 字符串数组中包含的项。

ComboBox 对象的 ItemsSource 属性被用于将 Items 集合设置为一个项目列表。如果想把一个项目列

表(如字符串数组、DataSet 或 DataView 中的项)绑定到组合框上,可使用 ItemsSource 属性。第 16章将介绍 DataSet 和 DataView。

Private Sub MainWindow_Loaded(ByVal sender As Object, _ ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded 'Bind the combo box to the strStates array cboState.ItemsSource = strStates

End Sub

第 6 章 可扩展应用程序标记语言(XAML)

171

当用户单击 Apply Now 按钮时,就会触发该控件的 Click 事件处理程序。首先,声明和实例化

一个 StringBuilder 对象。相对于简单地将文本添加到 String 变量,StringBuilder 对象是使用更少的系

统资源构建较大字符串的有效方法。 StringBuilder 对象的 AppendLine 方法用来添加文本到字符串中,然后自动在数据后面添加一个

行终止符。指定的第一行文本是针对用户的一个问题,然后通过空字符串添加一个空行,从而将消

息框中的问句和显示的数据分离。

Private Sub btnApplyNow_Click(ByVal sender As Object, _ ByVal e As System.Windows.RoutedEventArgs) Handles btnApplyNow.Click 'Declare and instantiate a StringBuilder object Dim objStringBuilder As New StringBuilder 'Add the question objStringBuilder.AppendLine("Is your personal " & _

"information listed here correct?") objStringBuilder.AppendLine(String.Empty)

接着,将在窗口中输入的信息添加到字符串中。首先在一行上添加姓和名,然后在下一行上添

加地址信息,随后在下一行上添加城市、州及邮政编码。

'Add the personal information objStringBuilder.AppendLine(txtFirstName.Text & " " & _

txtLastName.Text) objStringBuilder.AppendLine(txtAddress.Text) objStringBuilder.AppendLine(txtCity.Text & ", " & _

cboState.SelectedItem.ToString() & " " & txtPostalCode.Text)

之后,在消息框中显示字符串结果。和以前一样,使用 MessageBox 类并调用 Show 方法。Show方法的第一个参数使用 StringBuilder 类的 ToString 方法输出已构建的字符串。消息框的标题在 Show方法的下一参数中设置。这里使用 My.Application.Info 对象的 Title 属性。这个对象包含了有关应用

程序的有用信息。第 10 和第 11 章将介绍 My 名称空间的更多内容。 Show 方法的下一参数是应在消息框中显示的按钮。这里指定来自 MessageBoxButton 枚举的

YesNo 常量。Show 方法的最后一个参数是应在消息框中显示的图标。在这个参数中,指定 Question图标,因为是在向用户询问问题。

Show 方法将根据指定的按钮返回对话框结果。由于指定显示 Yes 和 No 按钮,因此 Show 方法

将返回 Yes 或 No 的对话框结果。这在检查对话结果是否为 Yes 的 IF…Then 语句块中处理。 下列代码中添加了适当的注释来表明在哪里提供自定义代码以进行一些处理。第 8 章将介绍

MessageBox 的更多内容,以及如何在 IF…Then 语句块中使用按钮和图标。

'Display a message box to verify the information If MessageBox.Show(objStringBuilder.ToString, _

My.Application.Info.Title, MessageBoxButton.YesNo, _ MessageBoxImage.Question) = MessageBoxResult.Yes Then 'Do some processing here

Else 'Return to the window and let the user correct 'their information

Visual Basic 2012 入门经典(第 7 版)

172

End If End Sub

6.4 小结

本章介绍了什么是 XAML,以及它如何在 Visual Studio 2012 中使用 XAML 来构建 WPF 应用程

序。还论述了 XAML 和 WPF 在构建富用户界面(而这无法在 Windows Forms 应用程序中轻松实现)应用程序中的强大功能。

在构建 Credit Card 应用程序中,我们不仅学习了如何创建提供富用户界面的 WPF 应用程序,

还学习了如何将事件与窗口中的控件绑定。读者应理解 WPF 应用程序的潜力,了解它与 Windows Forms 应用程序之间的区别。第 7 章将学习 Windows Forms 应用程序的更多内容,这有助于将所有

这些信息结合在一起。 读者应从本章学习到如下内容: ● 什么是 XAML ● 什么是 WPF 以及 XAML 如何与之相关 ● 如何使用 Visual Studio 2012 构建 WPF 应用程序 ● 如何在 WPF 应用程序中处理图片 ● 如何在 WPF 应用程序中使用控件的事件处理程序

练习 1. WPF 便于组织分离软件开发的不同部分吗? 2. XAML 基于另一种语言,该语言是什么? 3. 设置 Grid 控件的哪个属性可定位 WPF 控件? 4. 在 WPF 设计中,不能把控件放在 Window 类中,因为 Window 没有设计界面。要把控件放

在窗体上,Visual Studio 会默认添加什么容器?

本章的主要内容

主 题 概 念

XAML 基于 XML 的语言,用于在 WPF 应用程序中定义对象和值

基本 WPF 控件 Grid、Label、TextBox、ComboBox、Image 和 Button 控件是建立 WPF 应用程序时常用的几个

控件

创建渐变 要创建渐变,应使用 LinearGradientBrush,并设置 GradientStops 来定义渐变如何显示

图像处理 在 WPF 中,使用 SkewTransform、Border、ScaleTransform 和其他 WPF 元素,可以方便地倾斜

图像、显示映像以及给图像添加边框

My.Application 要在运行期间获得应用程序的信息,可以使用My.Application 类

ASP.NET

本章主要内容: ● Web 应用程序(瘦客户端应用程序)概述,包括 Web 窗体与 Windows 窗体各自的优点 ● 了解 Web 服务器、浏览器、HTML、JavaScript 和 CSS ● 了解 ASP.NET Web 页面的优点,特殊网站文件、开发过程以及控件工具箱 ● 理解用于数据验证、导航、安全性、数据输入及外观的工具 本章的 wrox.com 代码下载 你可以从 www.wrox.com/remtitle.cgi?isbn=1118311813 的 Download Code 选项卡中找到本章

的 wrox.com 代码。该代码位于 311813 C18.zip 下载文件中,根据本章所提供的名称来命名相关

文件。 在不久的将来,Internet 一定会在商业领域大显身手,因而开发人员需要掌握构建可靠、动态

Web 站点的知识。本章将介绍 Web 窗体应用程序的构建。其中重点讨论 Web 站点开发以及数据库

驱动的应用程序的一些基础知识。利用 Visual Studio 2012,可以快速构建数据驱动的站点。 Visual Studio 2012 是目前市面上创建 ASP.NET 站点的 好工具。它提供了 好的 IntelliSense、

调试功能和控件库,来帮助使用 Visual Basic 创建Web 站点。可以用 Visual Studio 2012 构建 ASP.NET Web 站点(有时也被称为 Web 窗体应用程序)、Web 服务,甚至是针对移动设备的站点。此外,如果

使用 Visual Studio 2012,就不需要 IIS 或任何 Web 服务器来承载站点;ASP.NET Development Server是内置于 Visual Studio 的工具,当开发网站时可以使用该工具来承载站点。

第 章

提示:在查看代码前,先简要介绍一下开发人员是如何使用构建块来创建 Web 应

用程序的。

Visual Basic 2012 入门经典(第 7 版)

498

18.1 瘦客户端体系结构

前面章节介绍了 Windows 窗体应用程序类型的胖客户端应用程序。大多数处理工作都是由前面

创建的客户端应用程序来完成,并且很多应用程序都基于自身,因而不需要使用其他应用程序或服

务器。另一方面,Web 开发中的大多数处理工作是在服务器上完成的,之后将结果发送给浏览器。 当开发 Web 窗体应用程序时,不必向用户发布任何内容。任何可以访问 Web 服务器并且拥有

一个 Web 浏览器的人都是用户。对于客户端上的处理量,一定要十分小心。当设计瘦客户端系统时,

必须知道用户或客户将使用不同的客户端来访问应用程序。如果试图在客户端进行大量的处理工作,

就可能会导致一些问题。这是 Windows 和 Web 窗体应用程序的主要区别之一。下面学习这两种类

型的 Visual Studio 2012 应用程序的主要区别。 当处理 Windows 窗体应用程序时,在使用之前必须有一个已编译的程序发布到用户的桌面上。

根据应用程序的不同,有时需要一个或多个随它一起发布的 DLL 或其他可执行文件。 在瘦客户端体系结构中,一般不发布任何程序或 DLL。用户只需要打开浏览器并输入应用程序

网站的 URL 地址即可。Web 站点所在的服务器负责分配 Web 应用程序请求的所有资源。客户端是

一个导航工具,它显示从服务器返回的结果。 在瘦客户端应用程序中,请求的所有代码都存储在一个中心位置,即 Web 站点所在的服务器。

这些代码的任何更新都会在用户下一次请求 Web 页面时生效。 瘦客户端体系结构有几个主要的优点。首先也是 重要的是应用程序没有 初的发布成本。在

一个传统的客户端-服务器体系结构中,程序必须发布到每个使用它的客户端上。如果应用程序应用

于世界各地,这将是一个很费时的任务。 其次是应用程序没有发布更新版本的成本。对 Web 站点及组件的所有更新都发布给 Web 服务

器。一旦更新,下一次用户就能立即访问更新过的 Web 页面。在传统的客户端-服务器体系结构中,

更新程序不得不发布给每一个客户端,而更新将花费数日或几星期。而瘦客户端体系结构允许应用

程序的新版本及时发布给所有的用户,而无需操作桌面。 还有一个主要的好处是可以改变后台结构而不需要担心客户端。比如要将数据库的位置从低端

服务器移到新的高端服务器,新的服务器通常有一个新机器名称。在传统的客户端-服务器应用程序

中,数据库服务器的机器名称存储在代码或注册表设置中。这就需要为应用程序的每个用户修改代

码或注册表设置。在瘦客户端体系结构中,只需要更新指向新数据库服务器的 Web 服务器的设置,

更新任务就完成了。 在瘦客户端体系结构模型中,任何使用浏览器的客户端都可以访问 Web 站点并及时更新访问。

事实上,如果所做的更改对用户来说是透明的,那么客户端甚至可以不用指导所做的更改。 现在,我们对瘦客户端体系结构有了基本的了解,接下来看看 Web 窗体是如何工作的。

18.2 Web 窗体和 Windows 窗体的比较

本节将概述 Windows 窗体和 Web 窗体的各自优点。这在构建应用程序以解决用户问题时是很

有帮助的。在构建解决方案时,我们几乎总是在这两类体系结构中选其一。所以理解这两类体系结

构的优点十分重要。

第 18 章 ASP.NET

499

18.2.1 Windows 窗体的优点

Windows 窗体应用程序在一些系统类型中都表现出了它的优势。一般而言,需要响应界面(如零

售店的销售点系统)的应用程序即为 Windows 窗体应用程序。另外,在多数情况下,处理器密集型

的应用程序(如游戏或图形程序)更适合使用 Windows 窗体应用程序。 Windows 窗体的主要优点在于它是可信任的。当用户安装这类应用程序时,在当前区域,系统

给予了用户高度的信任。拥有这种高度的信任,就可以在本地计算机上存储当前会话的数据和状态。

用户可以运行该应用程序,并且应用程序可以无缝地与本地文件系统或注册表进行交互操作。不过,

对于 Internet 应用程序而言,为了避免类似 DOS 的攻击,这种高度信任也是受限制的。 Windows 窗体的另一个优点就是能够控制客户端应用程序。这样一来,就可以构建功能强大且

内容丰富的用户界面。而对于 Web 窗体而言,却有大量的控件不能使用(虽然这一差别正日益缩小),这就阻止了开发人员创建用户友好的应用程序。Windows 窗体允许开发人员创建更吸引人的用户

界面。 另外,应用程序的响应也是 Windows 窗体的优点之一。大多数或所有的处理工作都在客户端上

进行,这就减少了通过网络发送数据的需求量。发送给服务器的大量数据可能会导致延迟。对于在

本地计算机上运行的应用程序,一般事件都会得到迅速处理。另外,在本地网络上传输数据的速度

也比通常的 Internet 连接快。这样一来,数据在网络上的传输速度更快,产生的瓶颈问题也会更少。

18.2.2 Web 窗体的优点

Web 窗体的优点看起来似乎多于 Windows 窗体,但这并不意味着应把每个项目都开发为 Web窗体应用程序。总是有适合使用 Windows 窗体的解决方案。

Web 应用程序的 大优点在于它的发布功能。要发布 Web 窗体应用程序,仅需要将其安装到

Web 服务器上。也就是说,无须为 Windows 的每个版本都创建一个安装程序或附带 CD。在需要更

新时,仅将更新内容发布给 Web 服务器即可,当客户下次访问站点时,就会使用 新的应用程序。 版本控制或更新控制是 Web 窗体的另一大优点。所有应用程序的代码都放在同一位置,更新就

是一件轻而易举的事情,此时无须考虑版本 8 的用户和版本 10 的用户的不同,因为所有用户都访问

同一个应用程序。只要发布了更新内容,无须用户的干预,所有的用户都会即刻看到所做的更新。 你可能对术语平台独立性比较熟悉,而 Web 应用程序就具有平台独立性。不管用户计算机的类

型如何, 只要拥有一个浏览器并连接到 Web 服务器,用户就可以访问应用程序。有了平台独立性,

就无须为不同的操作系统构建不同版本的应用程序。 相对于 Windows 应用程序来说,Web 应用程序的以上优点可以节省数百万美元的成本。能够对

一个代码块进行快速更新和维护是其中的两大优点。但有时 Web 应用程序并没有提供足够的用户体

验。对于每个项目,一定要确保正确这两种选项。下面将进一步介绍 Web 窗体应用程序的开发。

18.3 Web 应用程序基础

简单的 Web 应用程序仅是一些 Web 页面。如果用户要访问 Web 页面,就需要 Web 服务器和

浏览器。首先浏览器向服务器上的页面发出请求,然后服务器处理 Web 页面并将结果返回给浏览器。

用户在浏览器中可以看到该页面,该页面可能包含 HTML、CSS 和客户端脚本。 后,在浏览器中

Visual Basic 2012 入门经典(第 7 版)

500

会显示该页面。本节概述了 Web 应用程序的一些基础知识。

18.3.1 Web 服务器

现在,市面上有许多Web 服务器,其中 知名的要数Microsoft Internet Information Services (IIS) 和Apache。本章主要介绍 IIS。

18.3.2 浏览器

Web 窗体应用程序的每个用户都必须具有一个浏览器。 流行的 5 个浏览器是 Internet Explorer (IE)、Firefox、Chrome、Safari 和 Opera。在开发公共 Web 站点时,必须知道该站点在每种浏览器中

的显示是不同的。对于HTML的有效性验证,使用IE是 合适的。本章将重点介绍IE 10。Visual Studio中使用的控件会显示特定浏览器的代码,从而使应用程序在所有的浏览器上都能正确显示。但仍需

要测试用户用来访问应用程序的浏览器的每个版本。 近,越来越多的 Web 开发人员开始关注移动电话和平板电脑的使用;它们逐渐发现想要开发

一个即对桌面用户友好又对移动用户友好的站点是非常困难的。因此,在开发过程中需要确定是否

需要支持那些带有小屏幕的移动设备。请记住,你可以开发可提供 好用户体验的独立站点,也可

以开发让移动用户在小屏幕上查看主 Web 应用程序的站点。

18.3.3 超文本标记语言

超文本标记语言也被称为 HTML,是 Web 页面的显示或设计布局。它是一种基于标记的语言,

允许用户改变信息的显示。例如,在 HTML 中,若希望文本显示为黑体,只需要将<b>标记放在文

本的两边即可。下面的文本是一个 HTML 示例:

<p>This is <b>bold</b> in HTML.</p>

如果在浏览器中显示上面的文本,结果将如下所示:

This is bold in HTML.

浏览器会解释 HTML,并遵从来自 W3C 的标准。W3C 成立于 1990 年,它开发了 Web 公共协

议。要了解 W3C 的更多情况,请访问 Web 站点 www.w3.org。 尽管不具备 HTML 知识也可以通过 Visual Studio 2012 设计 ASP.NET Web 站点,但本章后面还

是介绍了一些利用 HTML 创建 Web 页面的动手练习。

18.3.4 JavaScript

Web 开发的主要部分就是客户端脚本。如果要为公共用户创建使用客户端脚本的应用程序,就

需要在所有的浏览器中使用 JavaScript。VBScript 是一种以 Microsoft 为中心的语言,其语法类似于

Visual Basic,但发展很慢。可以在一些较早的代码中看到该语言。目前只有 IE 支持 VBScript,所以

用户可能从来不使用 VBScript 为客户端脚本创建新代码。 客户端脚本通常用于数据的验证和 DHTML。验证脚本要求用户在继续之前先填写屏幕上的某

个字段。而 DHTML 脚本允许在把页面放在内存中之后,再在浏览器上以编程方式对该页面进行修

改。例如,展开菜单就是 DHTML 的一个示例。目前,IE 支持的 DHTML 比 W3C 要求的更多一些,

所以必须为每个目标浏览器创建 DHTML。

第 18 章 ASP.NET

501

Visual Studio 2012 的强大功能之一就在于它的验证控件和导航控件。可以在 Web 页面上拖放这

些控件,而无须编写任何客户端脚本。在大多数情况下,这些控件已足够用了,但有时还需要创建

一些客户端脚本。因此,本章后面编写了一些脚本。

18.3.5 CSS

使用 CSS 可以将布局和样式从 Web 页面的内容中分离出来,可以使用 CSS 改变字体、颜色、

对齐方式以及 Web 页面显示的其他方面。CSS 的优点在于它能够应用到整个站点。借助一个主 CSS页面,通过改变一个页面就可以快捷地维护和改变整个 Web 站点的外观。本章将会介绍 CSS 的更

多内容。

18.4 关于 ASP 页面

在 Visual Studio 2012 中,利用 ASP 或 ASP.NET 可以轻松地创建数据驱动的动态 Web 站点。本

节将解释 ASPX 或 Web 窗体的功能和优点。

18.4.1 ASP.NET Web 页面的优点

当创建 Web 应用程序时,可能会有许多解决方案。 常见的页面类型有 ASP(.asp 和.aspx)、JSP(.jsp)、CFP(.cfm)以及基本的 HTML(.htm 或.html)。本章主要介绍 ASPX,另外还介绍了 HTML的一些知识。

执行时间是 ASP.NET 的一个突出优点。当第一次请求 ASP.NET 页面时,会将一个已编译的副

本放入服务器的内存中,以备下一次请求使用。相比于解释性语言,这极大提高了性能。 使用Visual Studio 2012 设计应用程序在开发效率方面也会产生很大的差别。.NET Framework 提供

了上千个用于开发 Web 窗体应用程序的名称空间、对象和控件。另外,ASP.NET 还支持所有与.NET兼容的语言。默认情况下,Visual Basic 和 C#在 Visual Studio 2012 中都是可用的。

18.4.2 特殊的 Web 站点文件

使用 ASP.NET 时会看到一些特殊的文件。这些文件十分重要,并且对每个文件的介绍都可以独

立成章。本节讲述的两个文件(global.asax 和 web.config)都可以在一个地方对整个网站进行修改。如

果想了解这两个文件的更多内容,请访问 Web 站点 http://www.msdn.com。

1. global.asax 文件

global.asax 文件允许用户向某些应用程序级的事件添加代码。这些常用事件包括:

Application_Start、Application_End、Session_Start、Session_End 以及 Application_Error。当 IIS 中的

实际 Web 应用程序发生状态改变时,就会触发 Application_Start 和 Application_End 事件。重新启动

服务器或 IIS 后,Application_Start 事件就会通过对 Web 站点的第一次请求而触发。Session_Start、Session_End 事件会在 Web 服务器的每次用户/浏览器会话中触发。在用户的会话中保存数据时一定

要小心,因为浏览应用程序的每个用户/浏览器都会保存这些数据。这会在服务器导致额外的负载。

后一个事件 Application_Error 可以将所有未处理的异常记录到一个公共位置。在记录错误后,确

保将用户重定向到一个友好的错误页面。

Visual Basic 2012 入门经典(第 7 版)

502

2. web.config 文件

web.config 文件看起来更像是 Web 应用程序的一个配置文件,它是一个 XML 文档。可以针对

安全、错误等诸多因素更新应用程序的一些设置。在大多数生产应用程序中,我们会将连接字符串

存储到数据库中。

18.4.3 开发方式

在Visual Studio 2012中构建Web窗体应用程序是在IDE中进

行的,这一点与构建Windows窗体应用程序一样。处理 Web 页

面时,可以选择使用所谓的代码隐藏页面。这可以将应用程序

的逻辑与显示代码分开。可以在 3 种视图中构建应用程序:

Design、Source 和 Code,这是构建应用程序的几种常用方式。

Design 和 Source 视图用于包含用户界面和数据验证的.aspx 页

面,而 Code 视图则用于代码隐藏页面的.vb 文件。在 Visual Studio 2012 中创建 Web 应用程序是很轻松的。

18.4.4 工具箱

构建 Web 应用程序时所使用的默认控件都位于工具箱中。

如果在开发界面上看不到工具箱,按下 Ctrl+Alt+X 组合键,即

可显示它。工具箱中的控件是按类别组织的,图 18-1 显示了标

准类别及其中的一些控件。

18.5 构建 Web 应用程序

本节将创建一些小型的 Web 应用程序,演示 Web 开发的各个方面。为此,我们将介绍 Web 窗

体应用程序的一些基本工作原理。

18.5.1 为客户端和服务器端处理创建 Web 窗体

下面这个练习中的 Web 窗体包含一些 HTML 控件和服务器控件。HTML 控件在客户端运行,

服务器控件则负责处理服务器端的代码。

试一试: 处理服务器端和客户端的代码 本示例将引导你完成第一个自定义网站。本练习的所有代码都位于本章压缩文件的

Client_ServerProcessing 文件夹中。 (1) 选择File | New Web Site,创建一个Web网站项目。确保使用Visual Basic语言,并在Templates

列表中选择 ASP.NET Web Site。在 Web location 右侧的下拉列表中选择 File System,并输入“[Visual Studio 2012 的默认路径]\Client_ServerProcessing”。Windows 8 下的默认路径为 C:\Users\Bryan.000\ Documents\Visual Studio 11\WebSites\Client_ServerProcessing。单击 OK 按钮,就会创建文件系统站点,

该站点使用内置的开发 Web 服务器进行测试。New Web Site 对话框如图 18-2 所示。

图 18-1

第 18 章 ASP.NET

503

图 18-2

(2) Visual Studio 为该 Web 站点创建了一些默认的文件夹和文件。查看一下 Default.aspx,如图

18-3 所示。Default.aspx 页面在 IDE 中打开。页面中已经有一个主页面和默认设计。本章后面将详

细介绍主页面。 (3) 删除 ContentPlaceHolder 控件(即 MainContent 控件)中的内容。单击 ContentPlaceHolder 控件

的内部,按下 Ctrl+A 组合键,再按下 Del 键。现在,在 Design 视图中,将下面的一些标准控件添

加到 MainContent 中。要切换到 Design 视图,需要在查看.aspx 页面时单击窗格左下方的 Design 选

项,或者按下 Shift+F7 组合键。只能把控件添加到 ContentPlaceHolder 控件中,因为该页面是一个

主页面。现在无须考虑控件的位置,但要确保使用的是工具箱中 Standard 和 HTML 类别下的控件。

图 18-3

Visual Basic 2012 入门经典(第 7 版)

504

当向窗体添加如下控件时,可以按任何顺序排列它们。为了便于设计布局,把光标放在

MainContent 内部,按回车键 5 或 6 次,这会在工作区域添加空格。这是在页面上布局的基本方式,

网站一般应使用 CSS 布局或表格布局,详见本章后面的内容。 ● 从工具箱的 Standard 选项卡下,向Main Content 内部放置一个Button 控件和两个Label 控件。 ● 从工具箱的 HTML 选项卡下,向 Main Content 内部放置一个 Input(Button)控件。 (4) 如图 18-4 所示,改变这些控件的属性: ● 设置 Standard:Button 的 ID 属性为 btnServer、Text 属性为 Server。 ● 设置 HTML:Input(Button)的 ID 属性为 btnClient、Text 属性为 Client。 ● 设置上边 Standard:Label 的 ID 属性为 lblServer、ClientIDMode 属性为 Static、Text 属性为

Server。 ● 设置下边 Standard:Label 的 ID 属性为 lblClient、ClientIDMode 属性为 Static、Text 属性为

Client。 (5) 在页面上输入换行符和空格符使控件四处移动。这称为相对定位;每个控件都相对于前面

的控件放置。排列这些控件,使之如图 18-4 所示。完成这些设置后,按下 Ctrl+F5 组合键,在未调

试的情况下运行该项目,在浏览器中查看该页面。必须修改 web.config 文件才能进行调试。选择启

用调试的选项,单击 OK 按钮。

图 18-4

(6) 关闭浏览器并回到 Visual Studio 2012。双击 btnServer 按钮控件,跳转到 btnServer_Click 事

件处理程序。根据设置的不同,可以在代码隐藏页面中编码,也可以在.aspx 页面的源代码中编码。

将如下突出显示的代码添加到 btnServer_Click 事件中:

注意:Default.aspx 页面底部带有 Design、Split、Source 和其他 HTML 标记的区

域被称为标记导航器。

第 18 章 ASP.NET

505

Protected Sub btnServer_Click(sender As Object, e As EventArgs) Handles btnServer.Click lblServer.Text = "Changed"

End Sub

再次运行该程序并测试按钮的单击事件。在单击 Server 按钮之后,标签将显示 Changed。 (7) 关闭浏览器并回到 Visual Studio 2012。为 HTML Input(Button)按钮控件创建一个事件处理程

序并向页面添加一个标题(确保在 IDE 中打开了 Default.aspx 页面,在 Properties 窗格中选择了

DOCUMENT)。为了给页面添加标题,需找到Title 属性并将其设置为My First Page。在标记导航器上,

单击 Source 切换到HTML 视图。从Client Object & Events 组合框中选择 btnClient。接着,选择事件

组合框中的 onclick,并将如下突出显示的代码添加到创建的事件中。注意 JavaScript 是区分大小写的。

<asp:Content runat="server" ID="HeadContent" ContentPlaceHolderID="HeadContent"> <script lang="javascript" type="text/javascript">

function btnClient_onclick() { document.getElementById("lblClient").innerText =

"Changed"; document.getElementById("lblServer").innerText =

"Server"; }

</script> </asp:Content>

(8) 接下来,找到 btnClient 的 HTML 文件,并将如下突出显示的代码添加到 onclick 事件中。

<input id="btnClient" type="button" value="Client" onclick="return btnClient_onclick();" />

(9) 再次按下 Ctrl+F5 组合键,运行该项目。测试这两个按钮。

示例说明 可以看出,Web 窗体的开发十分类似于 Windows 窗体的开发。这是.NET 开发和 Visual Studio

2012 的优点之一。任何开发人员从 Windows 开发转到 Web 开发都不是很困难,只要稍加学习就行。

下面先看一下 HTML 源代码。第一行代码是 Page 指令:

<%@ Page Title="My First Page" Language="VB" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeFile="Default.aspx.vb" Inherits="_Default" %>

根据开发所处模式的不同,可以看到 Visual Studio 2012 设置的不同默认特性。 Page 指令包含 30 多个可设置的特性。在此仅讨论一些默认的特性。如果想学习其他特性,请

在 Visual Studio 2012 帮助文件中或网络上查找“@Page”。 下面看一下 Default.aspx 页面中的默认特性。首先是 Title,它是浏览器中显示的页面标题。其

次是 Language 特性,它设置所有服务器代码编译为哪种语言。第 3 个特性是 MasterPageFile,这是

Web 页面使用的主页面文件(主页面详见本章后面的内容)。第 4 个特性是 AutoEventWireup,Visual Studio 2012 将它设置为 true。如果 Page 指令省略该特性,其默认值就为 true。而如果设置为 false,则必需手动连接事件(比如页面加载事件),从而是代码更加复杂。第 5 个特性是 CodeFile,当使用

Visual Basic 2012 入门经典(第 7 版)

506

独立的代码文件或代码隐藏页面时,它就是一个包含代码的页面。 后一个特性是 Inherits,它仅指

页面所继承的类名。 接下来是 Client 按钮单击事件的 JavaScript 代码。所添加的唯一事件是 btnClient 控件的 onClick

事件。客户端代码根据主页面被添加到 HeadContent 中。单击 Client 按钮时,就会引发该事件。子

例程第 1 行中的 getElementById 函数在文档中查找 ID 为 lblClient 的对象。一旦找到该对象,就将

innerText 设置为 Changed。子例程的第 2 行代码中也使用 getElementById 函数查找 lblServer 对象,

找到该对象之后,就将 innerText 改为 Server。添加如下代码,重新设置 Server 按钮的标签:

<asp:Content runat="server" ID="HeadContent" ContentPlaceHolderID="HeadContent"> <script lang="javascript" type="text/javascript">

function btnClient_onclick() { document.getElementById("lblClient").innerText =

"Changed"; document.getElementById("lblServer").innerText =

"Server"; }

</script> </asp:Content>

你可能不会注意到各个按钮在执行事件处理时方式之间的差异。单击每个按钮时,虽然很难发

现程序是在本地运行的,但可以回到 Web 页面查看浏览器的状态栏。单击 Server 按钮时,页面实际

上会调用 Web 服务器来处理事件。 Client 按钮不会再回调 Web 服务器,因为浏览器自身会处理事件。ClientIDMode 可以设置在脚

本中使用的 ID 的行为。使用 Static 会迫使控件的 ID 成为客户 ID。这是到目前为止 简单的选项。

使用 Static 时要小心,控件名称不要重复。 接下来是 Content 标记,这是添加控件的地方:

<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">

单击 Server 按钮后,会将窗体提交给服务器。

显示在 Default.aspx 页面上的 后一部分代码是控件的标记。下面给出了一些放在窗体上设计

区域的控件:

<br /> <asp:Button ID="btnServer" runat="server" Text="Server" /> &nbsp;&nbsp;

<asp:Label ID="lblServer" runat="server" Text="Server" ClientIDMode="Static">

</asp:Label> <br />

注意:从 IE 菜单栏中选择 View|Source,可以查看页面的 HTML 源代码。 浏览器知道 btnServer 是一个提交按钮。提交按钮的作用是将窗体数据传递给 Web

服务器。

第 18 章 ASP.NET

507

<br /> <input id="btnClient" type="button" value="Client"

onclick="return btnClient_onclick()" />&nbsp;&nbsp;&nbsp; <asp:Label ID="lblClient"

runat="server" Text="Client" ClientIDMode="Static"> </asp:Label>

<br /> <br />

</asp:Content>

后,看一下 Default.aspx.vb 页面。在 btnServer 控件的 OnClick 事件代码中,将标签的文本设

置为 Changed:

Partial Class _Default Inherits Page Protected Sub btnServer_Click(sender As Object,

e As EventArgs) Handles btnServer.Click lblServer.Text = "Changed"

End Sub

End Class

至此,我们完成了第一个 ASP.NET 页面的创建。在本例中,介绍了一些基本控件,并学习了如

何处理客户端和服务器端的代码。下面将学习在 Visual Studio 2012 的什么位置承载 Web 站点。

18.5.2 Visual Studio 2012 中 Web 站点的位置

在创建一个新的站点时,可以为它选择位置。本章中所有示例对于 Web 站点都使用 File System位置,如图 18-5 所示。这一位置的优点之一在于外部用户不能访问 Web 服务器。

图 18-5

Visual Basic 2012 入门经典(第 7 版)

508

还可以使用其他的方法来处理 Web 站点项目,如 Choose Location 对话框的左侧面板所示。第

一种方法是使用本地 IIS,如图 18-6 所示。

图 18-6

如果使用的是本地 Web 服务器,就可以将应用程序存放在它上面。这样一来,其他人就可以查

看站点并测试它。第二种方法是使用 FTP 站点。在本例中,使用的是托管服务公司。而我们所需要

完成的工作是添加位置和身份验证信息,以及在产品服务器中编写应用程序。FTP 站点的设置界面

如图 18-7 所示。

图 18-7

第 18 章 ASP.NET

509

第三种方法是使用 Remote Site。同样,当使用主机托管服务公司时也可以使用该方法。如果主

机托管服务公司支持 FrontPage Extensions,就可以使用 Remote Site,如图 18-8 所示。

图 18-8

后一种方法是使用 Source Control。在大型的开发项目中,我们可能会使用源控件 Team Foundation Server。此时,可以直接从 TFS 中打开一个站点。

18.5.3 数据的输入和验证

几乎每个 Web 站点的基本功能之一就是收集用户的各种信息。在站点屏幕上,我们可能都见过

类似“Contact Us”或“Create an Account”这样的字眼。只要看到 Web 页面的文本框中,就表示需

要进行数据的输入和验证。

试一试: 数据的输入和验证 在下面的示例中,将学习使用内置的验证控件以及访问用户输入到 Web 页面上的数据的一些基

本知识。本练习的所有代码位于本章压缩文件的 DataEntry 文件夹中。 (1) 在文件系统上创建一个新的 ASP.NET Web 站点,并命名为 DataEntry。 (2) 删除在前一个示例中所完成的默认内容。通过使用 Table 菜单下的 Insert Table 子菜单,向

MainContent 中添加一个带有 8 行、3 列的表。除了 Row 和 Column 外,其他选项保持不变。

Visual Basic 2012 入门经典(第 7 版)

510

(3) 向 Default.aspx 页面添加 4 个标签、3 个文本框和 1 个按钮。确保使用的是工具箱中 Standard选项卡下的服务器控件。 后,排列这些控件,如图 18-9 所示。

图 18-9

(4) 下面设置所添加的 8 个控件和文档的属性。可以使用 Source 视图修改控件的属性,因为在

这种视图下修改比较容易: ● 设置 Document 的 Title 属性为 Data Entry and Validation ● 设置 Button 的 ID 属性为 btnComplete、Text 属性为 Complete ● 设置左上方的 TextBox 的 ID 属性为 txtFirstName ● 设置右上方的 TextBox 的 ID 属性为 txtLastName ● 设置下方的 TextBox 的 ID 属性为 txtEmail ● 设置左上方的 Label 的 Text 属性为 First Name ● 设置右上方的 Label 的 Text 属性为 Last Name ● 设置中间的 Label 的 Text 属性为 Email ● 设置下方的 Label 的 ID 属性为 lblWelcome、Text 属性为 Welcome (5) 按下 Ctrl+F5 组合键测试该页面。当打开该页面时,我们将会测试 3 个数据项。首先,输入

你的名字和 e-mail 地址,然后单击 Complete 按钮。这会将该页面回发给服务器,而返回的 HTML会将数据保存在文本框中。以上操作都是默认行为,即视图状态。其次,在 First Name 文本框中输

入文本<SCRIPT>alert "Hi"</SCRIPT>,并单击 Complete 按钮。此时会出现如图 18-10 所示的错误

消息。ASP.NET 具有请求验证的功能,可以检查用户输入的任何危险数据,除非显式地禁用了该

功能。

第 18 章 ASP.NET

511

图 18-10

(6) 下面对用户输入的数据进行处理。首先需要打开代码隐藏页面,执行该操作的 简单方式

就是按下 F7 键。接着为页面加载添加一个事件处理程序。为此,从左边的 Objects 组合框中选择(Page Events),从 Events 组合框中选择 Load。添加如下突出显示的代码,使用输入的数据更新 lblWelcome控件:

Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load

If Page.IsPostBack Then 'If this is a postback and not the initial page load 'Display the data to the user Me.lblWelcome.Text = "Hello" + Me.txtFirstName.Text + " " + Me.txtLastName.Text + "<BR>" + "Your email address is" + Me.txtEmail.Text

End If End Sub

(7) 添加输入验证代码。Visual Studio 内置了完成输入验证的控件。要查看这些控件,需要切换

到 Default.aspx。从工具箱中找到 Validation 选项卡,该选项卡包含的一些可用来进行数据验证的预

置控件。在窗体中,添加两个 RequiredFieldValidator 控件和一个 ValidationSummary 控件。对齐控件,

如图 18-11 所示。 (8) 设置第一个 RequiredFieldValidator 控件的属性如下: ● 设置 ID 属性为 rfvFirstName ● 设置 Display 属性为 None ● 设置 ControlToValidate 属性为 txtFirstName ● 设置 ErrorMessage 属性为 First name is required (9) 设置第二个 RequiredFieldValidator 控件的属性如下: ● 设置 ID 属性为 rfvEmail

Visual Basic 2012 入门经典(第 7 版)

512

● 设置 Display 属性为 None ● 设置 ControlToValidate 属性为 txtEmail ● 设置 ErrorMessage 属性为 Email is required ● 设置 ValidationSummary 的 ID 属性为 ValidationSummary。 完成以上设置后,页面的效果应该如图 18-11 所示。

图 18-11

(10) 运行该项目,试着为 First Name 和 Email 文本框提供一些空数据项。此时,会看到如图 18-12中所示的两个错误消息。

图 18-12

第 18 章 ASP.NET

513

示例说明 无须编写任何代码,就可以在 Web 页面上完成数据的输入,这缘于那些大量的可快速进行数据

验证的控件。 本例使用 RequiredFieldValidator 控件来确保用户输入了数据,并设置了该控件的两个属性。其

中,将 ErrorMessage 属性设置为一个在 ValidationSummary 控件中显示的字符串。若设置

Display="None",错误消息就不会显示在 RequiredFieldValidator 控件中。必需的 ControlToValidate 属性被设置为所需要控件的 ID:

<asp:RequiredFieldValidator ID="rfvFirstName" runat="server" ControlToValidate="txtFirstName" Display="None" ErrorMessage="First name is required.">

</asp:RequiredFieldValidator>

可以将 ValidationSummary 控件用作显示所有错误消息的中心位置。如果决定不使用 summary

对象,可以将每个验证控件的 Display 属性设置为 Static 或 Dynamic。这样就会在验证控件中显示错

误消息。不需要改变任何属性就可以使用 ValidationSummary 控件,仅需要将它添加到窗体上显示验

证消息的位置即可:

<asp:ValidationSummary ID="ValidationSummary" runat="server" />

本例编写的唯一代码被添加到 Page_Load 事件中。这里使用 Page 对象的 IsPostBack 属性对回发

进行测试。如果是回发,就显示用户输入的名称和 Email。在 Visual Studio 2012 中仍可使用 Page_Load事件。为了自动插入该事件,可进入 aspx 页面的设计视图,在页面(非任何控件)上双击,该事件将

生成并转至后台代码中该事件所在的位置:

If Page.IsPostBack Then 'If this is a post back and not the initial page load 'Display the data to the user Me.lblWelcome.Text = "Hello" + Me.txtFirstName.Text + " " + Me.txtLastName.Text + "<BR>" + "Your email address is" + Me.txtEmail.Text

End If

还有更多的控件可帮助验证数据。比如,RangeValidator 控件可确保输入的值在指定的范围内。

CompareValidator 控件可以对一个控件的值和另一个控件的值或一个常量进行比较。对于更复杂的

注意:本示例说明了 ASP .NET 中的数据验证十分简单。除了本例中介绍的验证

控件外,还有一些其他控件也可用于数据验证。CompareValidator 控件确保控件与其

值相匹配,这个值可以是常量、其他控件甚至是数据库中的值。RangeValidator 控件对

指定范围内的值进行测试。例如,对年龄值进行测试,以确保年龄在 18 岁~35 岁之间。

提示:style 特性是在使用绝对定位时由 Visual Studio 添加的。使用绝对定位,可

以将控件拖放至任何位置。

Visual Basic 2012 入门经典(第 7 版)

514

验证,还可以使用另外两个控件—— CustomValidator 和 RegularExpressionValidator,利用它们基本上

可以满足任何类型的验证需求。

18.5.4 设计布局、主题和导航 以前,Web 开发的主要缺点在于需要以一种可管理的方式来维持整个站点的一致设计。为此,

开发人员创建了用户控件,并将其插入到每个页面的服务器端的包含文件中。对于 Web 开发的大部

分操作而言,这种方式是可行的。较难部分是确保在页面中关闭某个包含文件中的开标记。使设计

人员受挫的另一个原因在于,要确保所有的用户控件或包含文件都显示在同一个位置。这要花一些

时间,对于每个改变的页面,必须确保整个站点的外观看起来比较友好。现在,我们可以使用 Visual Studio 2012 提供的工具来保持设计、导航和安全性有一致的外观。

试一试: 理解默认的 ASP.NET 网站 利用登录控件、导航控件和主页面等工具可以维护站点的一致外观,下面的示例就介绍了这 3

个工具。本练习的所有代码位于本章压缩文件的 DefaultSite 文件夹中。 (1) 创建一个新的站点,命名为 DefaultSite。创建该站点后,它会满足我们的大多数(但不是全

部)基本需求。如果在浏览器中打开该站点并查看其功能,会看到登录功能以及一个常用的设计主题。

有了这个基本站点,就可以快速建立自己的站点。 (2) 运行该站点,单击链接、注册并登录。其中有许多功能,下面介绍其中的亮点。

示例说明 与 Visual Studio 的其他部分一样,使用内置工具可以完成许多操作。当创建新的 ASP.NET 站点

时,该站点包含 常见的功能,例如菜单、登录模块和主页面。而我们所需要做的只是修改其工作

方式以满足自己的需求即可。首先看看主页面及其内容。 主页面是网站具有一致外观和操作方式的关键。由于定义了一致的外观和操作方式,其他页面

的开发人员在创建新页面时将无法修改页面的外观和操作方式(因为新页面继承了指定的外观和操

作方式)。当创建新页面时,可以访问并更新 ContentPlaceHolder。这非常便于添加页面,只需要考

虑新页面的内容,不需要担心网站上受影响的其他区域。 下面看看默认创建的 Site.主页面。本例关注源代码中的两个重要项。源代码的顶部有一些必需

的 HTML。开发人员不应修改它们。下面简要讨论该 HTML 的每个基本部分。 下一行源代码是!DOCTYPE 元素。它告诉浏览器这是一个 HTML 文档:

<!DOCTYPE html >

接下来是实际的 html 根元素。在大多数情况下,该元素并不会被设置任何特性。lang="en"告诉

浏览器其内容是英文:

<html lang="en">

html 根元素之后是 head 元素。该元素的子元素没有显示出来,但它们可能会影响页面的显示方

式。可以使用 script、meta、title、link、style 和其他元素来定义页面的外观和操作方式。下面是本

示例中所使用的元素:

第 18 章 ASP.NET

515

● meta:设置页面所使用的默认字符集。 ● title:浏览器中显示的页面的标题。 ● link:link 标记告诉浏览器,这个文档关联了一个 CSS 表,并给出 CSS 表的位置。同时,

该标记还设置了站点的收藏夹图标,该图标在浏览器中。 ● script:所包括的 JavaScript 脚本。 ● Another meta tag:将移动浏览器视图的宽度设置为移动屏幕的宽度。 ● A ContentPlaceHolder: head 元素中的 ContentPlaceHolder 可以把需要的内容添加到站点的

每个页面上。

<!DOCTYPE html> <html lang="en"> <head runat="server">

<meta charset="utf-8" /> <title><%: Page.Title %> - My ASP.NET Application</title> <link href="~/Content/themes/base/jquery.ui.all.css" rel="stylesheet"

type="text/css" /> <link href="~/Content/Site.css" rel="stylesheet" type="text/css" /> <link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" /> <script src=

"<%: ResolveUrl("~/Scripts/modernizr-2.0.6-development-only.js") %>"> </script> <meta name="viewport" content="width=device-width" /> <asp:ContentPlaceHolder runat="server" ID="HeadContent" />

</head>

● body、form、div 和 hi 元素或标记:body 和 form 标记是必须的,body 标记包含所有的 HTML内容,所有的 ASPX 控件都必须放在 form 标记中。这些标记一般不发生变化,除非要应用

样式。div 和 hi 是用于内容的 HTML 元素,它们和许多其他 HTML 元素一起负责布局。本

例不深入讨论 HTML 元素,因为不可能用一章的篇幅介绍它们。开发人员只需要学习本章

的代码,以后可以在学习的过程中了解布局。 主页面上还有一些比较有趣的控件: ● asp:LoginView:这个控件与其他实现了.NET 成员验证功能的登录控件一起使用。当显示页

面时,使用模板(AnonymousTemplate 和 LoggedInTemplate)可以向验证用户和匿名用户显示

不同的视图。如默认站点所示,登录链接或注销时的欢迎消息是这个控件的典型用法。 ● asp: ContentPlaceHolder:开发人员使用它给新页面添加内容。

试一试: 主页面 在本示例中,我们将学习如何使用 CSS、主页面和主题快速修改网站的外观和操作方式。本练

习的所有代码位于本章压缩文件的 DefaultSite 文件夹中。 (1) 在默认网站上,通过浏览器和 Visual Studio 打开 Default.aspx 页面。查看解决方案中某个

Web 页面的简单方式是在 Solution Explorer 中右击它,再选择 View in Browser。 (2) 将 footer 的内容由 My ASP.NET Application 修改为 Master Pages 是非常容易的,只需要在

Site.aster 文件中进行相关的设置就可以了。刷新 Web 页面,将会看到如图 18-13 所示的结果。浏览

Visual Basic 2012 入门经典(第 7 版)

516

网站的其他页面,新消息会出现在每个页面上。如果浏览器缓存了 Web 页面,则必须按 Ctrl+F5 组

合键来进行完全刷新。

图 18-13

(3) 这是主页面强大功能的一个简单演示。现在改变整个网站的外观和操作方式。为此,返回

Visual Studio。通过 Content 菜单打开 Site.css 文件并找到 footer 代码块。然后将 fontsize 特性由.8em更改为 2.8em。返回浏览器,按下 Ctrl+F5 组合键,强制 IE 刷新显示,因为浏览器可能会缓存 CSS页面,所以很难把 新的修改显示在浏览器上。如果没有看到字体变大(如图 18-14 所示),那肯定出

了缓存问题。如果检查浏览器上的其他页面,就会看到对所有页面进行了同样的修改:

font-size: 2.8em;

图 18-14

(4) 接下来添加一个新的内容页面,并应用相同的外观和操作方式。在 Solution Explorer 中右击

网站名,分别选择 Add | Add New Item。再选择 Web Form,命名为 News.aspx。确保选中 Place code in separate file 和 Select master page 复选框,如图 18-15 所示。当提示选择主页面时,选择 Site.master。此时站点设计就显示在新页面上。

(5) 向 ContentPlaceHolder 添加一个按钮,将其 Text 属性设置为 Click Here。在浏览器中查看新

页面,就会看出发生的变化。 (6) 新按钮的默认设置看起来不错,但对于本站点,需要给按钮添加主题,以便所有按钮的外

观都一样。在 Solution Explorer 中右击网站,分别选择 Add | Add ASP.NET Folder,再单击 Theme。Visual Studio 会添加两个文件夹—— App_Themes 和 Theme1。在 Solution Explorer 中右击 Theme1 文

件夹,分别选择 Add | Add New Item,在 Add New Item 对话框中,选择 Skin File,命名为 Button.skin,再单击 OK 按钮。

第 18 章 ASP.NET

517

图 18-15

(7) 新的 Skin 文件会在 IDE 中打开,添加如下代码:

<asp:Button runat="server" BackColor="Black" ForeColor="White" />

(8) 在 News.aspx 页面上,给顶部的 Page 指令添加 Theme 特性,并设置为 Theme1。刷新浏览

器后,会显示一个黑底白字的按钮。更新的代码如下所示:

<%@ Page Title="" Language="VB" MasterPageFile="/Site.master" AutoEventWireup="false" CodeFile="News.aspx.vb" Inherits="News" Theme="Theme1" %>

示例说明 为了说明如何修改主页面,使之影响整个站点,本例把页面标题更新为 Master Pages are easy。

网站上使用该主页面的所有页面都立即把这个改变显示给终端用户。这是一个非常强大的工具,可

帮助应用程序获得长期的成功。多年维护应用程序是非常困难的。不使用这样的功能,一个简单的

改动就需要修改网站的每个页面,这需要几天甚至几个星期的时间。所以一定要在自己的网站中使

用主页面功能。 接下来使用 CSS 改变登录链接的显示属性。因为该链接在主页面上,所以这也会改变其他页面。

CSS 非常强大,可以完成许多其他任务。几乎所有影响对象在浏览器中显示方式的属性都可以通过

CSS 修改。甚至修改每个 dic 标记中所有文本的全局性改动都可以使用 CSS 的一个块来完成。这里

使用一个类定义 CSS 的作用域。除了类之外,还可以使用 div,所有的 div 标记都会受到影响。 可以把主页面应用于所有的新页面,使新页面的外观和操作方式与网站保持一致。这里把

Site.master 应用于新添的 News.aspx 页面。 主题类似于 CSS,可以把皮肤应用于服务器控件,把它们打包为一个主题,然后在页面级别上

应用该主题,就像本例所示,或者在全局应用它。可以建立新的主题,改变一个属性就可以给整个

Visual Basic 2012 入门经典(第 7 版)

518

网站带来全新的外观。

18.5.5 使用 GridView 构建数据驱动的 Web 窗体 ASP.NET 2.0 中的数据控件增加了以声明的方式编程的功能。这个无代码的体系结构允许查看

Web 窗体的源代码、布局和设计以及一些用于数据访问和数据操作的特性。如果你具备 HTML 或

ASP.NET 1.1 的使用经验,就会发现这种数据访问的新方法非常紧凑、简单。 在下面的示例中,我们将使用 ASP.NET 中 有用的两个控件进行数据访问。第一个是

SqlDataSource 控件,第二个是 GridView 控件。本例将设置它们的属性、特性及其子元素。本例无

须编写任何服务器端或客户端代码,就创建了一个显示 Pubs 数据库中数据和更新数据的 Web 应用

程序。

试一试: 无代码的数据查看和更新 下面这个示例要求访问安装有 Pubs 数据库的 SQL Server。本练习的所有代码位于本章压缩文件

的 DataGridView 文件夹中。 (1) 创建一个新的 Web 站点,命名为 DataGridView。添加 Web 窗体 Default.aspx。 (2) 使用 Source 视图,将如下突出显示的代码添加到 Default.aspx 页面。同时,确保修改了

ConnectionString 的值,以匹配你的开发环境:

<%@ Page Language="VB" %> <!DOCTYPE html> <script runat="server"> </script> <html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server"> <title>Grid View</title>

</head> <body> <form id="form1" runat="server"> <div>

<asp:SqlDataSource ID="sdsAuthors" Runat="server" ProviderName = "System.Data.SqlClient" ConnectionString = "Server=localhost\sqlexpress; User ID=sa; Password=wrox;Database=pubs;" SelectCommand = "SELECT au_id, au_lname, au_fname, phone, address, city, state, zip FROM authors" UpdateCommand = "UPDATE authors SET au_lname = @au_lname, au_fname = @au_fname, phone = @phone, address = @address, city = @city, state = @state, zip = @zip WHERE au_id = @au_id" >

</asp:SqlDataSource> <asp:GridView ID="gdvAuthors" Runat="server" DataSourceID="sdsAuthors" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="false" DataKeyNames="au_id" >

第 18 章 ASP.NET

519

<PagerStyle BackColor="Gray" ForeColor="White" HorizontalAlign="Center" />

<HeaderStyle BackColor="Black" ForeColor="White" /> <AlternatingRowStyle BackColor="LightGray" /> <Columns>

<asp:CommandField ButtonType="Button" ShowEditButton="true" /> <asp:BoundField Visible="false" HeaderText="au_id"

DataField="au_id" SortExpression="au_id"> </asp:BoundField>

<asp:BoundField HeaderText="Last Name" DataField="au_lname" SortExpression="au_lname"></asp:BoundField>

<asp:BoundField HeaderText="First Name" DataField="au_fname" SortExpression="au_fname"></asp:BoundField>

<asp:BoundField HeaderText="Phone" DataField="phone" SortExpression="phone"></asp:BoundField>

<asp:BoundField HeaderText="Address" DataField="address" SortExpression="address"></asp:BoundField>

<asp:BoundField HeaderText="City" DataField="city" SortExpression="city"></asp:BoundField>

<asp:BoundField HeaderText="State" DataField="state" SortExpression="state"></asp:BoundField>

<asp:BoundField HeaderText="Zip Code" DataField="zip" SortExpression="zip"></asp:BoundField>

</Columns> </asp:GridView>

</div> </form> </body> </html>

(3) 按下 Ctrl+F5 组合键,运行该应用程序但不调试。将会看到如图 18-16 所示的数据网格。

图 18-16

(4) 测试数据网格的功能。在网格的底部,可以移动到数据的任一页。另外,单击任何一个列

标题,都可以对列数据进行排序。完成以上操作后,下面更新行数据。如果想编辑作者数据,可单

击作者行左边的 Edit 按钮。刷新屏幕,将会看到如图 18-17 所示的新数据网格。

Visual Basic 2012 入门经典(第 7 版)

520

修改任何字段后单击 Update 按钮,就会使所做的修改持久生效。若想取消所做的修改,可以单

击除 Update 按钮之外的任何一个链接或按钮。

图 18-17

示例说明 本示例十分简单。通过添加了两个控件,我们就创建了一个相当可靠的数据访问页面。下面解

释本示例中发生的操作。 首先,创建了 SqlDataSource 控件,表 18-1 中给出了为该控件添加或修改的所有特性。该控件

的代码如下所示:

<asp:SqlDataSource ID="sdsAuthors" Runat="server" ProviderName = "System.Data.SqlClient" ConnectionString = "Server=localhost\sqlexpress; User ID=sa; Password=wrox;Database=pubs;" SelectCommand = "SELECT au_id, au_lname, au_fname, phone, address, city, state, zip FROM authors" UpdateCommand = "UPDATE authors SET au_lname = @au_lname, au_fname = @au_fname, phone = @phone, address = @address, city = @city, state = @state, zip = @zip WHERE au_id = @au_id" >

</asp:SqlDataSource>

表 18-1 SqlDataSource 控件

特性或元素 说 明

ID 控件的标识符

Runat 指定在将页面发送给浏览器之前,在服务器上运行控件的代码

ProviderName 用于设置访问数据库的数据提供程序。在本例中,指的是 System.Data.SQLClient,它是 SQL

Server 的托管数据提供程序

第 18 章 ASP.NET

521

(续表)

特性或元素 说 明

ConnectionString 一个字符串值,用于连接数据库源Pubs

SelectCommand 传递给数据库的 SQL 语句,用于获取显示在网格中的数据。该元素可能是一个存储过程名

UpdateCommand 用于更新数据的 SQL 语句。在本例中,可以用一个存储过程名来代替这个 SQL 语句

向窗体添加的第二个控件是GridView。该控件的特性及其说明如表 18-2 所示,其代码如下所示:

<asp:GridView ID="gdvAuthors" Runat="server" DataSourceID="sdsAuthors" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="false" DataKeyNames="au_id" >

<PagerStyle BackColor="Gray" ForeColor="White" HorizontalAlign="Center" />

<HeaderStyle BackColor="Black" ForeColor="White" /> <AlternatingRowStyle BackColor="LightGray" /> <Columns> <asp:CommandField ButtonType="Button"

ShowEditButton="true" /> <asp:BoundField Visible="false" HeaderText="au_id"

DataField="au_id" SortExpression="au_id"> </asp:BoundField>

<asp:BoundField HeaderText="Last Name" DataField="au_lname" SortExpression="au_lname"></asp:BoundField>

<asp:BoundField HeaderText="First Name" DataField="au_fname" SortExpression="au_fname"></asp:BoundField>

<asp:BoundField HeaderText="Phone" DataField="phone" SortExpression="phone"></asp:BoundField>

<asp:BoundField HeaderText="Address" DataField="address" SortExpression="address"></asp:BoundField>

<asp:BoundField HeaderText="City" DataField="city" SortExpression="city"></asp:BoundField>

<asp:BoundField HeaderText="State" DataField="state" SortExpression="state"></asp:BoundField>

<asp:BoundField HeaderText="Zip Code" DataField="zip" SortExpression="zip"></asp:BoundField>

</Columns> </asp:GridView>

表 18-2 GridView 控件的特性或元素

特性或元素 说 明

ID 控件的标识符

Runat 指定在将页面发送给浏览器之前,在服务器上运行控件的代码

DataSourceID 本例中使用的 SqlDataSource 对象的 ID

AllowPaging 可以将该属性设置为 true 或 false,用于启用网格的分页功能

AllowSorting 可以将该属性设置为 true 或 false,用于启用网格的排序功能

Visual Basic 2012 入门经典(第 7 版)

522

(续表)

特性或元素 说 明

AutoGenerateColumns 可以将该属性设置为 true 或 false,用于确定网格自动创建列的方式

DataKeyNames 用于数据库表的主键

PagerStyle 该元素定义网格中分页区域的样式

HeaderStyle 该元素定义网格中行标题区域的样式

AlternatingRowStyle 该元素定义网格中交替行的样式

Columns 列对象的集合

CommandField 这个对象使用了两个属性。其中的 ButtonType 属性用于设置按钮的类型。可以插入

一个按钮、图像或链接作为它的值。如果该属性为空,默认值就是链接

BoundField

该元素可以将数据绑定到网格中。对于比较友好的用户界面,可以使用 Visible 属性

来隐藏主键列。另外,也可以设置每列的 SortExpression。这会将每个列标题转换为

一个链接。单击该链接时,就会按列对数据排序。然后,可以使用 HeaderText 属性

改变列标题。如果该属性为空,就将列名作为列标题。 后,使用 DataField 属性设

置该字段的绑定

18.6 小结

本章介绍了什么是瘦客户端开发,解释了 Web 窗体和 Windows 窗体各自的优点,以及选择 Web应用程序类型或者 Windows 应用程序类型的原因。在决定创建 Web 应用程序而不是 Windows 应用

程序时,Web 应用程序的较低发布成本或许是一个主要的考虑因素。 本章还介绍了典型 Web 应用程序的基本组成。从布局和格式化到数据库集成,读者可以学习

ASP.NET 的一些 有用的功能,并掌握如何实现这些功能。 后,本章还设计了一个更新数据库中

数据的无代码页面。 如果你对 Web 开发十分感兴趣,可以学习除本章介绍的内容之外的其他一些内容。要深入学习

Web 开发,建议访问 www.Wrox.com,单击 ASP.NET 链接以找到更多的资源,进而引导你进一步学

习 Web 开发。 总之,学完本章你应该掌握以下内容: ● 在 Web 窗体应用程序和 Windows 窗体应用程序之间进行选择,以满足你的目的 ● 使用 ASP.NET 中的工具箱 ● 在 Visual Studio 2012 中创建 Web 网站项目 ● 处理客户端和服务器端的 Web 窗体事件 ● 使用内置控件进行数据验证 ● 在 Visual Studio 2012 中 Web 站点可能的位置间进行选择 ● 使用主题、主页面和 CSS ● 使用 Grid View 和 SqlDataSource 读取和更新 SQL 数据库中的数据

第 18 章 ASP.NET

523

练习 1. 如何建立可由 Web 窗体页面继承的设计和布局? 2. 在设计页面时,改变页面元素的显示方式有哪两种方法? 3. 设置什么属性可以为服务器控件指定静态的客户 ID? 4. 说出一个可用于验证窗体数据的控件。 下面对本章讨论的主题进行了总结。

本章的主要内容

主 题 概 念

客户端和服务器端事件 一些(客户端)事件由浏览器处理,而一些(服务器端)事件由 Web 服务器处理

数据验证 在 ASP.NET 中,可以使用内置的验证控件确保用户输入数据的有效性

网站布局和设计 使用主页面、主题、CSS 和 Menu 控件设计站点

在 Web 页面上访问数据 使用 GridView 控件可以把数据绑定到 Web 窗体上