《.NET 3.5与VB 2008高级编程 第3版》PDF下载

  • 购买积分:29 如何计算积分?
  • 作  者:姜玲玲,唐明霞
  • 出 版 社:北京:清华大学出版社
  • 出版年份:2009
  • ISBN:9787302208419
  • 页数:1152 页
图书介绍:本书全面介绍了.NET 3.5平台和Visual Basic 2008语言的所有新特性。本书从逻辑上划分成8个不同的部分,每个部分包括一些集中了特定技术集和特定任务的章节。

第Ⅰ部分 Visual Basic 2008与.NET平台第1章 .NET基本原理 3

1.1 历史状态 3

1.1.1 C/Win32 API程序员的生活 3

1.1.2 C++/MFC程序员的生活 4

1.1.3 Visual Basic 6.0程序员的生活 4

1.1.4 Java/J2EE程序员的生活 4

1.1.5 COM程序员的生活 5

1.1.6 Windows DNA程序员的生活 5

1.2 .NET解决方案 6

1.3 .NET平台的构件块(CLR、CTS与CLS) 6

1.4 Visual Basic 2008的新内容 7

1.5 其他.NET支持语言 8

1.6 .NET程序集概览 10

1.6.1 单文件与多文件程序集 11

1.6.2 公共中间语言的作用 11

1.6.3 .NET类型元数据的作用 14

1.6.4 程序集清单的作用 15

1.7 公共类型系统 15

1.7.1 CTS类类型 16

1.7.2 CTS接口类型 16

1.7.3 CTS结构类型 16

1.7.4 CTS枚举类型 17

1.7.5 CTS委托类型 17

1.7.6 CTS类型成员 17

1.7.7 固有CTS数据类型 18

1.8 公共语言规范 18

1.9 了解公共语言运行库 20

1.10 程序集/名称空间/类型之间的区别 21

1.10.1 通过编程访问名称空间 24

1.10.2 引用外部程序集 25

1.11 使用ildasm.exe 25

1.11.1 查看CIL代码 26

1.11.2 查看类型元数据 26

1.11.3 查看程序集元数据(也称为清单) 27

1.12 使用Lutz Roeder的reflector 27

1.13 部署.NET运行库 28

1.14 .NET的平台无关特性 29

1.15 小结 30

第2章 构建Visual Basic 2008应用程序 31

2.1 .NET Framework 3.5 SDK的作用 31

2.2 VB 2008命令行编译器(vbc.exe) 32

2.3 使用vbc.exe构建VB 2008应用程序 32

2.3.1 使用vbc.exe引用外部程序集 34

2.3.2 使用vbc.exe编译多个源文件 35

2.3.3 使用vbc.exe引用多个外部程序集 36

2.4 使用vbc.exe响应文件 36

2.5 使用SharpDevelop构建.NET应用程序 38

2.6 使用Visual Basic 2008 Express构建.NET应用程序 41

2.7 使用Visual Studio 2008构建.NET应用程序 42

2.7.1 Visual Studio 2008的一些特有功能 42

2.7.2 使用New Project对话框选择.NET Framework的版本 43

2.7.3 使用Solution Explorer实用程序 43

2.7.4 Class View实用程序 45

2.7.5 Object Browser实用程序 45

2.7.6 Visual Studio 2008代码片断技术 45

2.7.7 可视化类设计器 46

2.7.8 Object Test Bench 49

2.7.9 综合帮助系统 50

2.8 Visual Basic 6.0兼容性程序集的作用 51

2.9 其他.NET开发工具的部分目录 52

2.10 小结 53

第Ⅱ部分 核心VB编程结构 57

第3章 VB 2008编程结构(上) 57

3.1 Module类型的作用 57

3.1.1 带多个模块的项目 58

3.1.2 模块是不能创建的 59

3.1.3 重命名初始模块 60

3.1.4 模块的成员 60

3.2 Main方法的作用 61

3.2.1 使用System.Environment处理命令行参数 61

3.2.2 使用Main()处理命令行参数 62

3.2.3 Main()作为函数(而不是作为子例程) 62

3.2.4 使用Visual Studio 2008指定命令行参数 63

3.3 一个有趣的附加作用:System.Environment类的一些其他成员 63

3.4 System.Console类 64

3.4.1 使用Console类的基本输入输出 65

3.4.2 格式化控制台输出 65

3.4.3 .NET字符串格式化标记 66

3.4.4 使用String.Format()格式化字符串 67

3.5 系统数据类型与VB简洁表示法 67

3.5.1 变量声明和初始化 68

3.5.2 数据类型的默认值 69

3.5.3 数据类型类层次结构 70

3.5.4 固有数据类型和New关键字 71

3.5.5 体验数值数据类型 71

3.5.6 System.Boolean的成员 72

3.5.7 System.Char的成员 72

3.5.8 分析字符串数据中的值 73

3.6 System.String类型 73

3.6.1 基本字符串操作 74

3.6.2 字符串连接(以及Newline常量) 74

3.6.3 字符串和相等 76

3.6.4 字符串是不能改变的 76

3.6.5 System.Text.StringBuilder类型 77

3.7 窄化(显式)或宽化(隐式)的数据类型转换 78

3.7.1 Option Strict 80

3.7.2 显式转换函数 82

3.7.3 System.Convert的作用 83

3.8 构建Visual Basic 2008代码语句 83

3.8.1 语句延续字符 83

3.8.2 在单行上定义多个语句 84

3.9 VB 2008流程控制语句结构 85

3.9.1 If/Then/Else语句 85

3.9.2 构建复杂条件表达式 86

3.9.3 Select/Case语句 87

3.10 VB 2008迭代结构 87

3.10.1 For/Next循环 88

3.10.2 For/Each循环 88

3.10.3 Do/While和Do/Until循环结构 89

3.10.4 With结构 90

3.11 小结 90

第4章 VB 2008编程结构(下) 91

4.1 定义子例程与函数 91

4.1.1 ByVal参数修饰符 92

4.1.2 ByRef参数修饰符 93

4.1.3 定义可选参数 94

4.1.4 使用ParamArrays 95

4.1.5 方法调用约定 96

4.1.6 包含静态局部变量的方法 97

4.2 成员重载 98

4.2.1 Overloads关键字 99

4.2.2 方法重载的细节 99

4.3 VB 2008中的数组操作 100

4.3.1 VB 2008数组初始化语法 101

4.3.2 定义Objects的数组 101

4.3.3 定义数组的下边界 102

4.3.4 Redim/Preserve语法 103

4.3.5 使用多维数组 104

4.3.6 System.Array类 105

4.4 VB 2008的枚举 106

4.4.1 控制枚举的底层存储 107

4.4.2 声明和使用枚举 107

4.4.3 System.Enum类型(以及解析关键字命名冲突的一个教训) 108

4.4.4 动态地发现枚举的名/值对 110

4.5 VB 2008结构类型 111

4.6 小结 113

第5章 设计封装类类型 114

5.1 VB 2008类类型简介 114

5.2 类构造函数 117

5.2.1 默认构造函数的作用 119

5.2.2 定义自定义构造函数 119

5.2.3 再次介绍默认构造函数 120

5.3 Me关键字的作用 121

5.3.1 使用Me链接构造函数调用 123

5.3.2 观察构造函数流程 125

5.4 Shared关键字 126

5.4.1 定义共享方法(和字段) 126

5.4.2 定义共享数据 128

5.4.3 定义共享构造函数 130

5.5 定义OOP的支柱 131

5.5.1 封装的作用 132

5.5.2 继承的作用 132

5.5.3 多态的作用 133

5.6 Visual Basic 2008访问修饰符 134

5.6.1 访问修饰符与嵌套类型 135

5.6.2 默认访问修饰符 135

5.6.3 访问修饰符与字段数据 136

5.7 第一个支柱:VB 2008的封装服务 136

5.7.1 使用传统的取值和赋值封装 137

5.7.2 使用属性封装 138

5.7.3 属性的内部表示 140

5.7.4 控制属性可见性级别的Get/Set语句 142

5.7.5 只读和只写属性 142

5.7.6 共享属性 142

5.8 常量数据 143

5.9 只读字段 145

5.10 局部类型定义 146

5.11 通过XML文档化VB 2008源代码 147

5.12 使我们的概念形象化 151

5.13 小结 151

第6章 继承与多态 152

6.1 继承的基本机制 152

6.1.1 Inherits关键字 153

6.1.2 关于多个基类 154

6.1.3 NotInheritable关键字 155

6.2 修订Visual Studio 2008类图 156

6.3 第二个支柱:继承的细节 157

6.3.1 使用MyBase控制基类的创建 159

6.3.2 Protected关键字 160

6.3.3 添加密封类 161

6.4 包容/委托模型的编程 162

6.5 第三个支柱:VB 2008的多态支持 165

6.5.1 Overridable和Overrides关键字 166

6.5.2 用Visual Studio 2008进行重写 167

6.5.3 NotOverridable关键字 168

6.5.4 抽象类和MustInherit关键字 169

6.5.5 用MustOverride构建一个多态接口 170

6.5.6 成员屏蔽 173

6.6 基类/派生类的类型强制转换规则 174

6.7 终极父类:System.Object 176

6.7.1 重写System.Object.ToString() 179

6.7.2 重写System.Object.Equals() 179

6.7.3 重写System.Object.GetHashCode() 180

6.7.4 测试修改后的Person类 181

6.7.5 System.Object的共享成员 181

6.8 小结 182

第7章 结构化异常处理 183

7.1 关于错误、bug和异常 183

7.2 .NET异常处理的作用 184

7.2.1 .NET异常处理的原子性 184

7.2.2 System.Exception基类 185

7.3 最简单的示例 186

7.3.1 抛出一个简单的异常 187

7.3.2 捕获异常 188

7.4 配置异常的状态 189

7.4.1 TargetSite属性 189

7.4.2 StackTrace属性 190

7.4.3 HelpLink属性 190

7.4.4 Data属性 191

7.5 系统级异常(System.SystemException) 192

7.6 应用程序级异常(System.ApplicationException) 193

7.6.1 构建自定义异常(Ⅰ) 193

7.6.2 构建自定义异常(Ⅱ) 195

7.6.3 构建自定义异常(Ⅲ) 195

7.6.4 按Visual Studio方式构建自定义异常 196

7.7 处理多个异常 196

7.7.1 广义Catch语句 198

7.7.2 重新抛出异常 199

7.7.3 内部异常 199

7.8 Finally块 200

7.9 谁在抛出什么 201

7.10 未处理异常的结果 202

7.11 使用Visual Studio 2008调试未处理异常 202

7.12 融合VB6错误处理与结构化异常处理 203

7.13 小结 204

第8章 对象生存期 205

8.1 类、对象和引用 205

8.2 对象生存期基础 206

8.2.1 CIL的New关键字 207

8.2.2 将对象引用设置成Nothing 208

8.3 应用程序根的作用 209

8.4 对象代 210

8.5 System.GC类型 210

8.6 构建可终结对象 213

8.6.1 重写System.Object.Finalize() 214

8.6.2 详细介绍终结过程 215

8.7 构建可诊断对象 216

8.8 构建可终结和可诊断类型 218

8.9 小结 220

第Ⅲ部分 高级VB编程结构 223

第9章 使用接口类型 223

9.1 接口类型 223

9.2 定义自定义接口 225

9.3 实现接口 226

9.3.1 更新Hexagon类 227

9.3.2 支持多个接口的类型 228

9.4 与支持接口的类型进行交互 229

9.4.1 使用CType()获取接口引用 230

9.4.2 使用TypeOf/Is获取接口引用 230

9.4.3 作为成员参数的接口 231

9.4.4 作为返回值的接口 233

9.4.5 接口类型的数组 234

9.5 使用Implements关键字解决名称冲突问题 234

9.5.1 通过Implements关键字定义通用实现方式 236

9.5.2 使用Implements关键字对对象级别隐藏接口方法 237

9.5.3 设计接口层次结构 238

9.6 构建可枚举的类型(IEnumerable和IEnumerator) 239

9.6.1 构建可以克隆的对象(ICloneable) 241

9.6.2 一个更精细的克隆示例 243

9.7 构建可比较的对象(IComparable) 246

9.7.1 指定多种排序次序(IComparer) 248

9.7.2 自定义属性与自定义排序类型 249

9.8 使用接口作为回调机制 250

9.9 小结 253

第10章 集合、泛型和可为空值的数据类型 254

10.1 System.Collections的非泛型类型 254

10.1.1 System.Collections命名空间的接口 255

10.1.2 IDictionaryEnumerator的作用 256

10.1.3 IList的作用 256

10.1.4 System.Collections的类类型 257

10.2 System.Collections.Specialized名称空间 260

10.3 包装与解除包装操作 261

10.3.1 部分包装和解除包装实例 262

10.3.2 解除自定义值类型的包装 263

10.3.3 包装和解除包装操作的问题 264

10.4 类型安全性和强类型的集合 264

10.5 System.Collections.Generic名称空间 269

10.6 可为空值的数据类型和System.Nullable(Of T)泛型类型 272

10.6.1 使用可为空值的类型 273

10.6.2 Visual Basic 2008可为空值的运算符(?) 274

10.7 创建泛型方法 275

10.8 创建泛型结构(或类) 277

10.9 创建自定义泛型集合 279

10.9.1 自定义泛型集合类的用处 280

10.9.2 约束类型参数 282

10.9.3 缺少运算符约束 283

10.10 创建泛型接口 284

10.11 创建泛型委托 285

10.12 小结 287

第11章 委托、事件和Lambdas 288

11.1 了解.NET委托类型 288

11.1.1 在VB 2008中定义委托类型 289

11.1.2 研究自动生成的类类型 290

11.1.3 System.MulticastDelegate和System.Delegate基类 291

11.2 可能最简单的委托示例 292

11.3 使用委托更新Car类型 294

11.3.1 激活多播 297

11.3.2 从委托的调用列表中删除目标 298

11.4 了解(和使用)事件 299

11.4.1 使用RaiseEvent关键字激活事件 299

11.4.2 事件的本质 300

11.4.3 使用WithEvents和Handles关联引入的事件 301

11.4.4 使用Handles关键字多播 302

11.4.5 为多个事件定义单个处理程序 302

11.4.6 使用AddHandler/RemoveHandler动态关联引入的事件 303

11.5 定义“规规矩矩的”事件 304

11.6 定义强类型事件 306

11.7 定制事件注册过程 307

11.7.1 定义自定义事件 307

11.7.2 使用自定义委托来自定义事件 309

11.8 Visual Basic Lambda表达式 310

11.8.1 分解Lambda表达式 312

11.8.2 使用多个参数的Lambda表达式 313

11.8.3 使用自定义方法赋值Lambda参数 314

11.8.4 使用Zero参数的Lambda表达式 315

11.9 小结 315

第12章 运算符重载和自定义转换程序 316

12.1 运算符重载 316

12.1.1 运算符重载的情况 317

12.1.2 重载二元运算符 319

12.1.3 重载相等运算符 320

12.1.4 重载比较运算符 320

12.1.5 关于运算符重载的最后思考 321

12.2 值类型和引用类型的详细情况 322

12.2.1 值类型、引用类型和赋值运算符 323

12.2.2 包含引用类型的值类型 325

12.2.3 按值传递引用类型 326

12.2.4 按引用传递引用类型 327

12.2.5 值和引用类型:最后的细节 328

12.2.6 回顾:数值转换 329

12.2.7 回顾:相关类类型之间的转换 329

12.3 创建自定义转换程序 330

12.4 定义隐式转换程序 332

12.5 VB DirectCast关键字 334

12.6 小结 336

第13章 VB 2008特有的语言特性 337

13.1 了解隐式数据类型化 337

13.1.1 迭代结构中的隐式类型化 339

13.1.2 隐式类型数据是强类型数据 340

13.1.3 禁用Option Infer 340

13.1.4 后期绑定与隐式类型化 341

13.1.5 隐式类型变量的限制 343

13.1.6 隐式类型局部变量的有用性 343

13.2 了解扩展方法 344

13.2.1 定义扩展方法 344

13.2.2 重载扩展方法 345

13.2.3 在实例级别上调用扩展方法 346

13.2.4 调用定义模块上的扩展方法 346

13.2.5 扩展方法的作用域 347

13.2.6 导入定义扩展方法的类型 348

13.2.7 使用Visual Studio 2008标识扩展方法 349

13.2.8 构建和使用扩展库 349

13.2.9 通过扩展方法扩展接口类型 350

13.3 对象初始化器语法 351

13.3.1 使用初始化语法调用自定义构造函数 353

13.3.2 初始化包含的类型 354

13.4 匿名类型 355

13.4.1 匿名类型的内部表示 356

13.4.2 ToString()和GetHashCode()的实现方式 357

13.4.3 匿名类型相等性的语义 357

13.4.4 包含匿名类型的匿名类型 359

13.5 小结 359

第14章 LINQ概述 360

14.1 了解LINQ的作用 360

14.1.1 LINQ表达式是强类型且可扩展 361

14.1.2 核心LINQ程序集 361

14.2 LINQ查询表达式概述 362

14.2.1 LINQ和隐式类型局部变量 364

14.2.2 LINQ和扩展方法 365

14.2.3 延期执行的作用 365

14.2.4 立即执行的作用 366

14.3 LINQ和泛型集合 367

14.4 LINQ和非泛型集合 368

14.5 LINQ查询运算符的内部表示 370

14.5.1 使用查询运算符构建查询表达式(重访) 371

14.5.2 使用Enumerable类型和Lambda构建查询表达式 371

14.5.3 使用Enumerable类型和原始委托构建查询表达式 372

14.6 VB LINQ查询运算符 373

14.6.1 使用Enumerable计数 374

14.6.2 构建新的测试项目 374

14.7 LINQ查询:本身是孤岛吗 379

14.8 小结 381

第Ⅳ部分 使用.NET程序集编程 385

第15章 .NET程序集概述 385

15.1 .NET程序集的作用 385

15.1.1 程序集提示代码重用 385

15.1.2 程序集建立类型边界 386

15.1.3 程序集是可版本化单元 386

15.1.4 程序集是自描述对象 386

15.1.5 程序集是可配置对象 386

15.2 了解.NET程序集的格式 387

15.2.1 Win32文件头 387

15.2.2 CLR文件头 387

15.2.3 CIL代码、类型元数据和程序集清单 388

15.2.4 可选的程序集资源 389

15.2.5 单文件和多文件的程序集 389

15.3 构造自定义的.NET名称空间 390

15.3.1 观察根名称空间 391

15.3.2 定义根名称空间以外的名称空间 392

15.3.3 导入自定义的名称空间 393

15.3.4 使用Imports关键字构建类型别名 393

15.4 构建和使用单文件程序集 395

15.4.1 清单 397

15.4 2 CIL 398

15.4.3 类型元数据 399

15.4.4 构建VB 2008客户端应用程序 400

15.4.5 构建C#客户端应用程序 401

15.4.6 使用跨语言继承 402

15.5 构建和使用多文件程序集 403

15.5.1 ufo.netmodule文件 404

15.5.2 airvehicles.dll文件 404

15.5.3 使用多文件程序集 405

15.6 私有程序集 406

15.6.1 私有程序集的身份 406

15.6.2 探查过程 406

15.6.3 配置私有程序集 407

15.6.4 配置文件和Visual Studio 2008 409

15.6.5 .NET Framework配置实用程序 409

15.7 共享程序集 411

15.7.1 强名 411

15.7.2 使用sn.exe强命名CarLibrary.dll 413

15.7.3 使用Visual Studio 2008分配强名 414

15.7.4 在GAC中安装/删除共享程序集 414

15.8 使用共享程序集 415

15.9 配置共享程序集 416

15.9.1 冻结当前的共享程序集 417

15.9.2 构建共享程序集版本2.0.0.0 417

15.9.3 动态重定向到共享程序集的特定版本 418

15.9.4 回顾.NET Framework配置实用程序 419

15.10 发布者策略程序集 420

15.11 〈codeBase〉元素 421

15.12 System.Configuration名称空间 423

15.13 小结 424

第16章 类型反射、后期绑定和基于属性的编程 425

16.1 类型元数据的必要性 425

16.1.1 查看EngineState枚举的(部分)元数据 426

16.1.2 查看Car类型的(部分)元数据 426

16.1.3 TypeRef 427

16.1.4 归档定义的程序集 428

16.1.5 归档引用的程序集 428

16.1.6 归档字符串文字 428

16.2 反射 429

16.2.1 System.Type类 430

16.2.2 使用System.Object.GetType()获得类型引用 430

16.2.3 使用System.Type.GetType()获得类型引用 431

16.2.4 使用GetType()获得类型引用 431

16.3 构建自定义的元数据查看程序 432

16.3.1 方法的反射 432

16.3.2 字段和属性的反射 432

16.3.3 已实现接口的反射 433

16.3.4 显示各种零碎的内容 433

16.3.5 实现Main()方法 433

16.3.6 方法参数和返回值的反射 434

16.4 动态加载程序集 435

16.5 共享程序集的反射 437

16.6 后期绑定 439

16.6.1 使用System.Activator类执行后期绑定 439

16.6.2 调用无参数的方法 440

16.6.3 调用带有参数的方法 440

16.7 属性编程 441

16.7.1 属性使用程序 441

16.7.2 在VB 2008中应用预先定义的属性 442

16.7.3 指定属性的构造函数参数 443

16.7.4 实际应用的〈Obsolete()〉属性 444

16.7.5 VB 2008属性简写符号 444

16.8 构建自定义的属性 445

16.8.1 应用自定义属性 445

16.8.2 限制属性使用 446

16.9 程序集级(和模块级)的属性 447

16.10 使用早期绑定反射属性 448

16.11 使用后期绑定反射属性 449

16.12 综合介绍反射、后期绑定和自定义属性 450

16.13 构建可扩展的应用程序 451

16.13.1 构建Common SnappableTypes.dll 451

16.13.2 构建VB 2008管理单元 452

16.13.3 构建C#管理单元 453

16.13.4 构建可扩展的Windows Forms应用程序 453

16.14 小结 455

第17章 进程、AppDomain和对象上下文 456

17.1 回顾传统的Win32进程 456

17.1.1 线程概览 457

17.1.2 在.NET平台下与进程交互 458

17.1.3 列举运行的进程 459

17.1.4 研究特定的进程 460

17.1.5 研究进程的线程集 460

17.1.6 研究进程的模块集 462

17.1.7 以编程方式启动和停止进程 462

17.2 .NET应用程序域 463

17.2.1 列举进程的AppDomain 464

17.2.2 以编程方式创建新的AppDomain 465

17.2.3 以编程方式卸载AppDomain 467

17.3 对象上下文边界 468

17.3.1 上下文敏捷和上下文绑定类型 468

17.3.2v定义上下文绑定对象 469

17.3.3 检查对象的上下文 469

17.4 总结进程、应用程序域和上下文 471

17.5 小结 471

第18章 构建多线程应用程序 472

18.1 进程/应用程序域/上下文/线程之间的关系 472

18.2 简要回顾.NET委托 474

18.3 委托的异步特性 476

18.3.1 BeginInvoke()和EndInvoke()方法 476

18.3.2 System.IAsyncResult接口 476

18.4 异步调用方法 477

18.4.1 同步调用线程 477

18.4.2 AsyncCallback委托的作用 479

18.4.3 AsyncResult类的作用 480

18.4.4 传递和接收自定义的状态数据 480

18.5 System.Threading名称空间 481

18.6 System.Threading.Thread类 482

18.6.1 获得当前线程的统计 483

18.6.2 Name属性 483

18.6.3 Priority属性 484

18.7 以编程方式创建辅助线程 484

18.7.1 使用ThreadStart委托 485

18.7.2 创建线程:速记符号 486

18.7.3 使用ParameterizedThreadStart委托 487

18.7.4 前台线程和后台线程 488

18.8 并发性问题 489

18.8.1 使用SyncLock关键字同步 491

18.8.2 使用System.Threading.Monitor类型同步化 492

18.8.3 使用System.Threading.Interlocked类型同步 493

18.8.4 使用〈Synchronization()〉属性同步 494

18.9 使用TimerCallback编程 495

18.10 CLR线程池 496

18.11 BackgroundWorker组件的作用 497

18.11.1 使用BackgroundWorker类型 498

18.11.2 使用BackgroundWorker类型处理数据 499

18.12 小结 500

第19章 .NET互操作性程序集 501

19.1 .NET互操作性的作用域 501

19.2 .NET到COM互操作性的简单示例 502

19.3 .NET互操作程序集 504

19.4 运行库可调用封装程序 506

19.4.1 RCW:将COM类型转换为.NET类型 507

19.4.2 RCW:管理COM类(coclass)的引用计数 507

19.4.3 RCW:隐藏低级的COM接口 508

19.5 COM IDL的作用 508

19.5.1 观察为VB COM服务器生成的IDL 510

19.5.2 IDL属性 510

19.5.3 IDL库语句 511

19.5.4 [default]接口的作用 511

19.5.5 IDispatch的作用 511

19.5.6 IDL形参属性 512

19.5.7 使用类型库构建互操作程序集 512

19.6 后期绑定CoCalc COM类 513

19.7 构建更有趣的VB6 COM服务器 514

19.7.1 支持额外的COM接口 515

19.7.2 提供内部对象 516

19.8 互操作程序集 517

19.8.1 构建VB 2008客户端应用程序 518

19.8.2 与CoCar类型交互 518

19.8.3 截获COM事件 520

19.9 COM到.NET互操作性 521

19.10 CCW的作用 522

19.11 .NET类接口的作用 522

19.12 构建.NET类型 523

19.12.1 使用Visual Studio 2008插入COM类 524

19.12.2 定义强名 526

19.13 生成类型库并注册.NET类型 526

19.14 导出的类型信息 527

19.15 构建VB6测试客户端 528

19.16 小结 528

第Ⅴ部分 .NET基类库 531

第20章 文件和目录操作 531

20.1 System.IO名称空间 531

20.2 Directory(Info)和File(Info)类型 532

20.3 使用DirectoryInfo类型 533

20.3.1 使用DirectoryInfo类型列举文件 534

20.3.2 使用DirectoryInfo类型创建子目录 535

20.4 使用Directory类型 536

20.5 使用DriveInfo类类型 537

20.6 使用FileInfo类 537

20.6.1 FileInfo.Create()方法 538

20.6.2 FileInfo.Open()方法 539

20.6.3 FileInfo.OpenRead()和FileInfo.OpenWrite()方法 540

20.6.4 FileInfo.OpenText()方法 540

20.6.5 FileInfo.CreateText()和FileInfo.AppendText()方法 541

20.7 使用File类型 541

20.8 抽象的Stream类 543

20.9 使用StreamWriter和StreamReader 545

20.9.1 写入文本文件 546

20.9.2 从文本文件读取 546

20.9.3 直接创建StreamWriter/StreamReader对象 547

20.10 使用StringWriter和StringReader 548

20.11 使用BinaryWriter和BinaryReader 549

20.12 以编程方式“监视”文件 551

20.13 执行异步文件I/O 552

20.14 小结 554

第21章 对象串行化 555

21.1 了解对象串行化 555

21.2 配置用于串行化的对象 557

21.3 选择串行化格式器 558

21.3.1 IFormatter和IRemotingFormatting接口 559

21.3.2 格式器之间的类型精确度 560

21.4 使用BinaryFormatter串行化对象 560

21.5 使用SoapFormatter串行化对象 562

21.6 使用XmlSerializer串行化对象 563

21.7 持久保存对象集合 565

21.8 自定义串行化过程 567

21.8.1 深入研究对象串行化 567

21.8.2 使用ISerializable自定义串行化 568

21.8.3 使用属性自定义串行化 570

21.9 小结 572

第22章 ADO.NET第1部分:连接层 573

22.1 ADO.NET的高级定义 573

22.2 ADO.NET数据提供者 574

22.2.1 Microsoft提供的ADO.NET数据提供者 576

22.2.2 获得第三方的ADO.NET数据提供者 577

22.3 额外的ADO.NET名称空间 577

22.4 System.Data名称空间的类型 578

22.4.1 IDbConnection接口的作用 579

22.4.2 IDbTransaction接口的作用 579

22.4.3 IDbCommand接口的作用 579

22.4.4 IDbDataParameter和IDataParameter接口的作用 580

22.4.5 IDbDataAdapter和IDataAdapter接口的作用 580

22.4.6 IDataReader和IDataRecord接口的作用 581

22.5 使用接口抽象化数据提供者 582

22.6 创建AutoLot数据库 585

22.6.1 创建Inventory表 585

22.6.2 创建GetPetName()存储过程 586

22.6.3 创建Customers和Orders表 587

22.6.4 可视化创建表关系 587

22.7 ADO.NET数据提供者工厂模型 588

22.7.1 已注册的数据提供者工厂 589

22.7.2 完整的数据提供者工厂模型示例 590

22.7.3 〈connectionStrings〉元素 592

22.8 ADO.NET的连接层 593

22.8.1 使用连接对象 594

22.8.2 使用ConnectionStringBuilder对象 596

22.8.3 使用命令对象 597

22.9 使用数据读取器 598

22.10 构建可重用的数据访问库 600

22.10.1 添加连接逻辑 601

22.10.2 添加插入逻辑 602

22.10.3 添加删除逻辑 602

22.10.4 添加更新逻辑 603

22.10.5 添加选择逻辑 603

22.10.6 使用参数化的命令对象 603

22.10.7 使用DbCommand执行存储过程 605

22.11 创建基于控制台UI的前端 607

22.11.1 实现Main()方法 607

22.11.2 实现ShowInstructions()和ClearConsole()方法 609

22.11.3 实现ListInventory()方法 609

22.11.4 实现DeleteCar()方法 610

22.11.5 实现InsertNewCar()方法 610

22.11.6 实现UpdateCarPetName()方法 610

22.11.7 调用存储过程 611

22.12 使用SqlCommand执行异步数据访问 611

22.13 数据库事务 613

22.13.1 ADo.NET事务对象的关键成员 614

22.13.2 向InventoryDAL添加事务方法 614

22.13.3 测试数据库事务 616

22.14 小结 617

第23章 ADO.NET第2部分:断开连接层 618

23.1 ADO.NET的断开连接层 618

23.2 DataSet的作用 619

23.2.1 DataSet的关键属性 619

23.2.2 DataSet的关键方法 620

23.2.3 构建DataSet 620

23.3 使用DataColumn 621

23.3.1 构建DataColumn 622

23.3.2 启用自动递增字段 622

23.3.3 向DataTable添加DataColumn 623

23.4 使用DataRow 623

23.4.1 RowState属性 625

23.4.2 DataRowVersion属性 626

23.5 使用DataTable 627

23.5.1 在DataSet中插入DataTable 627

23.5.2 使用DataTableReader对象处理DataTable数据 628

23.5.3 将DataTable/DataSet对象串行化为XML 629

23.5.4 以二进制格式串行化DataTable/DataSet对象 630

23.6 将DataTable对象绑定到用户界面 631

23.6.1 通过泛型List(Of T)填充DataTable 632

23.6.2 以编程方式删除行 634

23.6.3 基于筛选标准选择行 635

23.6.4 更新行 637

23.6.5 使用DataView类型 638

23.6.6 最后的UI增强:呈现行号 639

23.7 使用数据适配器填充DataSet/DataTable对象 640

23.7.1 简单的数据适配器示例 640

23.7.2 将数据库名映射为友好名称 641

23.8 重新访问AutoLotDAL.dll 642

23.8.1 定义初始的类类型 642

23.8.2 使用SqlCommandBuilder配置数据适配器 643

23.8.3 实现GetAllInventory() 644

23.8.4 实现UpdateInventory() 644

23.8.5 构建Windows Forms前端 644

23.9 定位多表的DataSet对象 646

23.9.1 准备数据适配器 646

23.9.2 构建表关系 648

23.9.3 更新数据库表 648

23.9.4 在相关表之间定位 648

23.10 Visual Studio 2008的数据访问工具 651

23.10.1 可视化设计DataGridView 651

23.10.2 app.config文件和Settings.Settings文件 653

23.10.3 研究生成的DataSet 654

23.10.4 研究生成的DataTable和DataRow 656

23.10.5 研究生成的数据适配器 656

23.10.6 在代码中使用生成的类型 657

23.11 从UI层分离自动生成的代码 659

23.12 小结 661

第24章 使用LINQAPI编程 662

24.1 LINQ to ADO.NET的作用 662

24.2 使用LINQ to DataSet编程 663

24.2.1 DataSet扩展的作用 664

24.2.2 获得LINQ兼容的DataTable 664

24.2.3 EnumerableRowCollection的隐式接口 666

24.2.4 DataRowExtensions.Field(Of T)()扩展方法的作用 666

24.2.5 通过LINQ查询填充新的DataTable 667

24.3 使用LINQ to SQL编程 668

24.3.1 实体类的作用 668

24.3.2 DataContext类型的作用 668

24.3.3 简单的LINQ to SQL示例 669

24.3.4 构建强类型的DataContext 670

24.3.5 详细介绍〈Table()〉和〈Column()〉属性 671

24.4 使用sqlmetal.exe生成实体类 672

24.4.1 研究生成的实体类 673

24.4.2 使用实体类定义关系 674

24.4.3 强类型的DataContext 675

24.4.4 针对生成的类型编程 676

24.5 使用Visual Studio 2008构建实体类 677

24.5.1 插入新项 678

24.5.2 更新已有的项 679

24.5.3 删除已有的项 679

24.6 使用LINQ to XML编程 680

24.6.1 作为更好的DOM的LINQ to XML 680

24.6.2 System.Xml.XLinq名称空间 680

24.7 Visual Basic 2008的集成XML支持 681

24.7.1 在String数据类型中存储XML字面值 682

24.7.2 在XML字面值中混合编程构造 682

24.8 以编程方式创建XML元素 683

24.9 以编程方式创建XML文档 684

24.10 通过LINQ查询生成文档 686

24.11 加载和解析XML内容 687

24.12 定位内存中的XML文档 688

24.12.1 修改XML文档中的数据 689

24.12.2 XML轴属性的作用 690

24.13 小结 692

第25章 Windows通信基础 693

25.1 综合介绍分布式计算API 693

25.1.1 DCOM的作用 694

25.1.2 COM+/Enterprise Service的作用 694

25.1.3 MSMQ的作用 695

25.1.4 .NET Remoting的作用 695

25.1.5 XML Web服务的作用 696

25.1.6 命名管道、套接字和P2P 698

25.2 WCF的作用 699

25.2.1 WCF特性概述 699

25.2.2 面向服务体系结构概述 700

25.2.3 WCF概要 700

25.3 研究核心WCF程序集 701

25.4 Visual Studio WCF项目模板 702

25.5 WCF应用程序的基本组成部分 703

25.6 WCF的ABC 704

25.6.1 理解WCF契约 705

25.6.2 理解WCF绑定 705

25.6.3 理解WCF地址 708

25.7 构建WCF服务 709

25.7.1 〈ServiceContract()〉属性 710

25.7.2 〈OperationContract()〉属性 711

25.7.3 作为可操作契约的服务类型 711

25.8 驻留WCF服务 712

25.8.1 在App.config文件中建立ABC 712

25.8.2 针对ServiceHost类型编码 713

25.8.3 主机编码选项 714

25.8.4 ServiceHost类型的细节 715

25.8.5 〈system.serviceModel〉元素的细节 716

25.8.6 启用元数据交换 717

25.9 构建WCF客户应用程序 719

25.9.1 使用svcutil.exe生成代理代码 719

25.9.2 使用Visual Studio 2008生成代理代码 720

25.10 使用WCF Service Library项目模板 721

25.10.1 构建简单的数学服务 721

25.10.2 使用WcfTestClient.exe测试WCF服务 722

25.10.3 使用SvcConfigEditor.exe修改配置文件 722

25.11 作为Windows服务驻留WCF服务 723

25.11.1 在代码中指定ABC 724

25.11.2 启用MEX 725

25.11.3 创建Windows服务安装程序 726

25.11.4 安装Windows服务 726

25.12 异步调用服务 727

25.13 设计WCF数据契约 729

25.13.1 使用以Web为中心的WCF Service项目模板 729

25.13.2 实现服务契约 731

25.13.3 *.svc文件的作用 732

25.13.4 更新web.config文件 732

25.13.5 测试服务 733

25.14 小结 734

第26章 Windows工作流基础 735

26.1 定义业务过程 735

26.2 WF的构件 736

26.2.1 WF运行时引擎 737

26.2.2 WF的核心服务 737

26.2.3 WF活动简介 738

26.2.4 顺序和状态机工作流 739

26.3 WF的程序集、名称空间和项目 741

26.3.1 .NET 3.5 WF支持 741

26.3.2 Visual Studio工作流项目模板 741

26.3.3 深入了解工作流的流程 742

26.4 构建允许工作流的简单应用程序 742

26.4.1 研究初始的工作流代码 743

26.4.2 添加Code活动 743

26.4.3 添加While活动 744

26.5 研究WF引擎宿主代码 746

26.6 在工作流中调用Web服务 749

26.6.1 创建MathWebService 750

26.6.2 构建WF Web服务使用者 751

26.6.3 配置IfElse活动 753

26.6.4 配置InvokeWebService活动 755

26.6.5 与WCF服务通信 757

26.7 构建可重用的WF代码库 760

26.7.1 执行信用检查 761

26.7.2 创建Windows Forms客户应用程序 763

26.8 自定义活动概述 765

26.9 小结 766

第Ⅵ部分 使用Windows Forms创建桌面应用程序第27章 Windows Forms 769

27.1 System.Windows.Forms名称空间概述 769

27.2 使用Windows Forms类型 771

27.2.1 手动创建主窗口 771

27.2.2 遵守关注点分离 772

27.3 Application类的功能 773

27.3.1 使用Application类 773

27.3.2 System.EventHandler委托 774

27.4 窗体分析 775

27.5 Control类的功能 776

27.5.1 使用Control类 778

27.5.2 响应MouseMove事件 779

27.5.3 确定单击的鼠标键 780

27.5.4 响应键盘事件 780

27.6 Form类的功能 781

27.7 用Visual Studio 2008构建Windows应用程序 784

27.7.1 剖析Visual Studio 2008的Windows Forms项目 785

27.7.2 在设计时实现事件 787

27.7.3 StartUp Object/Main() Sub区别 788

27.8 使用MenuStrip和ContextMenuStrip 789

27.8.1 给MenuStrip添加文本框 790

27.8.2 创建上下文菜单 791

27.8.3 选中菜单项 793

27.9 使用StatusStrip 795

27.9.1 设计菜单系统 796

27.9.2 设计StatusStrip 797

27.9.3 使用Timer类型 798

27.9.4 触发显示 799

27.9.5 显示菜单选择提示 800

27.9.6 构建“就绪”状态 800

27.10 使用ToolStrip 801

27.11 构建MDI应用程序 804

27.11.1 构建父窗体 805

27.11.2 构建子窗体 806

27.11.3 产生子窗口 806

27.12 小结 807

第28 章使用GDI+呈现图形数据 808

28.1 GDI+名称空间概述 808

28.2 System.Drawing名称空间概述 809

28.3 System.Drawing的实用程序类型 810

28.3.1 Point和PointF类型 810

28.3.2 Rectangle和RectangleF类型 811

28.3.3 Region、Size和SizeF类 811

28.4 理解Graphics类 812

28.5 理解Paint会话 813

28.5.1 使窗体的客户区失效 814

28.5.2 在Paint事件处理程序之外获取Graphics对象 815

28.5.3 关于Graphics对象的处理 816

28.6 GDI+坐标系统 817

28.6.1 默认的量度单位 818

28.6.2 指定替代的量度单位 818

28.6.3 指定替代的圆点 819

28.7 定义颜色值 821

28.8 操作字体 822

28.8.1 使用字体家族 823

28.8.2 使用字体和字体大小 824

28.8.3 列举安装的字体 826

28.8.4 FontDialog类 828

28.9 System.Drawing.Drawing2D名称空间概述 829

28.10 使用Pen 829

28.11 使用Brush 833

28.11.1 使用HatchBrush 834

28.11.2 使用TextureBrush 835

28.11.3 使用LinearGradientBrush 836

28.12 呈现图像 837

28.13 PictureBox控件的拖动和命中测试 839

28.13.1 呈现图像的命中测试 841

28.13.2 非矩形图像的命中测试 843

28.14 理解Windows Forms资源格式 845

28.14.1 System.Resources名称空间 846

28.14.2 以编程的方式创建*.resx文件 846

28.14.3 构建*.resources文件 847

28.14.4 将*.resources文件绑定到.NET程序集中 848

28.14.5 使用ResourceWriters 848

28.14.6 使用Visual Studio 2008生成资源 849

28.14.7 以编程的方式读取资源 850

28.15 小结 851

第29章 使用Windows Forms控件编程 852

29.1 Windows Forms控件概述 852

29.2 手动给窗体添加控件 852

29.3 使用Visual Studio 2008添加控件到窗体 855

29.4 使用基础控件 856

29.4.1 使用Label 856

29.4.2 使用TextBox 857

29.4.3 使用MaskedTextBox 859

29.4.4 使用Button 860

29.4.5 使用CheckBox、RadioButton和GroupBox 862

29.4.6 使用CheckedListBox 865

29.4.7 使用ListBox 866

29.4.8 使用ComboBox 867

29.5 配置制表符顺序 868

29.6 设置窗体的默认输入按钮 869

29.7 使用较为特殊的控件 869

29.7.1 使用MonthCalendar 869

29.7.2 使用ToolTip 871

29.7.3 使用TabControl 872

29.7.4 使用TrackBar 873

29.7.5 使用Panel 875

29.7.6 使用UpDown控件 876

29.7.7 使用ErrorProvider 878

29.7.8 使用TreeView 880

29.7.9 使用WebBrowser 884

29.8 构建自定义Windows Forms控件 885

29.8.1 创建图像 886

29.8.2 构建设计时GUI 886

29.8.3 实现核心CarControl 886

29.8.4 定义自定义事件 888

29.8.5 定义自定义特性 888

29.8.6 控制动画 889

29.8.7 呈现昵称 889

29.9 测试CarControl类型 890

29.10 构建自定义CarControl主窗体 890

29.11 System.ComponentModel名称空间的功能 892

29.11.1 增强CarControl的设计时显示 892

29.11.2 定义默认特性和默认事件 893

29.11.3 指定自定义工具箱位图 894

29.12 构建自定义对话框 895

29.12.1 DialogResult特性 896

29.12.2 理解窗体继承 897

29.13 动态定位Windows Forms控件 899

29.13.1 Anchor特性 899

29.13.2 Dock特性 900

29.13.3 表和流程布局 901

29.14 小结 902

第Ⅶ部分 使用WPF创建桌面应用程序 905

第30章 WPF和XAML 905

30.1 WPF的动机 905

30.1.1 统一不同的API 906

30.1.2 通过XAML提供关注点分离 906

30.1.3 提供最佳渲染模型 907

30.1.4 其他以WPF为中心的特殊性能 907

30.2 各种类型的WPF应用程序 908

30.2.1 传统桌面应用程序 908

30.2.2 基于导航的WPF应用程序 908

30.2.3 XBAP应用程序 909

30.2.4 Silverlight应用程序 910

30.3 研究WPF程序集 910

30.3.1 Application类的功能 911

30.3.2 Window类的功能 912

30.4 构建(XAML-Free)WPF应用程序 916

30.4.1 扩展Window类的类型 918

30.4.2 创建一个简单的用户界面 919

30.5 Application类型的其他细节 920

30.5.1 应用程序范围数据和处理命令行实参 920

30.5.2 Application的Windows集合的迭代 921

30.5.3 Application类型的其他事件 921

30.6 Window类型的其他细节 922

30.6.1 Window对象的生存期 922

30.6.2 处理Window对象的关闭 923

30.6.3 处理窗口级的鼠标事件 924

30.6.4 处理窗口级的键盘事件 925

30.6.5 构建(以XAML为中心)WPF应用程序 925

30.6.6 在XAML中定义MainWindow 926

30.6.7 在XAML中定义Application对象 927

30.6.8 通过msbuild.exe处理XAML文件 928

30.7 将标记转换成.NET程序集 930

30.7.1 映射XAML到VB代码 930

30.7.2 BAML的功能 931

30.7.3 针对程序集的XAML处理小结 932

30.8 使用代码分离文件的关注点分离 933

30.9 XAML的语法 935

30.9.1 XAML名称空间和XAML关键字 935

30.9.2 XAML元素和XAML属性 937

30.9.3 理解XAML属性元素语法 938

30.9.4 理解XAML附加特性 940

30.9.5 理解XAML类型转换器 941

30.9.6 理解XAML标记扩展 941

30.9.7 资源和数据绑定预览 943

30.10 使用Visual Studio 2008构建WPF应用程序 945

30.10.1 WPF项目模板 945

30.10.2 改变初始窗口的名称 945

30.10.3 WPF设计器 946

30.11 在运行库中处理XAML:SimpleXamlPad.exe 948

30.11.1 实现Loaded事件 949

30.11.2 实现Button的Click事件 950

30.11.3 实现Closed事件 951

30.11.4 测试应用程序 951

30.12 Microsoft Expression Blend的功能 952

30.13 小结 953

第31章 使用WPF控件编程 954

31.1 WPF控件库概述 954

31.1.1 WPF控件和Visual Studio 2008 955

31.1.2 文档中的细节 955

31.2 在XAML中声明控件 956

31.3 理解依赖属性的功能 958

31.3.1 研究现有的依赖属性 959

31.3.2 注册依赖属性 960

31.3.3 为DependencyProperty字段定义封装器特性 961

31.4 理解路由事件 962

31.4.1 路由冒泡事件的功能 963

31.4.2 继续或者停止冒泡 964

31.4.3 路由隧道事件的功能 964

31.5 使用Button类型 966

31.5.1 ButtonBase类型 966

31.5.2 Button类型 967

31.5.3 ToggleButton类型 967

31.5.4 RepeatButton类型 968

31.6 使用CheckBoxes和RadioButtons 969

31.6.1 建立逻辑群 970

31.6.2 构架GroupBox中的相关元素 971

31.6.3 构架Expander中的相关元素 971

31.7 使用ListBox和ComboBox类型 972

31.7.1 以编程的方式填充List控件 973

31.7.2 添加专用内容 974

31.7.3 确定当前选择 975

31.7.4 确定内嵌内容的当前选择 976

31.8 使用文本区域 977

31.8.1 使用TextBox类型 977

31.8.2 使用PasswordBox类型 978

31.9 使用窗格控制内容布局 979

31.9.1 WPF的核心窗格类型 980

31.9.2 在Canvas窗格内定位内容 981

31.9.3 在WrapPanel窗格内定位内容 983

31.9.4 在StackPanel窗格内定位内容 984

31.9.5 在Grid窗格内定位内容 985

31.9.6 在DockPanel窗格内定位内容 987

31.9.7 启用Panel类型的滚动行为 987

31.10 使用内嵌窗格构建窗口的构架 988

31.10.1 构建菜单系统 989

31.10.2 构建工具栏 990

31.10.3 构建状态条 991

31.10.4 结束UI设计 991

31.10.5 结束实现 992

31.11 理解WPF控件命令 993

31.11.1 内部控件命令对象 993

31.11.2 连接命令到命令特性 994

31.11.3 连接命令到专用UI元素 995

31.12 理解WPF数据绑定模型 996

31.12.1 初观数据绑定 997

31.12.2 DataContext特性 998

31.12.3 Mode特性 998

31.13 使用IValueConverter的数据转换 999

31.14 绑定自定义对象 1001

31.14.1 使用Observable Collection(Of T)类型 1003

31.14.2 创建自定义数据模板 1004

31.15 绑定UI元素到XML文档 1005

31.15.1 构建自定义对话框 1006

31.15.2 分配DialogResult值 1007

31.15.3 获得当前选择 1008

31.15.4 显示自定义对话框 1008

31.16 小结 1009

第32章 WPF二维图形渲染、资源和主题 1010

32.1 WPF图形渲染服务哲学 1010

32.1.1 WPF图形渲染选项 1011

32.1.2 选择合适的方法 1016

32.2 探索Shape派生类型 1016

32.3 使用WPF画笔 1019

32.3.1 用单色构建画笔 1019

32.3.2 使用渐变画笔 1020

32.3.3 ImageBrush类型 1021

32.4 使用WPF笔 1021

32.5 探索Drawing派生类型 1022

32.5.1 几何类型的功能 1022

32.5.2 剖析简单的绘制几何 1023

32.5.3 DrawingImage包含的Drawing类型 1024

32.5.4 DrawingBrush中包含的Drawing类型 1024

32.5.5 更加复杂的Drawing几何 1025

32.6 UI转换的功能 1026

32.6.1 Transform派生类型 1026

32.6.2 应用转换 1027

32.7 理解WPF的动画服务 1028

32.7.1 Animation后缀类型的功能 1028

32.7.2 Timeline基类的功能 1029

32.7.3 在VB代码中编写动画 1029

32.7.4 控制动画的调步 1031

32.7.5 反向和循环动画 1031

32.7.6 在XAML中编写动画 1032

32.7.7 Animation关键帧的功能 1033

32.8 理解WPF资源系统 1036

32.8.1 使用二进制资源 1036

32.8.2 对象(又称为逻辑)资源的功能 1037

32.9 为WPF控件定义并应用样式 1037

32.9.1 使用内联样式 1038

32.9.2 使用命名样式 1039

32.9.3 重写样式设置 1040

32.9.4 使现有样式成为子类 1040

32.9.5 扩展样式 1041

32.9.6 收缩样式 1042

32.9.7 隐式地分配样式 1042

32.9.8 用触发器定义样式 1042

32.9.9 以编程的方式分配样式 1044

32.10 使用模板更改控件的UI 1045

32.10.1 构建自定义模板 1046

32.10.2 添加触发器到模板 1047

32.10.3 合并模板到样式中 1048

32.11 小结 1050

第Ⅷ部分 用ASP.NET构建Web应用程序第33章 构建ASP.NET Web页面 1053

33.1 HTTP的功能 1053

33.1.1 HTTP请求/响应循环 1053

33.1.2 HTTP是一种无状态协议 1054

33.2 理解Web应用程序和Web服务器 1054

33.2.1 IIS虚拟目录的功能 1055

33.2.2 ASP.NET开发服务器 1056

33.3 HTTP的功能 1057

33.3.1 HTML文档结构 1057

33.3.2 HTML窗体开发 1058

33.3.3 构建基于HTML的用户界面 1059

33.4 客户端脚本的功能 1061

33.4.1 客户端脚本示例 1062

33.4.2 验证default.htm窗体数据 1062

33.5 提交窗体数据(获取和提交) 1063

33.6 构建传统ASP页面 1063

33.7 传统ASP的问题 1065

33.7.1 ASP.NET 1.x的主要优点 1065

33.7.2 ASP.NET 2.0的主要改进 1066

33.7.3 主要的ASP.NET 3.5 Web的改进 1066

33.8 ASP.NET名称空间 1066

33.9 ASP.NET Web页面代码模型 1067

33.9.1 构建以数据为中心的单文件测试页面 1068

33.9.2 使用代码分离页面模型 1073

33.10 ASP.NET网站目录结构细节 1076

33.10.1 引用程序集 1076

33.10.2 App_Code文件夹的功能 1077

33.11 ASP.NET页面编译周期 1077

33.11.1 单文件页面的编译周期 1078

33.11.2 多文件页面的编译周期 1078

33.12 页面类型的继承链 1080

33.13 与入站HTTP请求进行互操作 1081

33.13.1 获得浏览器统计数据 1082

33.13.2 访问引入的窗体数据 1082

33.13.3 IsPostBack特性 1083

33.14 与出站HTTP响应进行互操作 1084

33.14.1 发送HTML内容 1084

33.14.2 重定向用户 1085

33.15 ASP.NET Web页面的生命周期 1085

33.15.1 AutoEventWireup属性的功能 1087

33.15.2 Error事件 1088

33.16 web.config文件的功能 1089

33.17 小结 1091

第34章 ASP.NET Web控件、主题和Master页面 1092

34.1 理解Web控件的实质 1092

34.1.1 限定服务器端的事件处理 1093

34.1.2 AutoPostBack特性 1093

34.1.3 System.Web.UI.Control类型 1094

34.1.4 枚举已包含的控件 1095

34.1.5 动态添加(或者移除)控件 1096

34.2 System.Web.UI.WebControls.WebControl类型的关键成员 1097

34.3 ASP.NET Web控件的类别 1098

34.4 构建ASP.NET网站 1099

34.4.1 使用Master页面 1100

34.4.2 定义Default.aspx内容页面 1105

34.4.3 设计目录内容页面 1106

34.4.4 设计Build-a-Car内容页面 1110

34.5 验证控件的功能 1111

34.5.1 RequiredFieldValidator 1113

34.5.2 RegularExpressionValidator 1113

34.5.3 RangeValidator 1114

34.5.4 CompareValidator 1114

34.5.5 创建验证小结 1115

34.6 使用主题 1115

34.6.1 理解*.skin文件 1116

34.6.2 应用站点范围的主题 1117

34.6.3 在页面级应用主题 1118

34.6.4 SkinID特性 1118

34.6.5 以编程的方式分配主题 1119

34.7 小结 1120

第35章 ASP.NET状态管理技术 1122

35.1 发布状态 1122

35.2 ASP.NET状态管理技术 1124

35.3 理解ASP.NET查看状态的功能 1124

35.3.1 示范查看状态 1125

35.3.2 添加自定义查看状态数据 1126

35.3.3 关于控件状态的简述 1127

35.4 Global.asax文件的功能 1127

35.4.1 全局最后机会异常事件处理程序 1129

35.4.2 HttpApplication基类 1129

35.5 理解应用程序/会话的区别 1130

35.5.1 维护应用程序级状态数据 1130

35.5.2 修改应用程序数据 1133

35.5.3 处理Web应用程序的关闭 1133

35.6 使用应用程序缓存 1134

35.6.1 使用数据缓存 1134

35.6.2 修改*.aspx文件 1137

35.7 维护会话数据 1138

35.7.1 其他HttpSessionState成员 1140

35.7.2 理解Cookie 1141

35.7.3 创建Cookie 1142

35.7.4 读取引入的Cookie数据 1143

35.8 〈sessionState〉元素的功能 1144

35.8.1 在ASP.NET会话状态服务器上存储会话数据 1144

35.8.2 在专用数据库中存储会话数据 1145

35.9 理解ASP.NET配置文件API 1146

35.9.1 ASPNETDB数据库 1146

35.9.2 在web.config中定义用户配置文件 1147

35.9.3 以编程的方式访问配置文件数据 1148

35.9.4 分组配置文件数据并保留自定义对象 1151

35.10 小结 1152