自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(0)
  • 资源 (23)
  • 收藏
  • 关注

空空如也

ILSpy .NET 反编译工具

ILSpy_Master_2.3.0.0_Binaries_CHS_MOD 中文版,可以反编译C#、VB.NET开发的DLL、EXE文件

2015-12-09

C#最全精华公共类库,免费分享

C#最全的精华常用类库,可以直接用到项目开发 包含文件操作,网络操作,压缩解压缩,邮件,正则等等

2014-03-26

LTP通用类、数据库访问类源码

LTP.Common、LTP.DBUtility、LTP.PageControl通用类库源码 Common:通用类库源码 DBUtility:数据访问基础类库 LtpPageControl: 分页控件源码

2014-02-10

DBUtility工厂模式数据库访问类(支持各种数据库)

DBUtility工厂模式数据库访问类(支持各种数据库SqlServer、Oracle等,可自己扩展)

2014-02-10

DotNet C# 常用类库(多年积累)

跟师傅学编程快一年了,一年来师傅分享了很多积累了很多年的宝贝,自己也在网络上搜罗了一下。有字符串操作,XML操作类,常用网络解析类,正则表达式,验证码,解压缩,文件操作等等60余个类文件动态库文件哦。其实有好多类我都还没来的及去用,希望用过的朋友能提宝贵意见

2013-08-20

DbHelper 数据访问类

C# NET DbHelper 数据访问类MSSQL Mysql ORACLE OleDb

2013-08-20

吉日嘎拉 C#.NET 通用权限管理系统组件 v3.7 使用说明书

吉日嘎拉(蒙古语为吉祥如意),2000年毕业于黑龙江大学计算机系软件专业,目前定居杭州,外号“软件包工头”。 通用权限管理系统组件(GPM - General Permissions Manager)自2003年开始发布,目前是国内注册用户和免费盗版用户最多的权限管理系统,是各种信息管理系统开发中彻底的权限解决方案。本组件支持多种主流数据库(Oracle、sqlsever、db2、mysql),功能强大,使用方便,代码简洁,思路严谨,被广大支持者称为权限管理系统中的“走火入魔级权限管理系统”。 精心维护通用权限管理系统组件(GPM - General Permissions Manager)有10多年,5年的不断推广,20万行经典的业务逻辑积累,经过上万次的调试修正,经历了五百个付费客户,三百多个软件公司的实战开发,组件越来越好用、越来越稳定成熟了。 11年以上开发经验,外企工作5年,上市公司3年,独立经营软件公司2年,主持研发部门管理工作4年以上。

2013-06-11

吉日嘎拉 C#.NET 通用权限管理系统组件 v3.7 源代码 20120724

吉日嘎拉福利大派送,通用权限管理大师之作。 通用权限管理系统组件(GPM - General Permissions Manager)自2003年开始发布,目前是国内注册用户和免费盗版用户最多的权限管理系统,是各种信息管理系统开发中彻底的权限解决方案。本组件支持多种主流数据库(Oracle、sqlsever、db2、mysql),功能强大,使用方便,代码简洁,思路严谨,被广大支持者称为权限管理系统中的“走火入魔级权限管理系统”。 精心维护通用权限管理系统组件(GPM - General Permissions Manager)有10多年,5年的不断推广,20万行经典的业务逻辑积累,经过上万次的调试修正,经历了五百个付费客户,三百多个软件公司的实战开发,组件越来越好用、越来越稳定成熟了。

2013-06-11

C#技术实例大全(asp.net,winform,Remoting等)、.NET框架学习代码(学习资料和心得笔记)

C#各种技术实例大全、WCF实例、Romoting例子、网络程序、自动升级、生成器模式、反射工厂、设计模式、NUnit使用演示、Log4Net使用演示、微软报表项目等 Chsoft.Framework NET框架源代码学习等

2012-08-27

PetShop5.0宠物商店+系统架构设计+详细说明文档

简介 基于.NET Framework 3.5的Petshop,使用LINQ to SQL改进数据访问层,使用WCF来提供RSS,并在UI层上做一些改进,如使用ASP.NET AJAX,ListView控件等。 PetShop for .NET3.5 Weekly Drop 01 Release name is required Released: Jan 11 2008 Updated: Jan 10 2008 by TerryLee ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ http://hi.baidu.com/baofen/blog/item/d8c38def51c4bd10fdfa3c8f.html petshop for framework 3.5(petshop 5.0)2008-07-27 20:59简介 基于.NET Framework 3.5的Petshop, 使用LINQ to SQL改进数据访问层 PetShop.Model.DataContext.MSPetShop4DataContext 继承System.Data.Linq.DataContext PetShop.Model.ProductInfo与PetShop.Model.CategoryInfo实体类分别映射数据库表 PetShop.Model.ProductInfo其中的Category属性存在一对一的关系 PetShop.Model.CategoryInfo中的Products属性存在一对多的关系 使用WCF来提供RSS, web/FeedService.svc目录下 PetShop.SyndicationFeeds 并在UI层上做一些改进,如使用ASP.NET AJAX,ListView控件等。

2012-08-27

PetShop4.0宠物商店+系统架构设计+中文注释源码+PDF中文详解

一、Model主要功能: 1、 将每一个“业务实体”抽象成“(瘦数据)类”,可以很好地“划分”各个“对象”,操作更加清晰 2、 用于在应用程序各层之间传递数据,被用做传输数据的“容器” 3、 这就是所谓的“建模”过程! 4、 Model各个类(Model文件夹中的各个文件)划分或者说编制的原则,更趋向于模拟整个系统中的业务实体 二、实现细节: 1、 PetShop中Model的规划与数据库表的关系: (1) AccountInfo类——Account表 (2) AddressInfo类——无直接对应关系(对应Account表中一部分字段) (3) CartItemInfo类——无直接对应关系 (4) CreditCardInfo类——无直接对应关系 (5) ItemInfo类——Item表 (6) LineItemInfo类——无直接对应关系 (7) OrderInfo类——Orders表 (8) ProductInfo类——Product表 2、 为每一个Model中的类都标记了[Serializable],说明这些类可以被传行化,但是不能被继承! 3、 AccountInfo.cs文件:用户在网站注册的信息,及喜好选择情况 4、 使用构造函数可以初始化私有字段;使用属性可以读取私有字段(但使用属性不能设置私有字段的值) 5、 其中包含一个AddressInfo类的私有变量,和一个AddressInfo类的属性 6、 命名空间为PetShop.Model 7、 AddressInfo.cs文件:用户真实的个人姓名、住址和电话号码等信息 8、 与AccountInfo不同的是,AddressInfo类允许使用属性设置私有变量的值 9、 CartItemInfo.cs文件:描述购物车中每一种所选商品的信息的类 10、 该“类”对象的某些信息(如这里的Subtotal属性)可能并不是此类的“自然信息”,而需要经过简单计算而得到!这些简单但必要的信息也要在类的设计中体现出来! 11、 CreditCardInfo.cs文件:表示特定一张信用卡的信息 12、 ItemInfo.cs文件:一个Item指的是category"product"item,如猫"波斯猫"成年男波斯猫(或成年女波斯猫)。这个文件表示一个Item的所有信息 13、 productDesc字段的作用? 14、 LineItemInfo.cs文件:注意与CartItemInfo类的区别!LineItemInfo是用来描述用户最终确认的订单当中的某一种类的产品的信息的类 15、 同样包括了Subtotal属性 16、 OrderInfo.cs文件:用于显示用户某一个订单具体信息的类,在此一个订单当中,可能包括多个商品种类,即包括多个LineItemInfo对象(实际上在OrderInfo类中也确实存在LineItemInfo类型对象的一个数组!) 17、 ProductInfo.cs文件:包括一个特定Product的信息,如波斯猫 三、启发: 1、 来自Directory项目结束后的启发,以后做设计的时候,要将每个实体抽象为一个类,在整个系统中进行操作。 2、 在任意一个类当中,可能不只包括此实体类的自然信息,也可以包括一些对其他地方数据调用有用的属性信息,如根据数量和单价计算出来的总价属性,或者标志此实体的直属上级实体的属性 四、问题: 1、 忽然发现在MSDN上有文章,关于数据实体的:浏览 2、 抽象这些业务实体模型为瘦数据类的原则是什么?什么样的业务实体可以被抽象,或者说进行抽象后更有意义? 3、 ItemInfo类中,productDesc字段的作用? 一、IDAL主要功能: 1、 这完全是“工厂模式”的一部分实现而已 2、 这是一组接口类,其中包括了每个要公开的数据访问方法。为每个数据库产品单独编写的DAL(数据访问层)都要实现这组接口所定义的方法 3、 也就是规定了在DAL中编写的“对用户账号进行操作的类”所必须执行的方法! 4、 IDAL要达到的目的是:实现业务逻辑(BLL)与数据库访问(DAL)的完全分离!!! 5、 IDAL各个类(IDAL文件夹中的各个文件)划分或者说编制的原则,更趋向于“将对数据库的不同操作进行归类”,考虑的主要方面是数据库操作!!!例如,有对用户账号进行的一系列数据库操作,则将这一系列操作统一放置于IAccount接口(将来实现后的Account类)文件当中 二、实现细节: 1、 IAccount.cs文件:为针对不同数据库产品编写的“操作用户账号的类”所必须实现的一系列方法定义契约 2、 IInventory.cs文件:定义“操作库存量的类”所必须实现的一系列方法;或者说将操作库存量的一系列(所有)方法做一个汇总 3、 IItem.cs文件:定义“操作某一Item的类”所必须实现的一系列方法。(Item在Model中定义了,是指具体某一类别的Product,如男猫或女猫) 4、 对于其中的GetItemsByProduct()方法,返回的是一个ArrayList的接口类型(IList)的对象(见问题部分!) 5、 IOrder.cs文件:定义了一组DAL层中“操作用户订单的类”必须执行的方法。其中包括“添加一张新订单”的方法Insert()和根据一个已有的订单号取得此订单详细信息的方法GetOrder(),此方法返回的是一个OrderInfo对象。(Model中的OrderInfo类模型定义了用户的某一张Order中相关的信息,如发货地点,总价,信用卡号码等等) 6、 IProduct.cs文件:定义类一组在DAL层中编写的“对Product进行操作的类” 7、 IProfile.cs文件:定义一组在DAL层编写的“对用户Profile进行操作的类” 三、启发: 1、 这样就可以让在BLL层只针对IDAL层定义的接口进行编程(使用IDAL接口定义的这些方法)就可以了!!!无论在底层使用了什么厂家的数据库产品,有区别的只是针对此数据库产品编写的DAL层(相同的方法,如SignIn()方法,对于不同的数据库产品,可能有不同的实现方式!),而不会影响到上层的BLL层已经编写好的内容! 2、 从这里可以看到软件架构师和程序员工作上的区别!架构师要负责的是搭建系统的层次结构,定义接口;而程序员要负责的是针对接口的具体代码实现过程! 3、 这个IDAL接口的使用,主要是为了保证在底层数据库实现,甚至数据库产品发生变化的时候,不需要对上层BLL层的业务逻辑进行大量的修改!BLL层针对IDAL接口编程即可!!! 4、 IDAL文件夹中定义的所有的接口中的所有的方法,包括了整个程序要对数据库进行操作的所有方法 5、 由于PetShop只是一个演示程序,所以若对数据库操作的某一类别(如对Account进行操作)中定义的“操作类”不够用(如除了接口中定义的几个方法外还需要其他Account操作),还可以在接口中追加其他的方法,用以约束DAL层的实现类(如Account类)必须执行这些新增加的方法! 四、问题: 1、 定义这组接口后,如何保证为每个单独的数据库产品编写的DAL都执行这组接口所定义的方法?(答案:编写DAL的时候必须刻意保证,否则就失去了定义IDAL层分割BLL和DAL层的意义!!!) 2、 既然在实现GetItemsByProduct()方法的时候,也是要把返回的所有Item对象添加到一个ArrayList当中去,但为什么GetItemsByProduct()方法返回的不是一个ArrayList对象,而是一个IList接口的对象呢?仅仅是基类引用的方法吗?这里的基类引用有什么用呢?是否是由于为了不限制使用的数组形式?执行IList则可以使用ArrayList,也可以使用其他形式的数组??? 3、 IProduct.cs文件中为何要将查询条件参数定义为一个string类型的数组?

2012-08-27

大连驰敖集团办公自动化系统源码

大连驰敖集团办公自动化系统源码 2.1 产品描述 叙述该项软件开发的意图、应用目标、作用范围以及其他应向读者说明的有关该软件开发的背景材料。解释被开发软件与其他有关软件之间的关系。如果本软件产品是一项独立的软件,而且全部内容自含,则说明这一点。如果所定义的产品是一个更大的系统的一个组成部分,则应说明本产品与该系统中其他各组成部分之间的关系,为此可使用一张方框图来说明该系统的组成和本产品同其他各部分的联系和接口。 2.2 产品功能 本条是为将要完成的软件功能提供一个摘要。例如,对于一个记帐程序来说,需求说明可以用这部分来描述:客房帐目维护、客房财务报表和发票制作,而不必把功能所要求的大量的细节描写出来。 有时,如果存在较高层次的规格说明时,则功能摘要可从中取得,这个较高层次的规格说明为软件产品分配了特殊的功能,为了清晰起见,请注意: a. 编制功能的一种方法是制作功能表,以便客房或者第一次读这个文件的人都可以理解; b. 用方框图来表达不同的功能和它们的关系也是有帮助的。但应牢记,这样的图不是产品设计时所需求的,而只是一种有效的解释性的工具。 2.3 用户特点 列出本软件的最终用户的特点,充分说明操作人员、维护人员的教育水平和技术专长,以及本软件的预期使用频度。这些是软件设计工作的重要约束。 2.4 一般约束 本条对设计系统时限制开发者选择的其他一些项作一般性描述。而这些项将限定开发者在设计系统时的任选项。这些包括: a. 管理方针; b. 硬件的限制; c. 与其他应用间的接口; d. 并行操作; e. 审查功能; f. 控制功能; g. 所需的高级语言; h. 通信协议; i. 应用的临界点; j. 安全和保密方面的考虑。 2.5 假设和依据 本条列出影响需求说明中陈述的需求的每一个因素。这些因此不是软件的设计约束,但是它们的改变可能影响到需求说明中的需求。例如:假定一个特定的操作系统是在被软件产品指定的硬件上使用的,然而,事实上这个操作系统是不可能使用的,于是,需求说明就要进行相应的改变。 3 具体需求 3.1 功能需求 3.1.1 功能需求1 对于每一类功能或者有时对于每一个功能,需要具体描述其输入、加工和输出的需求。由四个部分组成: a. 引言 描述的是功能要达到的目标、所彩的方法和技术,还应清楚说明功能意图的由来和背景。 b. 输入 1) 详细描述该功能的所有输入数据,如:输入源、数量、度量单位、时间设定、有效输入范围(包括精度和公差); 2) 操作员控制细节的需求。其中有名字、操作员活动的描述、控制台或操作员的位置。例如:当打印检查时,要求操作员进行格式调整; 3) 指明引用接口说明或接口控制文件的参考资料。 c. 加工 定义输入数据、中间参数,以获得预期输出结果的全部操作。它包括如下的说明: 1) 输入数据的有效性检查; 2) 操作的顺序,包括事件的时间设定; 3) 响应,例如,溢出、通信故障、错误处理等; 4) 受操作影响的参数; 5) 降级运行的要求; 6) 用于把系统输入变换成相应输出的任何方法(方程式、数学算法、逻辑操作等); 7) 输出数据的有效性检查。 d. 输出 1) 详细描述该功能所有输出数据,例如:输出目的地、数量、度量单位、时间关系、有效输出的范围(包括精度和公差)、非法值的处理、出错信息; 2) 有关接口说明或接口控制文件的参考资料。 此外,对着重于输入输出行为的系统来说,需求说明应指定所有有意义的输入、输出对及其序列。当一个系统要求记忆它的状态时,需要这个序列,使得它可以根据本次输入和以前的状态作出响应。也就是说,这种情况犹如有限状态机。 3.1.2 功能需求2 ...... 3.1.n 功能需求n 3.2 外部接口需求 3.2.1 用户接口 提供用户使用软件产品时的接口需求。例如,如果系统的用户通过显示终端进行操作,就必须指定如下要求: a. 对屏幕格式的要求; b. 报表或菜单的页面打印格式和内容; c. 输入输出的相对时间; d. 程序功能键的可用性。 3.2.2 硬件接口 要指出软件产品和系统硬部件之间每一个接口的逻辑特点。还可能包括如下事宜:支撑什么样的设备,如何支撑这些设备,有何约定。 3.2.3 软件接口 在此要指定需使用的其他软件产品(例如,数据管理系统、操作系统或数学软件包),以及同其他应用系统之间的接口。对每一个所需的软件产品,要提供如下内容: a. 名字; b. 助记符; c. 规格说明号; d. 版本号; e. 来源。 对于每一个接口,这部分应说明与软件产品相关的接口软件的目的,并根据信息的内容和格式定义接口,但不必详细描述任何已有完整文件的接口,只要引用定义该接口的文件即可。 3.2.4 通信接口 指定各种通信接口。例如,局部网络的协议等等。 3.3 性能需求 从整体来说,本条应具体说明软件、或人与软件交互的静态或动态数值需求。 A. 静态数值需求可能包括: 1) 支持的终端数; 2) 支持并行操作的用户数; 3) 处理的文卷和记录数; 4) 表和文卷的大小。 B. 动态数值需求可能包括:欲处理的事务和任务的数量,以及在正常情况下和峰值工作条件下一定时间周期中处理的数据总量。 所有这些需求都必须用可以度量的术语来叙述。例如,95%的事务必须在小于1s时间内处理完,不然,操作员将不等待处理的完成。 3.4 设计约束 设计约束受其他标准、硬件限制等方面的影响。 3.4.1 其他标准的约束 本项将指定由现有的标准或规则派生的要求。例如: a. 报表格式; b. 数据命名; c. 财务处理; d. 审计追踪,等等。 3.4.2 硬件的限制 本项包括在各种硬件约束下运行的软件要求,例如,应该包括: a. 硬件配置的特点(接口数,指令系统等); b. 内存储器和辅助存储器的容量。 3.5 属性 在软件的需求之中有若干个属性,以下指出其中的几个(注意:对这些决不应理解为是一个完整的清单)。 3.5.1 可用性 可以指定一些因素,如检查点、恢复和再启动等,以保证整个系统有一个确定的可用性级别。 3.5.2 安全性 指的是保护软件的要素,以防止各种非法的访问、使用、修改、破坏或者泄密。这个领域的具体需求必须包括: a. 利用可靠的密码技术; b. 掌握特定的记录或历史数据集; c. 给不同的模块分配不同的功能; d. 限定一个程序中某些区域的通信; e. 计算临界值的检查和。 3.5.3 可维护性 规定若干需求以确保软件是可维护的。例如: a. 软件模块所需要的特殊的耦合矩阵; b. 为微型装置指定特殊的数据\程序分割要求。 3.5.4 可转移 \转换性 规定把软件从一种环境移植到另一种环境所要求的用户程序,用户接口兼容方面的约束等等。 3.5.5 警告 指定所需属性十分重要,它使得人们能用规定的方法去进行客观的验证。 3.6 其他需求 根据软件和用户组织的特性等,某些需求放在下面各项中描述。 3.6.1 数据库 本项对作为产品的一部分进行开发的数据库规定一些需求,它们可能包括: a. 在功能需求中标识的信息类别; b. 使用的频率; c. 存取能力; d. 数据元素和文卷描述符; e. 数据元素、记录和文卷的关系; f. 静态和动态的组织; g. 数据保存要求。 注:如果使用一个现有的数据库包,这个包应在“软件接口”中命名,并在那里详细说明其用法。 3.6.2 操作 这里说明用户要求的常规的和特殊的操作。 A. 在用户组织之中各种方式的操作。例如,用户初始化操作; B. 交互作用操作的周期和无人操作的周期; C. 数据处理运行功能; D. 后援和恢复操作。 注:这里的内容有时是用户接口的一部分。 3.6.3 场合适应性需求 这里包括: a. 对给定场合或相关任务或操作方式的任何数据或初始化顺序的需求进行定义。例如,栅值,安全界限等等。 b. 指出场合或相关任务为特点,这里可以被修改以使软件适合特殊配制的要求。 4 附录 对一个实际的需求规格说明来说,若有必要应该编写附录。附录中可能包括: a. 输入输出格式样本,成本分析研究的描述或用户调查结果; b. 有助于理解需求说明的背景信息; c. 软件所解决问题的描述; d. 用户历史、背景、经历和操作特点; e. 交叉访问表。按先后次序进行编排,使一些不完全的软件需求得以完善; f. 特殊的装配指令用于编码和媒体,以满足安全、输出、初始装入或其他要求。 注:当包括附录时,需求说明必须明确地说明附录是不是需求要考虑的部分。 数据库在DB_51aspx文件夹中(sql2000),附加即可. 登陆用户名和密码都是51aspx 此源码提供 使用手册、需求说明、测试调查 等一整套开发开发文档。 本源码由 51aspx 独家发布,转载请注明来源(来源于51aspx)

2012-08-27

ASP 全能OA办公网站系统 V2012

全能OA办公网站系统V2012 功能非常强大的OA系统 功能强大,目前功能已完全能满足日常办公需要 管理用户名:admin 管理密码:admin 公司通告 工作计划 通讯助理 客户资源 我的公文 公文传阅 公共资源 资源预约 今日考勤 个人计划 个人通讯录 个人基本档案 未读邮件 发邮件 收件夹 寄件夹 网络硬盘 网络会议 网络调查 交流论坛

2012-08-27

Farpoint Spread for ASP.NET v5.0中文帮助文档

用于.NET.开发的专业网格_电子表格Farpoint Spread for ASP.NET v5.0 中文文档

2012-08-07

Oracle DBA手记 数据库诊断案例与性能优化实践

Oracle DBA手记_数据库诊断案例与性能优化实践

2012-08-07

OLEDB读取Excel、csv出现字符串截断、丢失原因及其解决方案

在应用程序的设计中,经常需要读取Excel数据或将Excel数据导入转换到其他数据载体中,例如将Excel数据通过应用程序导入SQL Sever等数据库中以备使用。笔者在开发“汽车产业链ASP协同商务平台”中遇到了类似需求。某汽车整车生产企业需要将其车辆发车信息发布到汽车产业链平台上去,其数据为内部ERP系统生成的Excel数据表,用户首先将该数据表上传至汽车产业链平台,平台将此Excel数据读取导入到平台内部的SQL Sever数据库中,以供其它应用使用。汽车产业链平台的开发使用的开发工具为VS.NET,使用的语言是C#,在开发的过程中发现使用Microsoft.Jet.OLEDB.4.0读取数据会出现当某一字段内分别含有文本和数字的混合数据时,某一类型的数据会产生丢失。本文就对此问题产生的根源进行了分析并给出了相应的解决方法。

2012-08-07

DataGridView控件用法合集

DataGridView 控件用法合集(一) 1. DataGridView 当前的单元格属性取得、变更 2. DataGridView 编辑属性 3. DataGridView 最下面一列新追加行非表示 4. DataGridView 判断当前选中行是否为新追加的行 5. DataGridView 删除行可否设定 6. DataGridView 行列不表示和删除 DataGridView 控件用法合集(二) 7. DataGridView 行列宽度高度设置为不能编辑 8. DataGridView 行高列幅自动调整 9. DataGridView 指定行列冻结 10. DataGridView 列顺序变更可否设定 11. DataGridView 行复数选择 12. DataGridView 选择的行、列、单元格取得 DataGridView 控件用法合集(三) 13. DataGridView 指定单元格是否表示 14. DataGridView 表头部单元格取得 15. DataGridView 表头部单元格文字列设定 16. DataGridView 选择的部分拷贝至剪贴板 17.DataGridView 粘贴 18. DataGridView 单元格上ToolTip 表示设定(鼠标移动到相应单元格上时,弹出说明信息) DataGridView 控件用法合集(四) 19. DataGridView 中的ContextMenuStrip 属性 20. DataGridView 指定滚动框位置 21. DataGridView 手动追加列 22. DataGridView 全体分界线样式设置 23. DataGridView 根据单元格属性更改显示内容 24. DataGridView 新追加行的行高样式设置る 25. DataGridView 新追加行单元格默认值设置 DataGridView 中输入错误数据的处理(五) 26. DataGridView 单元格数据错误标签表示 27. DataGridView 单元格内输入值正确性判断 28. DataGridView 单元格输入错误值事件的捕获 DataGridView 控件用法合集(六) 29. DataGridView 行排序(点击列表头自动排序的设置) 30. DataGridView 自动行排序(新追加值也会自动排序) 31. DataGridView 自动行排序禁止情况下的排序 32. DataGridView 指定列指定排序 DataGridView 控件用法合集(七) 33. DataGridView 单元格样式设置 34. DataGridView 文字表示位置的设定 35. DataGridView 单元格内文字列换行 36. DataGridView 单元格DBNull 值表示的设定 37. DataGridView 单元格样式格式化 38. DataGridView 指定单元格颜色设定 39. DataGridView 单元格文字字体设置 40. DataGridView 根据单元格值设定单元格样式 DataGridView 控件用法合集(八) 41. DataGridView 设置单元格背景颜色 42. DataGridView 行样式描画 43. DataGridView 显示行号 44. DataGridView 焦点所在单元格焦点框不显示的设定 DataGridView 控件用法合集(九) 45. DataGridView 中显示选择框CheckBox 46. DataGridView 中显示下拉框ComboBox 47. DataGridView 单击打开下拉框 48. DataGridView 中显示按钮 49. DataGridView 中显示链接 50. DataGridView 中显示图像 DataGridView 控件用法合集(十) 51. DataGridView 编辑中单元格控件取得 52. DataGridView 输入自动完成 53. DataGridView 单元格编辑时键盘KEY 事件取得 54. DataGridView 下拉框(ComboBox)单元格编辑时事件取得 55. DataGridView 下拉框(ComboBox)单元格允许文字输入设定 DataGridView 控件用法合集(十一) 56. DataGridView 根据值不同在另一列中显示相应图片 57. DataGridView 中显示进度条(ProgressBar) 58. DataGridView 中添加MaskedTextBox DataGridView 控件用法合集(十二) 59. DataGridView 中Enter 键按下焦点移至旁边的单元格 60. DataGridView 行集合化(Group)

2012-08-07

C# 最全的日期正则表达式,没有之一

1 概述 首先需要说明的一点,无论是Winform,还是Webform,都有很成熟的日历控件,无论从易用性还是可扩展性上看,日期的选择和校验还是用日历控件来实现比较好。 前几天在CSDN多个版块看到需要日期正则的帖子,所以整理了这篇文章,和大家一起讨论交流,如有遗漏或错误的地方,还请大家指正。 日期正则一般是对格式有要求,且数据不是直接由用户输入时使用。因应用场景的不同,写出的正则也不同,复杂程度也自然不同。正则的书写需要根据具体情况具体分析,一个基本原则就是:只写合适的,不写复杂的。 对于日期提取,只要能与非日期区分开,写最简单的正则即可,如 \d{4}-\d{2}-\d{2} 如果可以在源字符串中唯一定位yyyy-MM-dd格式的日期,则可用做提取。 对于验证,如果仅仅是验证字符组成及格式是没有多大意义的,还要加入对规则的校验。由于闰年的存在,使得日期的校验正则变得比较复杂。 先来考察一下日期的有效范围以及什么是闰年。 2 日期的规则 2.1 日期的有效范围 对于日期的有效范围,不同的应用场景会有所不同。 MSDN中定义的DateTime对象的有效范围是:0001-01-01 00:00:00到9999-12-31 23:59:59。 UNIX时间戳的0按照ISO 8601规范为 :1970-01-01T00:00:00Z。 而实际应用中,日期的范围基本上不会超出DateTime所规定的范围,所以正则验证取其中常用的日期范围即可。 2.2 什么是闰年 (以下摘自百度百科) 闰年(leap year)是为了弥补因人为历法规定造成的年度天数与地球实际公转周期的时间差而设立的。补上时间差的年份为闰年。 地球绕日运行周期为365天5小时48分46秒(合365.24219天),即一回归年(tropical year)。公历的平年只有365日,比回归年短约0.2422 日,每四年累积约一天,把这一天加于2月末(即2月29日),使当年时间长度变为366日,这一年就为闰年。 需要注意的是,现在的公历是根据罗马人的“儒略历”改编而得。由于当时没有了解到每年要多算出0.0078天的问题,从公元前46年,到16世纪,一共累计多出了10天。为此,当时的教皇格雷果里十三世,将1582年10月5日人为规定为10月15日。并开始了新闰年规定。即规定公历年份是整百数的,必须是400的倍数才是闰年,不是400的倍数的就是平年。比如,1700年、1800年和1900年为平年,2000年为闰年。此后,平均每年长度为365.2425天,约4年出现1天的偏差。按照每四年一个闰年计算,平均每年就要多算出0.0078天,经过四百年就会多出大约3天来,因此,每四百年中要减少三个闰年。闰年的计算,归结起来就是通常说的:四年一闰;百年不闰,四百年再闰。 2.3 日期的格式 根据不同的语言文化,日期的连字符会有所不同,通常有以下几种格式: yyyyMMdd yyyy-MM-dd yyyy/MM/dd yyyy.MM.dd 3 日期正则表达式构建 3.1 规则分析 写复杂正则的一个常用方法,就是先把不相关的需求拆分开,分别写出对应的正则,然后组合,检查一下相互的关联关系以及影响,基本上就可以得出对应的正则。 按闰年的定义可知,日期可以有几种分类方法。 3.1.1 根据天数是否与年份有关划分为两类 与年份无关的一类中,根据每月天数的不同,又可细分为两类  1、3、5、7、8、10、12月为1-31日  4、6、9、11月为1-30日 与年份有关的一类中  平年2月为1-28日  闰年2月为1-29日 3.1.2 根据包含日期不同可划分为四类  所有年份的所有月份都包含1-28日  所有年份除2月外都包含29和30日  所有年份1、3、5、7、8、10、12月都包含31日  闰年2月包含29日 3.1.3 分类方法选择 因为日期分类之后的实现,是要通过(exp1|exp2|exp3)这种分支结构来实现的,而分支结构是从左侧分支依次向右开始尝试匹配,当有一个分支匹配成功时,就不再向右尝试,否则尝试所有分支后并报告失败。 分支的多少,每个分支的复杂程度都会影响匹配效率,考虑到被验证日期概率分布,绝大多数都是落到1-28日内,所以采用第二种分类方法,会有效提高匹配效率。 3.2 正则实现 采用3.1.2节的分类方法,就可以针对每一个规则写出对应的正则,以下暂按MM-dd格式进行实现。 先考虑与年份无关的前三条规则,年份可统一写作 (?!0000)[0-9]{4} 下面仅考虑月和日的正则  包括平年在内的所有年份的月份都包含1-28日 (0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])  包括平年在内的所有年份除2月外都包含29和30日 (0[13-9]|1[0-2])-(29|30)  包括平年在内的所有年份1、3、5、7、8、10、12月都包含31日 (0[13578]|1[02])-31) 合起来就是除闰年的2月29日外的其它所有日期 (?!0000)[0-9]{4}-((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2])-(29|30)|(0[13578]|1[02])-31) 接下来考虑闰年的实现  闰年2月包含29日 这里的月和日是固定的,就是02-29,只有年是变化的。 可通过以下代码输出所有的闰年年份,考察规则 for (int i = 1; i < 10000; i++) { if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0) { richTextBox2.Text += string.Format("{0:0000}", i) + "\n"; } } 根据闰年的规则,很容易整理出规则,四年一闰; ([0-9]{2}(0[48]|[2468][048]|[13579][26]) 百年不闰,四百年再闰。 (0[48]|[2468][048]|[13579][26])00 合起来就是所有闰年的2月29日 ([0-9]{2}(0[48]|[2468][048]|[13579][26])|(0[48]|[2468][048]|[13579][26])00)-02-29) 四条规则都已实现,且互相间没有影响,合起来就是所有符合DateTime范围的日期的正则 ^((?!0000)[0-9]{4}-((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2])-(29|30)|(0[13578]|1[02])-31)|([0-9]{2}(0[48]|[2468][048]|[13579][26])|(0[48]|[2468][048]|[13579][26])00)-02-29)$ 考虑到这个正则表达式仅仅是用作验证,所以捕获组没有意义,只会占用资源,影响匹配效率,所以可以使用非捕获组来进行优化。 ^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$ 以上正则年份0001-9999,格式yyyy-MM-dd。可以通过以下代码验证正则的有效性和性能 DateTime dt = new DateTime(1, 1, 1); DateTime endDay = new DateTime(9999, 12, 31); Stopwatch sw = new Stopwatch(); sw.Start(); Regex dateRegex = new Regex(@"^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$"); //Regex dateRegex = new Regex(@"^((?!0000)[0-9]{4}-((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2])-(29|30)|(0[13578]|1[02])-31)|([0-9]{2}(0[48]|[2468][048]|[13579][26])|(0[48]|[2468][048]|[13579][26])00)-02-29)$"); Console.WriteLine("开始日期: " + dt.ToString("yyyy-MM-dd")); while (dt < endDay) { if (!dateRegex.IsMatch(dt.ToString("yyyy-MM-dd"))) { Console.WriteLine(dt.ToString("yyyy-MM-dd") + " false"); } dt = dt.AddDays(1); } if (!dateRegex.IsMatch(dt.ToString("yyyy-MM-dd"))) { Console.WriteLine(dt.ToString("yyyy-MM-dd") + " false"); } Console.WriteLine("结束日期: " + dt.ToString("yyyy-MM-dd")); sw.Stop(); Console.WriteLine("测试用时: " + sw.ElapsedMilliseconds + "ms"); Console.WriteLine("测试完成!"); Console.ReadLine(); 4 日期正则表达式扩展 4.1 “年月日”形式扩展 以上实现的是yyyy-MM-dd格式的日期验证,考虑到连字符的不同,以及月和日可能为M和d,即yyyy-M-d的格式,可以对以上正则进行扩展 ^(?:(?!0000)[0-9]{4}([-/.]?)(?:(?:0?[1-9]|1[0-2])([-/.]?)(?:0?[1-9]|1[0-9]|2[0-8])|(?:0?[13-9]|1[0-2])([-/.]?)(?:29|30)|(?:0?[13578]|1[02])([-/.]?)31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)([-/.]?)0?2([-/.]?)29)$ 使用反向引用进行简化,年份0001-9999,格式yyyy-MM-dd或yyyy-M-d,连字符可以没有或是“-”、“/”、“.”之一。 ^(?:(?!0000)[0-9]{4}([-/.]?)(?:(?:0?[1-9]|1[0-2])\1(?:0?[1-9]|1[0-9]|2[0-8])|(?:0?[13-9]|1[0-2])\1(?:29|30)|(?:0?[13578]|1[02])\1(?:31))|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)([-/.]?)0?2\2(?:29))$ 这就是“年月日”这种形式最全的一个正则了,不同含义部分以不同颜色标识,可以根据自己的需要进行栽剪。 4.2 其它形式扩展 了解了以上正则各部分代表的含义,互相间的关系后,就很容易扩展成其它格式的日期正则,如dd/MM/yyyy这种“日月年”格式的日期。 ^(?:(?:(?:0?[1-9]|1[0-9]|2[0-8])([-/.]?)(?:0?[1-9]|1[0-2])|(?:29|30)([-/.]?)(?:0?[13-9]|1[0-2])|31([-/.]?)(?:0?[13578]|1[02]))([-/.]?)(?!0000)[0-9]{4}|29([-/.]?)0?2([-/.]?)(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00))$ 这种格式需要注意的就是不能用反向引用来进行优了。连字符等可根据自己的需求栽剪。 4.3 添加时间的扩展 时间的规格很明确,也很简单,基本上就HH:mm:ss和H:m:s两种形式。 ([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9] 合入到日期的正则中,yyyy-MM-dd HH:mm:ss ^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)\s+([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$ 4.4 年份定制 以上所有涉及到平年的年份里,使用的是0001-9999。当然,年份也可以根据闰年规则定制。 如年份1600-9999,格式yyyy-MM-dd或yyyy-M-d,连字符可以没有或是“-”、“/”、“.”之一。 ^(?:(?:1[6-9]|[2-9][0-9])[0-9]{2}([-/.]?)(?:(?:0?[1-9]|1[0-2])\1(?:0?[1-9]|1[0-9]|2[0-8])|(?:0?[13-9]|1[0-2])\1(?:29|30)|(?:0?[13578]|1[02])\1(?:31))|(?:(?:1[6-9]|[2-9][0-9])(?:0[48]|[2468][048]|[13579][26])|(?:16|[2468][048]|[3579][26])00)([-/.]?)0?2\2(?:29))$ 5 特别说明 以上正则采用的是最基本的正则语法规则,绝大多数采用传统NFA引擎的语言都可以支持,包括JavaScript、Java、.NET等。 另外需求说明的是,虽然日期的规则相对明确,可以采用这种方式裁剪来得到符合要求的日期正则,但是并不推荐这样使用正则,正则的强大在于它的灵活性,可以根据需求,量身打造最合适的正则,如果只是用来套用模板,那正则也就不称其为正则了。 正则的语法规则并不多,而且很容易入门,掌握语法规则,量体裁衣,才是正则之“道”。

2012-08-07

FarPoint Spread.NET 开发的专业网格电子表格

FarPoint Spread.NET 开发的专业网格电子表格

2012-08-07

2007网络工程师学习笔记

2007网络工程师学习笔记,决对物超所值!

2007-11-23

Excel函数应用500例

Excel函数应用500例,办公好帮手!

2007-11-23

SQL语句精彩集锦

SQL语句精华版,想要的请进来。

2007-11-23

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除