第一部分 2
第1章 体验软件开发新思维 2
1.1 从一个实例开始 3
1.2 数据库表结构设计 4
1.3 采用传统软件开发模式构建 8
1.3.1 构建数据源 8
1.3.2 构建程序界面 11
1.3.3 修改绑定源 14
1.3.4 修改SQL语句和数据集 15
1.3.5 编写程序 16
1.3.6 体验开发成果 20
1.4 采用软件开发新模式构建 20
1.4.1 构建数据集 21
1.4.2 体验XML组件即插即用 24
1.4.3 建立SQL的绑定 28
1.4.4 建立数据的绑定 29
1.4.5 事件挂接处理 32
1.4.6 体验新模式成果 34
1.5 软件开发新模式的优势 34
1.6 小结 35
第2章 XML组件即插即用的机理 36
2.1 概述 37
2.2 .NET组件 39
2.2.1 什么是组件 39
2.2.2 属性 40
2.2.3 事件 43
2.2.4 数据绑定 46
2.3 XML组件即插即用 48
2.3.1 什么是XML组件 48
2.3.2 组件属性的XML表示 49
2.3.3 组件事件的XML表示 54
2.3.4 如何实现即插即用 54
2.4 组件标签定义文件 56
2.5 表达式文法 62
2.6 属性处理机制 63
2.6.1 属性基本值 64
2.6.2 属性默认值 64
2.6.3 动态属性值 64
2.7 事件处理机制 66
2.7.1 签名事件处理 66
2.7.2 非签名事件处理 67
2.8 数据模型 68
2.8.1 数据集和数据存取定义 68
2.8.2 数据绑定模型和XML表示 70
2.9 数据模型 74
2.9.1 数据存取机制 75
2.9.2 解析表达式和Where绑定 80
2.10 加载Form.d1l 83
2.11 小结 84
第3章 构建.NET窗体设计器最佳实践 85
3.1 .NET设计时概述 86
3.1.1 服务和容器 87
3.1.2 设计器宿主 89
3.1.3 设计器图面 89
3.1.4 设计器加载器 90
3.2 构建设计器图面 91
3.3 设计器宿主编程 96
3.4 设计器加载器设计 96
3.4.1 读取XML文件 100
3.4.2 写XML文件 107
3.5 设计时服务设计最佳实践 113
3.5.1 选择服务处理 113
3.5.2 组件改变服务处理 114
3.5.3 命名创建服务处理 114
3.5.4 菜单命令服务处理 118
3.5.5 工具箱服务处理 122
3.5.6 事件绑定服务处理 124
3.5.7 属性窗口服务处理 126
3.6 Undo引擎控制最佳实践 128
3.7 设计器复制/粘贴编程实践 130
3.8 设计器快捷键设计 133
3.9 源代码生成最佳实践 136
3.9.1 代码对象模型 136
3.9.2 数据集源代码生成 143
3.9.3 数据表和数据列源代码生成 152
3.9.4 SQL源代码生成 153
3.9.5 属性默认值和动态属性值的代码生成 154
3.9.6 快捷键源代码生成 155
3.9.7 事件源代码生成 157
3.9.8 数据绑定源代码生成 158
3.10 编译源代码最佳实践 159
3.11 小结 161
第4章 打印报表设计器基础 162
4.1 概述 163
4.2 打印设计元素 164
4.2.1 标签元素 164
4.2.2 检查框元素 169
4.2.3 线段元素 172
4.2.4 矩形元素 173
4.2.5 图形元素 175
4.2.6 网络元素 177
4.3 数据绑定 179
4.3.1 标签元素和检查框元素的数据绑定 182
4.3.2 网格元素的数据绑定 182
4.4 设计元素内存结构 182
4.4.1 打印标签描述文件 182
4.4.2 打印设计元素标签结构 185
4.5 小结 190
第5章 打印报表设计器最佳实践 191
5.1 图形系统概述 192
5.2 系统初始化 194
5.3 读/写XML 200
5.3.1 基本属性格式 201
5.3.2 图形格式 202
5.3.3 数据绑定格式 202
5.4 属性 204
5.4.1 属性默认值 204
5.4.2 动态属性 205
5.5 打印方式 205
5.5.1 分页打印 206
5.5.2 卡片式打印 207
5.5.3 客户自定义打印 210
5.6 打印标记类 211
5.7 转换标签并输出到打印机 214
5.7.1 标签元素的转换 216
5.7.2 检查框元素的转换 219
5.7.3 线段元素的转换 221
5.7.4 矩形元素的转换 222
5.7.5 图形元素的转换 223
5.7.6 网络元素的转换 223
5.8 页面设置 224
5.9 打印设置 225
5.10 打印方法调用 227
5.11 小结 229
第二部分 231
第6章 新思维之商务管理系统体系结构 231
6.1 商务管理系统的设计目标 232
6.2 商务管理系统的组成 233
6.3 客户端应用程序的基本概念 233
6.4 商务管理系统架构 235
6.5 服务程序 237
6.6 服务器程序 240
6.6.1 服务器程序启动流程 240
6.6.2 服务器配置 242
6.7 客户端程序 242
6.7.1 客户端程序启动流程 243
6.7.2 心跳信号 244
6.7.3 客户端配置 245
6.7.4 程序模块 246
6.8 小结 248
第7章 像搭积木一样搭建软件最佳实践 249
7.1 商务管理系统主界面 250
7.2 构建档案 251
7.2.1 建立数据集 251
7.2.2 设计档案窗体 252
7.2.3 运行客户档案 259
7.2.4 设计档案打印报表 259
7.3 构建查询 261
7.3.1 建立数据集 261
7.3.2 设计查询 263
7.3.3 设计查询打印报表 267
7.4 小结 269
第8章 新思维下的数据存取 270
8.1 数据存取机制概述 271
8.2 数据存取代理 271
8.3 DataAccess类 272
8.4 User类 275
8.5 小结 275
第9章 数据转换与生成最佳实践 276
9.1 概述 277
9.2 转换与生成源和目的 277
9.3 转换控制 281
9.4 小结 282
第10章 远程数据交换最佳实践 283
10.1 远程数据交换原理 284
10.2 数据导出实践 285
10.3 数据导入实践 287
10.4 小结 296
第11章 数据备份与恢复 297
11.1 数据的备份与恢复概述 298
11.1.1 连接 299
11.1.2 默认的Windows认证连接 301
11.1.3 SQL Server登录 301
11.1.4 仿冒其他Windows身份 302
11.1.5 作业和日程 302
11.2 数据备份 303
11.2.1 手工完全备份 305
11.2.2 自动完全备份 306
11.3 数据恢复 308
11.4 小结 310
第12章 业务逻辑设计最佳实践 311
12.1 进货业务逻辑设计 312
12.2 付款业务逻辑设计 314
12.3 出货业务逻辑设计 315
12.4 收款业务逻辑设计 318
12.5 小结 319
第13章 自扩展商务管理系统 320
13.1 在原有业务基础上扩展 321
13.1.1 改变数据库结构 321
13.1.2 调整数据集结构 322
13.1.3 调整界面与打印格式 322
13.2 增加新业务 324
13.3 小结 324
第14章 Web客户端程序设计基础 325
14.1 Web客户端程序基础 326
14.2 WebForm的基类XmlPage 327
14.3 Web客户端程序数据模型 329
14.3.1 数据集及数据存取定义 329
14.3.2 WebForm的数据绑定 330
14.3.3 数据更新机制 336
14.4 Web客户端程序数据模型 337
14.5 虚拟目录与配置 337
14.6 小结 339
第15章 构建Web页最佳实践 340
15.1 实现一个编辑型的Web页基类 341
15.2 创建Web项目 341
15.3 定义数据集 343
15.4 创建Web页 343
15.5 建立数据绑定 346
15.6 建立事件绑定与数据更新 347
15.7 建立SQL绑定 349
15.8 Web用户及注册 350
15.9 查看运行结果 352
15.10 小结 356
第三部分 358
附录A 组件描述语言(Component Markup Language,CML) 358
A.1 根标签 359
A.2 属性 359
A.2.1 颜色属性值表示法 360
A.2.2 位置属性值表示法 360
A.2.3 尺寸属性值表示法 360
A.2.4 枚举属性值表示法 361
A.2.5 列表框(ListBox)和下拉列表框(ComboBox)Items属性值表示法 361
A.2.6 PictureBox的Image属性值表示法 361
A.2.7 事例对象属性值表示法 361
A.3 数据绑定 362
A.3.1 简单控件数据绑定 363
A.3.2 ComboBox、ListBox数据绑定 363
A.3.3 复杂控件数据绑定 364
A.4 表达式文法 366
A.5 属性默认值($)和动态属性(=) 368
A.5.1 属性默认值($) 368
A.5.2 动态属性(=) 368
A.6 事件 369
A.6.1 签名事件方法 369
A.6.2 非签名事件方法 370
A.7 存取组件对象及属性 371
A.7.1 读取组件属性 371
A.7.2 设置组件属性 371
A.8 挂接自定义方法 372
A.9 系统对象 372
A.9.1 Me 372
A.9.2 Me.属性名 373
A.9.3 !组件名 373
A.9.4 !组件名.属性 374
A.9.5 Parent 374
A.9.6 Parent.属性名 374
A.9.7 Parent!组件名 374
A.9.8 Parent!组件名.属性名 374
A.9.9 Forms["SheetName"] 374
A.9.10 Forms["SheetName"]!组件名 375
A.9.11 Forms["SheetName"].属性名 375
A.9.12 Forms["SheetName"]!组件名.属性名 375
A.9.13 DataSet(数据集) 375
A.9.14 Count(主表记录数) 377
A.9.15 Cols["ColumnName"](主表列) 377
A.9.16 Parent.DataSet(父Form数据集) 377
A.9.17 Parent.Count(父Form主表记录数) 378
A.9.18 Parent.Cols["ColumnName"](父Form主表列) 378
A.9.19 Forms["SheetName"].DataSet 378
A.9.20 Forms["SheetName"].Count 378
A.9.21 Forms["SheetName"].Cols["ColumnName"] 378
A.9.22 [列号] 378
A.9.23 [列号].属性名 379
A.9.24 [列号]!控件ID 379
A.9.25 [列号]!控件ID.属性名 379
A.10 数据表(DataTable) 379
A.10.1 Name属性 380
A.10.2 IsMainTable属性 382
A.10.3 SQL属性和Where绑定表达式 383
A.10.4 Load属性 384
A.10.5 Local属性 384
A.10.6 From属性 385
A.10.7 SQLDebug属性 385
A.11 数据列(DataColumn) 385
A.11.1 ColumnName属性 386
A.11.2 Caption属性 386
A.11.3 DefaultValue属性 387
A.11.4 Expression属性 388
A.11.5 Update属性 388
A.12 数据视(DataView) 389
A.13 快捷键 390
附录B 基类XmlForm的属性和方法 395
B.1 属性 396
B.1.1 public Junxian.AbstractDataAccess.DataAccess DA{get;set} 396
B.1.2 public DataSet DataSet{get;set} 396
B.1.3 public string MainTableName{get;set} 396
B.1.4 public Junxian.XmlForm.XmForm ParentSheet{get;set} 396
B.1.5 public string CurrentTable{get;set} 396
B.1.6 public string Shortcut{get;set} 396
B.2 方法 397
B.2.1 public virtual void Save(bool bQuestion) 397
B.2.2 public bool SaveDataToXml(string FileName) 397
B.2.3 public void Requery(string TableName) 397
B.2.4 public void RequeryTable(string TableName,bool IsClear) 398
B.2.5 public void RefreshDataView(string TableName) 398
B.2.6 public void GetDataView(string TableName) 399
B.2.7 public void Position_Changed(object sender,System.EventAgrs e) 399
B.2.8 public void PositionChanged() 399
附录C 《俊先管理软件开发平台》的文件 401
附录D 《商务新星.NET》对数据库表结构的限制 402
附录E Web页面基类XmlPage的属性和方法 403
E.1 属性 403
E.1.1 public DataSet DataSet{get;set} 403
E.1.2 public XmlPage ParentPage{get;set} 403
E.1.3 public string MainTableName{get;set} 403
E.1.4 public string PageName{get;set} 404
E.1.5 public Junxian.AbstractDataAccess.DataAccess DA{get;set} 404
E.2 方法 404
E.2.1 public object Parse(string strExpression) 404
E.2.2 public object Binding(string TableName,string ColumnName) 404
E.2.3 public void SaveData() 405
E.2.4 public void UpdateData(string TableName) 405
E.2.5 public void DeleteTableRecord(string TableName,object KeyValue) 405
E.2.6 public void RequeryTable(string TableName,bool IsClear) 405
E.2.7 public virtual void Requery(string TableName) 405
E.2.8 public void RefreshDataView(string TableName) 406
E.2.9 public void GotoPage(string PageName) 406
E.2.10 public void AddChildItem(string ChildTableName) 406
主要参考文献 407