软工学院1第三章资料管理-集合泛型一、教学标准(讲授本知识点需要达到的深度,也是学生学习本知识点需要达到的深度)1.掌握技能点:1)掌握集合的概念(熟练使用ArrayList、熟练使用HashTable)2)掌握泛型的概念、熟练使用.net中的两个泛型集合3)熟练使用DataGridView2.熟悉业务需要:1)理解集合的实际用途2)泛型的实际需要3)CRM客户关系管理系统中使用DataGridView显示数据3.实现了CRM客户关系管理系统的主要功能二、使用的讲授方法(打算采用什么方法讲授,以便让学生想的透、记得牢、用的好,最好过目不忘)先讲解集合,可以举个例子说明:盛水果的篮子,以引起学生的兴趣再举出集合使用的问题,再讲解泛型集合最后可以举出实际软件中的集合使用的案例:在没有使用数据库之前,我们的数据往往需要存储在一个特定的存储介质中,集合就是一个存储数据的好方法三、详细讲授思路(描述本知识点讲授过程的整体安排,主要讲构思)1、料模块中主要有包含有以下模块:区域信息管理,客户资料管理,竞争对手管理三个子模块,通过对客户相关资料的管理,实现了CRM客户关系管理系统的主要功能2、需求分析(业务逻辑)CRM客户关系管理系统开发的目标是实现企业管理的系统化,规范化和自动化,该系统模块:区域信息管理,客户资料管理,竞争对手管理等三个子功能,满足企业信息管理的需求。在各模块的使用中,登录用户自定义搜索条件对数据库中的信息进行检索。同时可以添加新的客户信息。以及对存储的信息进行修改和删除操作。软工学院2在CRM系统中,对于客户资料信息的操作是必要的,管理用户登录后,可对企业资料信息实现添加,在添加时编号将自动生成,并且不修改,对于客户的信息要进行数据的正确性检查。3、设计思路(实现思路)用户登录后,可以实现对资料信息的添加,当单击添加按钮时,客户编号将自动生成,此时可以输入资料的详细信息,在输入信息时必须输入正确的信息,如客户名称、客户等级、客户来源、所属行业、客户类别、所在区域、联系电话、传真号码、邮政编码、联系地址、电子邮箱、备注等相关的信息,通过正则表达式对其验证,输入无误的情况下,单击保存按纽刚实现保存功能,因为我们尚未学习连接数据库的知识,所以我们采用使用集合泛型来存储数据,在集合泛型中添加的是object,所以我们对每一个窗体创建一个对应类,类中的属性和界面控一一对应,如frmClientManage窗体中客户名称、客户等级、客户来源、所属行业、客户类别、所在区域、联系电话、传真号码、邮政编码、联系地址、电子邮箱、备注等控件,新建一个ClientInfo类,并新建属性ClientId、ClientInfo、ClientType、ClientNote等属性相对应,当用户单击保存按纽时,将控件中的值保存到ClientInfo表中,最后将使用集合泛型的添加方法将ClientInfo的对象添加到集合泛型中,信息添加成功后,使用DataGridView控件绑定集合泛型,实现数据的显示。4、需要用到的核心技术点a)集合的使用。b)泛型的使用。c)DataGridView的显示与绑定数据。d)常用的WinForm控件e)SQL语言基础f)Ado.Net1)知识点1:泛型集合泛型将类型参数的概念引入.NETFramework,类型参数使得设计如下类和方法成为可能:这些类和方法将一个或多个类型的指定推迟到客户端代码声明并实例化该类或方法的时候。例如,通过使用泛型类型参数T,您可以编写其他客户端代码能够使用的单个类,而不致引入运行时强制转换或装箱操作的成本或风险,如下所示://自定义泛型类publicclassGenericListT{voidAdd(Tinput){}}classTestGenericList{privateclassExampleClass{}staticvoidMain(){//定义一个集合装载int类型GenericListintlist1=newGenericListint();//定义一个集合装载string类型软工学院3GenericListstringlist2=newGenericListstring();//定义一个集合装载自定义类型GenericListExampleClasslist3=newGenericListExampleClass();}}使用泛型类型可以最大限度地重用代码、保护类型的安全以及提高性能。泛型最常见的用途是创建集合类。.NETFramework类库在System.Collections.Generic命名空间中包含几个新的泛型集合类。应尽可能地使用这些类来代替普通的类,如System.Collections命名空间中的ArrayList。您可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。可以对泛型类进行约束以访问特定数据类型的方法。关于泛型数据类型中使用的类型的信息可在运行时通过使用反射获取。.netFramework中的泛型集合在C#2.0之前,主要可以通过两种方式实现集合:使用ArrayList直接将对象放入ArrayList,操作直观,但由于集合中的项是Object类型,因此每次使用都必须进行繁琐的类型转换。使用自定义集合类比较常见的做法是从CollectionBase抽象类继承一个自定义类,通过对IList对象进行封装实现强类型集合。这种方式要求为每种集合类型写一个相应的自定义类,工作量较大。泛型集合的出现较好的解决了上述问题,只需一行代码便能创建指定类型的集合。完成案例所需要的技术内容。ListT利用System.Collections.Generic命名空间下面的ListT泛型类创建集合,语法如下:ListTListOfT=newListT();其中的T就是所要使用的类型,既可以是简单类型,如string、int,也可以是用户自定义类型。下面看一个具体例子。classPerson{privatestring_name;//姓名privateint_age;//年龄//创建Person对象publicPerson(stringName,intAge){this._name=Name;this._age=Age;}//姓名publicstringName{get{return_name;}软工学院4}//年龄publicintAge{get{return_age;}}}//创建Person对象Personp1=newPerson(张三,30);Personp2=newPerson(李四,20);Personp3=newPerson(王五,50);//创建类型为Person的对象集合ListPersonpersons=newListPerson();//将Person对象放入集合persons.Add(p1);persons.Add(p2);persons.Add(p3);//输出第2个人的姓名Console.Write(persons[1].Name);可以看到,泛型集合大大简化了集合的实现代码,通过它,可以轻松创建指定类型的集合。非但如此,泛型集合还提供了更加强大的功能,下面看看其中的排序及搜索。ListT排序:排序基于比较,要排序,首先要比较。比如有两个数1、2,要对他们排序,首先就要比较这两个数,根据比较结果来排序。如果要比较的是对象,情况就要复杂一点,比如对Person对象进行比较,则既可以按姓名进行比较,也可以按年龄进行比较,这就需要确定比较规则。一个对象可以有多个比较规则,但只能有一个默认规则,默认规则放在定义该对象的类中。默认比较规则在CompareTo方法中定义,该方法属于IComparableT泛型接口。请看下面的代码:classPerson:IComparablePerson{//按年龄比较publicintCompareTo(Personp){returnthis.Age-p.Age;}}CompareTo方法的参数为要与之进行比较的另一个同类型对象,返回值为int类型,如果返回值大于0,表示第一个对象大于第二个对象,如果返回值小于0,表示第一个对象小于软工学院5第二个对象,如果返回0,则两个对象相等。定义好默认比较规则后,就可以通过不带参数的Sort方法对集合进行排序,如下所示://按照默认规则对集合进行排序persons.Sort();//输出所有人姓名foreach(Personpinpersons){Console.WriteLine(p.Name);//输出次序为李四、张三、王五}实际使用中,经常需要对集合按照多种不同规则进行排序,这就需要定义其他比较规则,可以在Compare方法中定义,该方法属于IComparerT泛型接口,请看下面的代码:classNameComparer:IComparerPerson{//存放排序器实例publicstaticNameComparerDefault=newNameComparer();//按姓名比较publicintCompare(Personp1,Personp2){returnSystem.Collections.Comparer.Default.Compare(p1.Name,p2.Name);}}Compare方法的参数为要进行比较的两个同类型对象,返回值为int类型,返回值处理规则与CompareTo方法相同。其中的Comparer.Default返回一个内置的Comparer对象,用于比较两个同类型对象。下面用新定义的这个比较器对集合进行排序://按照姓名对集合进行排序persons.Sort(NameComparer.Default);//输出所有人姓名foreach(Personpinpersons){Console.WriteLine(p.Name);//输出次序为李四、王五、张三}Dictionary:Dictionary(Of(TKey,TValue))包含键/值对集合。它的Add方法采用两个参数,一个用于键,另一个用于值。若要初始化Dictionary(Of(TKey,TValue))或其Add方法采用多个参数的任何集合,请将每组参数括在大括号中,如下面的(学生简单信息管理)示例所示:Dictionaryint,StudentNamestudents=newDictionaryint,StudentName(){{111,newStudentName{FirstName=Sachin,LastName=Karnik,ID=211}},软工学院6{112,newStudentName{FirstName=Dina,LastName=Salimzianova,ID=317,}},{113,newStudentName{FirstName=Andy,LastName=Ruth,ID=198,}}};请注意每个对象初始值设定项中的三对大括号。最内层的大括号括起了Scores列表的对象初始值设定项。下一组大括号括起了Student的初始值设定项,而最外层的大括号括起了将要添加到studentsDictionary(Of(TKey,TValue))中的键/值对的初始值设定项。最后,整个集合初始值设定项被括在一对大括号内。2)知识点3:DataGridViewDataGridView控件提供用来显示数据的可自定义表。使用DataGridView类,可以通过使用DefaultCellStyle、ColumnHeadersDefaultCellStyle、CellBorderStyle和GridColor等属性对单元格、行、列和边框进行自定义。下面的代码示例演示如何初始化一个未绑定的DataGridView。privatevoidledgerStyleButton_Click(objectsender,System.EventArgse){//Cr