标题：面向对象项目开发经验大成:基于.NET实现
图书信息
作　者：牛树长  杨海波 俞丹琛  黄智洪 著 
出 版 社： 电子工业出版社
出版时间： 2009-4-1
页　数：892页
开　本： 16开
I S B N ： 9787121083983
分类： 图书 >> 计算机/程序设计 >> 面向对象
定价：￥98.00元
宣传语
从简单的对象封装开始，逐步到快速开发的平台。
适用人群
本书能快速提升技术资本价值，特别适合于编程、需求、架构、项目管理等从业人员借鉴，也可为企业的技术积累提供参考性方案。
序
推进工业化与信息化的融合，需要工业领域和信息领域的工作者共同创新，离不开每个行业、每个企业中专职人员的探索与实践，所谓的成果就是这些精英在解决具体问题时所迸发出的智慧之光。《“面向对象”项目开发经验大成：基于.NET实现》一书则是中核集团核工业计算机应用研究所的专家们的智慧，是长期科研、实践中积累的开发思想、实践经验及失败教训的总结与升华出来。
中国核工业集团公司秉承集团化、专业化的运作理念，积极推进科研院、所的成果迅速转化成主导产业的生产力，是集团公司持续发展的重要策略之一。核工业计算机应用研究所是集团中唯一的信息化产业单位，为了有效实现各企业的应用系统研发，构建“构件化软件开发平台”则是我们科研的重点课题。经过几年的潜心努力，我们取得了一些卓有成效的成果，现出版的《“面向对象”项目开发经验大成：基于.NET实现》则是该成果中的一部分。
面对全国核工业迅速发展的形势，中核集团核工业计算机应用研究所在引进国外先进、成熟的信息技术产品的同时，针对核工业的特殊性不断地提升自己在关键技术上自主的能力。在企业应用层面如何推动信息技术应用的课题上勇于探索、大胆实践并取得了长足的进展。“构件化软件开发平台”是我们自行研制、具有自主知识产权的高效开发工具，特别便于迅速搭建符合于企业自身特点的信息管理系统。通过该平台所开发的各应用项目，能够与核燃料企业的生产、管理过程密切贴合，便于应用并有利于普及。该成果现已经推广到其他的能源行业，同样体现出良好的应用效果并得到用户的高度评价。该平台不仅为中核集团信息化工程、核燃料生产企业的应用提供了有力的支撑，同时也在实践的过程中得到完善与深化。
盈利是企业的宗旨。对于信息技术服务企业来说，能否实现技术复用与应用模式复用应当是实现盈利的关键所在。《“面向对象”项目开发经验大成：基于.NET实现》一书中为技术体系的建立、设计方案的有效复用、应用系统模型的有效复用的提供了思路和实现的具体方法。
读者可以本书来体会面向对象理念的具体实践，从而使软件架构设计不再神秘，面向对象不再抽象，软件开发不再是因人而异，软件工程管理不再是一团乱麻，软件明星与一般程序员在技术层面上有机融合，从而使整体团队的创造力更加协调、高效。
核工业计算机应用研究所长
肖心民 2009-2-19
前  言
本人在软件行业磨练了很多年，历经的大大小小软件项目（管理类、ERP类）不下几十个，其中自有一些酸甜苦辣的感受可以与读者交流。很多编程人员迫切希望提高应对实战的能力，但苦于市面上很难找到这方面的参考书籍，这种感慨在职业圈中普遍存在。身边同仁的热情邀请与一些善意蛊惑促成了本书的写作，说是个人体会也罢，说是经验之谈也罢，总归是十年磨一剑，香自苦寒来，目的是与大家分享一些个人的感悟而已。
读者群体
本书基于开发过程的各个环节，总结筛选了一批经常可以被“复用”的命题素材，并将其创造成极具代表性的设计样例。以此来由浅入深地诠释面向对象的设计理念是如何被应用于实践的问题。这些设计过程基本可以做到与语言无关，但本书中则是基于.NET C#实现的具体样例。
这些样例并不局限于某个项目的具体应用，而是侧重于通用、共性的特点，当把这些通用、共性的设计成分组织成一个相对完整的体系之后，就可以形成一个具有“复用”价值的开发工作环境。以这些通用设计为基础进行应用项目的开发，可以大大提高开发效率、降低对人员素质的要求，也可以在减少测试工作量的同时保证开发质量。
只要能够坚持面向对象的设计理念，做到自定义“构件”一点也不难，在你设计了一批“构件”并能形成体系的时候，自然就会发现“构件”化的设计体系也不过如此。同时也会感慨：面向对象的殿堂原来是如此壮观与辉煌。
本书涉及软件工程的各个方面：从基本规范到数据构造，从对象设计到系统框构，从项目组织到实施交付等各个层面。如果你正置身于软件行业之中，不管你在担当着哪种角色，都会或多或少地得到一些有价值的参考。
编程人员：本书系统性地介绍了一大批非常经典的“自定义类”及“公用方法”，编程人员可以从中选择一些自己感兴趣的设计样例作为突破点，通过模拟实现或直接引用来解决实战中的真实命题。因为这些样例就是针对那些实战中带有普遍性的问题而设计的，只有能够回归实战才会有实际意义。通过这个过程可以尽快达到领悟设计理念、提高技术水平、解决实战问题的多重目的。
架构设计：架构设计是项目的难点，也是质量优劣的关键。因为它是将抽象思维付诸实践的过程，经常是代码不多，但其作用会遍及整个系统。如果单纯地介绍这种存在于有形无形之间的构思会很困难，也不容易被应用于实践。本书则特别注重了架构在体系中的形成过程与作用方式，并且通过各个层面上的设计样例来描述这些基于“控件思维”的各种具体实现，其中既包括简单的控件对象，也包括各种元素的作用关系，还包括整个系统的状态控制与功能组配。在设计样例中不乏那些贯穿于系统、要求适应性、富于变化而又基于代码难以穷尽的各种命题，只有通过抽象构思、架构方案才有可能彻底解决。比如：容器类的封装、授权机制、审计机制、菜单管理、热键配置等类似的命题都是在架构设计过程中所要面对的实际命题。
开发管理：通过全面理解面向对象的开发特点，对把握规范的执行、理解设计难度、合理指派人力资源、合理安排任务的实现顺序等问题会有更明确的认识。尤其是如何避免主观理解的差异、沟通中的偏差等常见问题，这些都需要具体的措施与策略。通过对象的封装与模板的使用，可以达到简化设计任务描述、精确控制设计目标与设计过程的目的。
项目实施：设计方案的“可配置”性是一种系统化的构思，这样的设计得益于面向对象的封装，也得益于系统架构的体系完整。基于这样的构思可以在极大程度上改善实施过程对编程人员的依赖性。设计过程侧重于业务逻辑的控制，实施过程则侧重于外在的数据表现及简单的参数调整。很多需求变化完全可以通过现场的参数配置来适应用户需求的各种变化，甚至能在现场实现应用功能的“重载”。
经营决策：如何减少对自然人的依赖程度，把历史上的技术过程积淀成企业的技术积累是企业所关心的问题。只要组织得当，通过面向对象的设计过程，不但能够有效形成企业的技术积累，还能形成“应用模型”的有效积累。一旦积累形成，就能形成有效的“复用”，也会减少对自然人的过度依赖。在技术层面上对人力资源的细分，有助于降低成本与提高效率。这些经验都已纳入本书的阐述目标，并且形成了可被复用的具体模式。
工程监理：本书涉及软件工程的大部分通用性问题（而不是针对某个具体项目），从中所能得到的规律性内涵对把握软件项目的关键节点能够起到重要的作用。这些工程理念对准确理解甲方意图、准确分辨设计方案的优劣、清晰控制进度节点、敏感发现项目中的症结所在等都会有所帮助。
面向对象之领悟
“对象”以真实的事物（不是抽象概念或通俗比喻）为原型，通过封装与继承来解决事物规律（类）与真实应用（实例）中可能出现的差别，这就是把错综复杂的命题变成整体打包的“封装”过程。由于这个过程必须要强调对事物过程的归纳与抽象，所以必然会提高设计“对象”的门槛，也正是因为“类对象”存在着这样的抽象过程，所以才有可能降低应用实例的实现难度，并能具备较大的适用范围。
很多程序员对“对象”概念的理解是“雾里看花”的状态，似乎能理解，但又不知道该怎样应用。只会使用系统提供的基本“对象”，却不会（或根本就不知道）设计或封装属于自己的“自定义对象”。仅仅会使用别人提供的工具干活，只是一个劳动者，并不能成为一个名副其实的“设计”者。
客观地说，“面向对象”的设计理念听起来容易做起来难。经常见到一些自认为“精通”面向对象理念的程序员却从来没有实现过“对象”的设计与封装，此间不乏带有一些啼笑皆非的意味。如果把面向对象的理念比作一个殿堂，很多徘徊在门口的人都自以为早已身居殿堂之中，其实这是一个误解。
编程的意义并不在于通过“代码（或简单的应用系统对象）”来描述需求，更主要的是要通过符合“设计理念”的方式，将原始需求转变成能够体现“设计思想”的“对象（最贴近于事物自身特性的设计单元）”并通过这种代表着需求内涵的“对象”来完成“设计”。
如果要判别是否真正理解了“面向对象”的开发理念，最简单、最直接的方式就是看他是否实现过“自定义对象”的封装，因为这是对面向对象理念的初衷与归宿。
开发环境为我们提供了设计、封装、引用各种“对象”的技术手段，如何在这个舞台上抽象、构造、设计、使用属于我们自己的各种应用“对象”，才是真正展示我们驾驭“面向对象”能力的具体体现。
不要以为“面向对象”就是那么深奥、那么难以理解，其实它就像一层“窗户纸”，只要你轻轻地“捅”一下，一切问题就会迎刃而解。关键是是否意识到了这层“窗户纸”的存在，并要伸出手指即可。相反，如果没有意识到它的存在，或不愿意为此有所付出，那也只能是在殿堂的门口“雾里看花”了。
面向对象之设计
面向对象的魅力在于真实与抽象之间的演变。
管理信息系统是个强调个性化的主题，但应当明确的是：这种个性化所对应的是系统功能，而不一定是软件的设计元素与设计过程。当我们把设计粒度降低到各个“对象”元素的时候，就会惊奇地发现，绝大部分对象具备相同的形态与操作逻辑。
把问题的普遍性抽象成“类”，它将表示一个独立的事物单元，在“实例化”的过程中将会通过属性的改变实现个性化功能的引用与设置。这就是我们所说的“自定义控件”的封装与引用。这些就是我们设计自定义控件的意义所在。
项目的设计过程应当理解为事物单元“组装”过程。事物单元的抽象程度越高、涵盖能力越强，项目设计就会越轻松，可以被引用的事物单元（类）越多，实例级的代码量就会越少。在设计过程中，面向用户功能的代码量可以作为对“面向对象”程度的基本评价。
如果没有自定义控件的存在，所有的业务功能都要通过实例级的代码实现，功能与模式的重复往往会意味着代码的复制。这种设计方式只是面向过程理念在面向对象环境下的沿用而不是真正的面向对象设计。对于这一点一定要有清醒的认识。
出于事物自身的特点，完全屏蔽掉实例级的代码是不可能的，但如果抽象程度合适，实例级的代码相当于装配过程中的连接件，而不再是设计的主体所在。我们的设计目标是：尽量通过封装与派生的手段来解决问题，在实例化的过程中代码量越少越好。
代码量的减少只是一种现象，但它所表现出来的应当是面向对象的构思能力与设计水平。只有高度的抽象与完美的封装，才有可能在最大程度上减少实例级的代码量，这才是我们的目的所在。
就项目过程而言，控件的封装只是最基本的元素单元，在此基础上，还有很多可以被抽象、归纳的功能与模式，这些可以理解为更高层次的封装，它们在解决项目代码的复用程度上具有更加简约、有效的表现能力。
规范是建立体系的基本前提，承载能力取决于数据体系的构建，适应能力则取决于参数方案的设计。项目的总体构成基本包括代码（包括控件）、数据（包括参数）、服务（参数维护与定式功能），这些就是我们实现每个设计的实际过程。
开发只是项目过程中的一个环节，实施过程中的各种变化与适应性调整也是成本消耗的重要组成部分。完成用户的功能需求只是最基本的设计要求，高水平的设计应当充分考虑在实施或应用过程中各种可能会出现的变化。这是适应性的起源。基本功能的实现来自用户的业务要求，而运行状态下的“柔性”定制则是来源于对规律的抽象与升华。关于适应性的提升是降低成本、提高开发价值的重要课题。
更高层次的设计应当是“模式”的概念，代码的复用只能解决功能点上的问题，模式的复用则会侧重于一类功能或一类实现的共性。控件基于对代码层面的封装，模式则侧重于程序结构的复用。自定义控件与自定义模式共同形成了基于项目定制实现快速开发的“工作平台”。
面向对象之管理
软件开发商要保证营利，软件从业人员要体现自身价值，其中具有共性的内涵就是“如何才能快速执行客户订单”的核心问题。这也是本书所要解决的核心问题：系统性地介绍软件开发过程中所遇到的种种难题并翔实地探讨实战应对的具体策略。这里的目标是如何高效率、高质量地实现各种企业管理应用项目的开发。
朦胧的需求、朦胧的签约，合同的约束能力形同虚设，这种项目的风险性可想而知。投资人只知道朦胧的管理目标，剩下的全部是开发商的问题了。双方都有良好的初衷，开发商也会竭尽全力，直到成本消耗殆尽时才发现离项目总体目标的实现仍然很遥远。这是很多项目过程的真实写照，也是双方都要共同面对的尴尬。面对实现难度极大、工作量极为浩繁的代码设计过程，如何才能规避这些风险，难道不值得我们采取慎重、积极的应对措施吗？
要想改变投资方的状态几乎是不可能的，争取更大的投资也不现实，剩下的只有一个可能，即“软件开发商必须要提高自身项目交付的能力”！只有妥善解决了这个问题，才有可能在市场环境下持续生存。所以，每个开发商都希望形成自己的技术积累，都希望形成自己的核心竞争力，但要想实现这个目标并不是一件容易的事，这里有人才问题、技术问题、成本问题、时间问题等。
软件工程既是一个强调个人能力的过程，也是一个强调协同效率的过程。既要突出精英的核心作用，又要把精英的设计精华被更多的人来复用。这是平抑成本与工期的主要策略。这里的核心问题是代码的“复用”与实施过程的“适应与变通”。形成可被复用的技术积累只是一个基本的层面，如果能把技术积累组织成完整、完备的体系，则会进一步提升积累的市场价值。
很多人把这个过程看成是一个难以达到的境界，其实不然。面向对象的设计理念为技术积累的有效形成提供了最基本的技术保证，只要我们能够正确理解并能持之以恒地加以运用，形成有效的技术积累只不过是个时间问题，这一点不管对团队还是对个人，都是相同的。只要认认真真地从一点一滴做起，仔仔细细地研究并能相对完美地解决好每个命题（无论问题的大小，只要有复用价值），就能通过“自定义对象”的方式来形成有效的技术积累并能达到有效复用的目的。积累的对象多了、范围广了、解决问题的思路深化了，一个属于自己的技术体系也就会在自然过程中逐步形成。这就是所谓的“道法自然”。
目前流行的编程环境无一例外地都在支持“面向对象”的开发技术，因为它是迄今为止最能被人公认的一种开发理念，也是最能体现软件成熟度的一种实现手段。在经历了几年的普及过程之后，几乎所有应用系统都采用了“面向对象”技术，似乎这种技术已是“深入人心”。如果仔细观察一下就会发现，实际情况并非如此。很多人把使用“面向对象”的开发环境与运用“面向对象”的设计理念混为一谈。就如同会“使用汽车”与会“设计汽车”之间的差别类似，从“会用开发环境”到“掌握设计理念”之间确实还存在一个“门槛”，并不是每个程序员都能轻而易举跨过这个“门槛”的。
“面向对象”的理念既是一种思维模式，又是一种实现手段。如果忽略了思维模式的作用，就会以“面向对象”的开发环境实现着“面向过程”设计的不伦不类的开发模式，目前这种开发模式的存在带有相当范围的普遍性。
领悟并运用面向对象的开发理念，达到提高设计水平的效果，增加企业或个人的自身价值是贯穿全书的基本宗旨。
关于本书阅读
本书以.NET C#为实现的开发环境，其中的需求分析、命题构思等与语言环境基本无关，在其他语言环境下仍然具有完整的参考价值。本人曾用Delphi、Visual Basic、Visual Foxpro分别实现过这些设计方案，全都取得了令人满意的效果。
限于篇幅，本书认为读者基本具备了使用.NET C#的水平。为了更加通俗易懂，对于有些备受专业人员推崇的接口、虚类、虚方法等设计技巧采取了保守的态度。尽管这些技术可能会带来一些优化设计的效果，但也会增加理解与实现上的难度。在有可能采用简单技术的时候，尽量地避免了这些抽象设计的采用，这也是回避技术风险的有效措施。
为了有效利用版面，所以在代码格式上进行了压缩，请读者阅读时谅解。
1．去掉了代码之间的间隔行，必要时把多个命令合并到一行，极个别的码行缩进部分略有压缩，这对阅读效果略有影响，但却节省了版面空间。
2．凡是自动生成且没有被变更的构造函数“private void InitializeComponent()”则从代码中删除，因为这部分代码可以从再现的过程中自动生成。
3．在前部分的样例中可能会引用后面一些设计作为样例，只要理解控件在样例中的作用就可以了，这些样例在后续部分将会给出更详细的介绍。
本书以通俗的方式对上述各种命题给予了真实的实现。叙述、图式等各方面都是基于简单的工作文档为素材（并非专业级的设计方案）。其中的观点纯属个人体会，不免存在各种各样的偏颇之处，恳切希望能够得到读者的赐教并请海涵。
与本书相关的设计由俞丹琛、黄智洪主持。系统构思由牛树长提供，代码实现主要由杨海波完成，其中的窗体生成器由肖庆实现，帮助文档生成器由熊峰实现。在此对上述人员及所有参加设计、编写的人员表示感谢。
作者：牛树长 2009-1-18
目  录
第1章  需求分析要略    1
本章从经验的角度叙述中小企业项目“需求分析”过程中所遇到的具体问题及相应的应对策略。
1.1  概述    1
1.2  素材搜集    2
1.2.1  素材搜集    3
1.2.2  素材的局限性    5
1.2.3  素材评价    5
1.3  需求分析    6
1.3.1  把握大局    7
1.3.2  掌握规律    7
1.3.3  体系构造    11
1.3.4  需求分析样例    14
1.4  需求方案撰写    16
1.4.1  售前方案    16
1.4.2  需求报告    16
1.4.3  需求规格    18
1.5  需求与项目风险    19
1.5.1  来自用户的风险    19
1.5.2  来自开发过程的风险    20
1.5.3  需求分析与对象    21
1.5.4  提升需求分析的能力    21
1.6  总结    22
第2章  数据体系与规则    23
本章要解决表、主键、内键、外键、数据字段的命名规范，以及控件、属性、方法的命名规范。数据体系构建策略的优劣对项目影响重大，也是提高团队开发效率的关键。
2.1  概述    23
2.2  命名规范    24
2.3  表结构定义    25
2.3.1  物理表命名    25
2.3.2  字段命名    26
2.3.3  总体约束    29
2.3.4  命名小结    29
2.4  物理表分类    30
2.4.1  参数表    30
2.4.2  词汇数据表    31
2.4.3  基础数据表    31
2.4.4  业务数据表    32
2.5  物理表设计    33
2.5.1  主键    33
2.5.2  外键设置    35
2.5.3  内键设置    39
2.6  关于索引    40
2.6.1  建立索引    40
2.6.2  联合索引    40
2.6.3  索引应用    41
2.7  实现与版本    41
2.7.1  设计实现    41
2.7.2  数据版本    42
2.8  代码命名规则    42
2.8.1  规范的意义    43
2.8.2  规范的目的性    44
2.8.3  命名规则定义    44
2.8.4  对象命名    45
2.8.5  类与对象命名    46
2.8.6  自定义类的主题字注册    47
2.8.7  其他命名规则    48
2.9  代码书写规范    50
2.10  总结（规范的作用）    50
第3章  自定义按钮控件    51
本章以系统的“Button”类为例讲解自定义控件封装的实现步骤与方法，针对每个命题详细讲解归纳、抽象、构思、设计、应用的全部过程，最终形成具有通用价值的按钮类。
3.1  概述    51
3.1.1  解决代码复用    52
3.1.2  统一设计模式    52
3.1.3  统一设计风格    53
3.1.4  便于系统维护    53
3.1.5  封装的粒度    54
3.2  自定义类    54
3.2.1  对象与封装    55
3.2.2  类与继承    55
3.2.3  类的属性    56
3.2.4  接口    56
3.2.5  自定义类    56
3.3  接口应用    57
3.3.1  接口实现    57
3.3.2  接口的意义    58
3.3.3  接口继承示例    58
3.3.4  接口继承样例    59
3.3.5  接口应用样例    59
3.4  录入辅助按钮    60
3.4.1  自定义“Button”到“BTN_”基础类    60
3.4.2  自定义“BTN_展开”子类（辅助编辑）    64
3.4.3  自定义“BTN_只读”子类（状态控制）    68
3.4.4  自定义“BTN_浏览”子类（打开文件）    72
3.4.5  自定义“BTN_上传”子类（转储文件）    78
3.4.6  自定义“BTN_路径”子类（文件位置）    86
3.4.7  自定义“BTN_图片”子类（图片管理）    88
3.4.8  自定义“BTN_结构”子类（辅助编辑）    90
3.4.9 “BTN_”类封装小结    93
3.5  工具栏按钮    94
3.5.1  录入过程控制    94
3.5.2  实现录入控制的途径    96
3.5.3  自定义“ToolStripButton”到“TSB_”类    97
3.5.4  自定义“TSB_退出”子类（关闭窗体）    101
3.5.5  自定义“TSB_增加”子类（数据级联）    102
3.5.6  自定义“TSB_删除”子类（数据级联）    115
3.5.7  自定义“TSB_复制”子类（记录复制）    119
3.5.8  自定义“TSB_修改”子类（数据维护）    123
3.5.9  自定义“TSB_保存”子类（数据存储）    125
3.5.10  自定义“TSB_刷新”子类    127
3.5.11  自定义“TSB_查询”子类（激发条件合成）    127
3.5.12 “TSB_”封装小结    128
3.6  自定义“Label”到“LBL_”类    128
3.6.1  命题与构思    129
3.6.2  代码实现    130
3.6.3  应用示例    132
3.7  总结（掌握封装的理念）    134
第4章  自定义数据控件    136
数据采集过程最能令人困惑，情况各异的功能性变化遍布于系统之中。如何构造简单、标准且具有良好的通用性的自定义控件则是本章所要解决的问题。
4.1  概述    136
4.2  自定义“Textbox”到“TB_”类    137
4.2.1  命题提出    137
4.2.2  代码实现    138
4.2.3  自动绑定数据源    142
4.2.4  自动生成助记码    143
4.2.5  应用正则表达式    145
4.2.6  自动生成条件子句    146
4.3  由“TB_”封装的子类    149
4.3.1  自定义“TB_定位访问”子类    149
4.3.2  自定义“TB_定位插入”子类    159
4.3.3  服务：FRM_重码选择    168
4.3.4  自定义“TB_数值”子类    174
4.3.5  自定义“TB_统计”子类    178
4.3.6  自定义“TB_取值”子类    182
4.3.7  由“TB_”封装的应用类    183
4.3.8  小结    188
4.4  自定义“Textbox”到“TB_票号”类    189
4.5  自定义“ComboBox”到“CBX_”类    197
4.5.1  命题提出    197
4.5.2  设计构思    198
4.5.3  代码实现    199
4.6  自定义“CBX_”的子类    212
4.6.1  封装子类的意义    212
4.6.2  自定义“CBX_词汇”子类    213
4.6.3  自定义“CBX_集合填写”子类    216
4.6.4  自定义“CBX_物理表”子类    220
4.6.5  自定义“CBX_表字段”子类    221
4.6.6  自定义“CBX_Grid列”子类    224
4.6.7  自定义“CBX_Grid数值列”子类    225
4.6.8  自定义“CBX_颜色选择”子类    227
4.6.9  小结    230
4.7  自定义“Listbox”到“LB_”类    231
4.7.1  代码实现    231
4.7.2  自定义“LB_物理表”子类    232
4.7.3  自定义“LB_表字段”子类    233
4.7.4  自定义“LB_Grid列”子类    234
4.7.5  自定义“LB_同比”子类    237
4.8  服务：FRM_结构字符串    242
4.9  自定义“DateTimePicker”到“DTP_”类    247
4.9.1  命题与思路    248
4.9.2  代码实现    250
4.9.3  应用样例    254
4.10  自定义“CheckBox”到“CKB_”类    256
4.10.1  命题提出    257
4.10.2  设计构思    257
4.10.3  代码实现    258
4.10.4  应用样例    261
4.11  自定义“RadioButton”到“RB_”类    263
4.12  总结（封装的成本价值）    265
第5章  自定义Grid控件    267
封装Grid控件需要更多的经验、归纳、抽象与参数，封装向着功能化发展。经过完善、强化的Grid控件集中解决了数据编程的难点问题，同时提升了数据的表现能力与控制能力。
5.1  概述    267
5.2  自定义“DataGridView”到“GDV_”类    268
5.2.1  命题提出    269
5.2.2  总体构思    270
5.2.3  总体效果    272
5.3  数据装载    282
5.3.1  命题提出    282
5.3.2  设计构思    283
5.3.3  综合样例    293
5.4  样式与规则    295
5.4.1  命题提出    295
5.4.2  构思与实现    296
5.4.3  应用样例    311
5.4.4  正则验证    313
5.5  动态设置    316
5.5.1  左侧锁定（随机定义锁定）    316
5.5.2  主从联动（设置）    319
5.5.3  主从联动（撤销）    321
5.5.4  同步刷新（数据集联合动作）    323
5.5.5  字段隐藏（设置可见与次序）    328
5.5.6  卡片控制    334
5.5.7  字段值统计（随机统计计算）    336
5.5.8  增加选择列（全选与撤销）    340
5.5.9  悬停提示（辅助提示）    341
5.6  网格参数    342
5.6.1  参数表（局部）    342
5.6.2  窗体与代码    342
5.6.3  数据集命名    345
5.6.4  约束表达式（记录级验证）    347
5.6.5  警示表达式（记录级警示）    351
5.6.6  判重表达式（字段联合约束）    352
5.6.7  强调色表达式（强调网格行）    355
5.7  数据服务    357
5.7.1  批量查找（逐个定位）    357
5.7.2  联合排序（动态组合字段）    364
5.7.3  动态过滤（动态条件设置）    367
5.7.4  字段赋值（初始化辅助）    371
5.7.5  批量替换（按特征值替换）    374
5.8  总结（封装与服务）    379
第6章  数据对象服务    381
本章集中解决了一些几乎任何系统都会碰到的数据应用问题，这里尽量从通用的角度给出了解决相对经典的方案。
6.1  概述    381
6.2  格式化输出    382
6.2.1  打印样式管理方案    382
6.2.2  套用Excel样式    394
6.2.3  自定义图形展示    399
6.3  导入与导出    403
6.3.1  导出（窗体数据到Excel等文件）    403
6.3.2  导入（从Excel等文件导入数据）    412
6.3.3  方案化导入导出（电子票据辅助处理）    419
6.3.4  模式化的数据导出（财务接口辅助）    420
6.3.5  SQL直接导出（从查询导出Excel文件）    422
6.4  相关性的遍历    426
6.4.1  穷尽“谁与我相关”（对主键引用的遍历）    427
6.4.2  穷尽“我与谁相关”（对引用外键的遍历）    431
6.5  主键值替换（遍历式变更）    436
6.5.1  命题提出    437
6.5.2  解决思路    437
6.5.3  窗体与实现    438
6.5.4  应用样例    442
6.6  主从键值设置（内键关系设置）    446
6.6.1  命题提出    446
6.6.2  设计与实现    446
6.6.3  应用样例    449
6.7  数据审计（日志自动化）    452
6.7.1  问题提出    452
6.7.2  解决思路    453
6.7.3  审计历程    454
6.7.4  审计查询    459
6.8  数据体系初始化    461
6.8.1  命题提出    461
6.8.2  窗体与实现    461
6.8.3  应用样例    463
6.9  关于数据结构的文档    464
6.9.1  基于代码方式的实现    466
6.9.2  基于参数方式的实现    468
6.10  数据备份与恢复    470
6.10.1  实现方案    470
6.10.2  代码实现    471
6.10.3  应用样例    473
6.11  TSB_提交（按钮）    473
6.11.1  命题提出    473
6.11.2  设计构思    474
6.11.3  代码实现    474
6.11.4  应用样例    476
6.12  业务计算器    476
6.13  总结（功能抽象与实现）    478
第7章  设计模式与容器控件    480
本章将从具体实现向模式化实现过渡、从简单的控件封装向组件化封装过渡，从功能化实现向自动化实现过渡。本章的控件设计对复杂的应用系统将会起到至关重的作用。
7.1  设计模式    480
7.1.1  理解设计模式    480
7.1.2  运用设计模式    481
7.1.3  数据应用模式    481
7.1.4  实现的应用模式    482
7.2  数据衍生    483
7.2.1  自定义“BTN_冲红”子类（对冲衍生）    483
7.2.2  应用样例    486
7.2.3  自定义“BTN_拆解”子类（拆解衍生）    489
7.3  自定义“Panel”到“PNL_”类（数据绑定）    496
7.3.1  问题提出    496
7.3.2  解决思路    496
7.3.3  代码实现    497
7.3.4  应用样例    502
7.4  填充模式（标注项填写）    502
7.4.1  自定义“PNL_填充”子类    503
7.4.2  解决思路    503
7.4.3  代码实现    503
7.4.4  自定义“BTN_填充”子类    504
7.4.5  应用样例    506
7.5  查询模式（动态条件）    508
7.5.1  自定义“PNL_查询”子类（动态条件）    508
7.5.2  自定义“BTN_查询”子类（查询按钮）    511
7.5.3  准动态条件（条件辅助）    513
7.5.4  应用样例    516
7.6  分组模式    522
7.6.1  自定义“TreeView”到“TV_”类（随机字段）    523
7.6.2  命题提出    523
7.6.3  设计构思    523
7.6.4  参数表    524
7.6.5  代码实现    528
7.6.6  服务：“分组属性设置”    533
7.6.7  应用样例    534
7.6.8  小结    540
7.7  自定义“TreeView”到“TV_编码”类（结构化字段）    541
7.8  总结（功能中的自动化）    546
第8章  Form封装与应用模式    548
本章介绍了窗体的封装及窗体模板；同时介绍了两个重要应用：在线式的“帮助文档”撰写、编译及具有通用性的工作流程控制器，它们对项目的作用十分明细。
8.1  概述    548
8.1.1  Form封装    548
8.1.2  应用模式    549
8.1.3  自定义“FORM”到“FRM_”类    549
8.2  如何实现“应用功能”    561
8.2.1  数据采集    561
8.2.2  卡片模式    561
8.2.3  查询模式    565
8.2.4  查询模式与数据处理模式的结合    570
8.2.5  复杂应用模式    571
8.3  生成器模式与生成器    572
8.3.1  数据卡片“生成器”    572
8.3.2  自定义“FRM_卡片”子类    574
8.3.3  实现“字段↔控件类”映射    577
8.3.4 “生成器”实现    580
8.3.5 “生成器”运用    590
8.3.6  编辑“生成器”结果    595
8.3.7  对生成结果的引用    599
8.3.8 “应用类”生成器    600
8.3.9  小结（生成代码的代码）    600
8.4  “在线帮助”生成器    601
8.4.1  帮助文档制作（常规方式）    601
8.4.2  帮助文档调用（常规方式）    603
8.4.3  命题提出    604
8.4.4  设计思路    604
8.4.5  关于HTML文件的粒度    606
8.4.6  自定义“CLS_HTML转换CHM”类    606
8.4.7  生成器窗体    615
8.4.8  参数文件生成    618
8.4.9  实现“在线帮助”    620
8.4.10 “在线帮助”部署    620
8.4.11  在线帮助样例（更新该样例）    621
8.4.12  支持“在线撰写”    621
8.4.13  在线撰写样例    622
8.4.14  支持“在线编译”    623
8.4.15 “在线编译”实现    624
8.4.16  小结    627
8.5  流程控制器    627
8.5.1  总体构思    628
8.5.2  问题提出    628
8.5.3  流程定义数据    630
8.5.4  流程目标数据    633
8.5.5  流程历程数据    633
8.5.6  节点上的策略    634
8.5.7  自定义“PNL_审批”类    636
8.5.8  流程管理的实现    641
8.5.9  流程构造样例    643
8.5.10  流程应用样例    646
8.5.11  小结    651
8.6  总结（设计时序与流程）    651
第9章  运行环境构建与部署    653
本章为应用系统的客户端构建了一个功能性较强的实现方案，这是有效实现项目复用所要依赖的基础。最后介绍了系统部署及部署中的一些常见问题。
9.1  概述    653
9.1.1  总体流程    654
9.1.2  原始形态    654
9.1.3  初步设想    655
9.2  实现步骤    656
9.2.1  关于App.config文件    656
9.2.2  自定义Main到“FRM_主窗口类”    657
9.2.3  全局变量（静态预置）    664
9.3  外部参数    665
9.3.1  命题提出    665
9.3.2  参数表与参数引用    666
9.3.3  几个类似的参数表    667
9.3.4  维护窗体    667
9.3.5  应用样例    667
9.4  身份认证    668
9.4.1  通行字验证规则    668
9.4.2  用户注册    671
9.4.3  权限委托    679
9.5  权限策略    685
9.5.1  授权策略综述    685
9.5.2  授权机制示意图    687
9.5.3 “功能”授权    688
9.5.4 “字段”授权    688
9.5.5 “控件”授权    691
9.5.6 “键字段”授权    694
9.5.7  小结    695
9.6  菜单管理    696
9.6.1  命题与构思    696
9.6.2  功能授权    704
9.6.3  菜单维护窗体    704
9.6.4  图形化菜单    707
9.6.5  小结    717
9.7  功能管理    717
9.7.1  问题提出    717
9.7.2  解决思路    718
9.7.3  运行效果    723
9.8  自定义ToolStripDropDownButton到“TSD_”类    724
9.8.1  命题提出    724
9.8.2  构思与实现    724
9.8.3  应用效果    727
9.9  辅助控件    728
9.9.1  主窗体辅助    728
9.9.2  一般窗体辅助    729
9.10  动态属性    734
9.10.1  自定义“PropertyGrid”到“FPG_”类    734
9.10.2  命题提出    734
9.10.3  设计构思    734
9.10.4  代码实现    735
9.10.5  窗体与代码    739
9.10.6  应用样例    740
9.11  风格管理    741
9.11.1  命题提出    741
9.11.2  设计构思    742
9.12  总结（作用与评价）    747
9.13  应用系统部署    748
9.13.1  实现部署的工具    748
9.13.2  部署策略的制定    749
9.13.3  发布ClickOnce应用程序    749
9.13.4  部署发布的样例    750
9.13.5  部署发布过程中的常见问题    751
9.13.6  版本更新过程中的常见问题    753
第10章  工作平台构建    755
本章重申上述设计形成开发平台的作用与意义。
10.1  概述    755
10.2  平台构建    756
10.2.1  确定目标    756
10.2.2  转变观念    756
10.2.3  制定规范    757
10.2.4  分步实现    757
10.2.5  示意图    761
10.3  效果与评价    762
10.3.1  改进需求分析    762
10.3.2  强化数据体系    762
10.3.3  代码与复用    762
10.3.4  可靠性    763
10.3.5  适应性    763
10.3.6  改进项目管理    763
10.3.7  合理支付成本    764
10.3.8  规范实施过程    765
10.3.9  提高综合效益    765
10.4  形成技术积累    765
10.5  持续与扩充    766
10.6  总结    767
附录A  方法代码汇编    768
本书各个设计方案中所引用的公共方法，这是实现控件设计的基础。
A.1  概述    768
A.2  方法库“CLS_公用方法”    769
A.2.1  方法库的形成    769
A.2.2  方法库框构    769
A.2.3  方法库代码    770
A.3  方法库“CLS_数据访问”    848
A.3.1  数据访问库的形成    848
A.3.2  数据访问库的框构    848
A.3.3  数据访问库的代码    849
A.4  公用变量    862
A.5  公用接口    865
A.6  总结（函数与方法）    866
编后语    867