NET平台开发CRM教学课件235_第1页
NET平台开发CRM教学课件235_第2页
NET平台开发CRM教学课件235_第3页
NET平台开发CRM教学课件235_第4页
NET平台开发CRM教学课件235_第5页
已阅读5页,还剩230页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一章CRM系统需求分析教学目标了解系统开发的设计方案理解项目的系统功能描述系统分析

CRM系统的功能由于操作人员的计算机知识有限,因此要求系统具有良好的人机界面如果系统的使用对象较多,则要求有较好的权限管理方便的数据查询功能方便的添加和修改数据功能在相应的权限下,可方便的删除数据自动记录电话销售跟踪情况方便的实现员工的绩效考核数据计算自动完成,尽量减少人工干预完善的数据备份、还原和清理功能系统分析

用例图总体设计系统架构总体设计开发工具数据库采用MicrosoftSQLServer2008Microsoft公司的VisualStudio2012编码规范数据库命名规范数据库命名以相关英文单词或缩写,例XtCRM数据表以相关英文单词或缩写或词组,例UserInfo字段一般采用英文单词或词组命名,如找不到专业的英文单词或词组,可以使用相同意义的英文单词或词组代替,例userID控件命名规则控件名称一般为表示该控件作用的英文单词的缩写,出现冲突时可采用不同的简写规则。另外,在编码过程中不涉及编码的控件,可以取默认名称。例txtUserName数据库设计方案数据表表UserInfo用于保存本系统用户的基本信息表CustomInfo用于保存企业客户的详细资料表CustomBSview用于保存客户每次购买产品的详细资料表CustomOrder用于保存客户购买商品所生成订单的详细资料表MemberInfo用于保存会员卡信息的详细资料表combo_customType用于保存客户类型的基本信息表CorpInfo用于保存企业的基本信息数据库设计方案数据表表DeptInfo用于保存企业部门的详细信息表EmpInfo用于保存企业内部员工的详细信息表EmpEaluate用于保存员工绩效考核的详细信息表ProductType用于保存产品类别的详细信息表ProductGroup用于保存产品分组的详细信息表ProductMessage用于保存产品的详细信息表ProductPromotion用于保存产品促销的详细信息

系统功能模块描述登录系统功能模块描述主窗体系统功能模块描述客户管理系统功能模块描述客户信息系统功能模块描述客户会员信息系统功能模块描述人事管理系统功能模块描述员工信息系统功能模块描述员工信息系统功能模块描述产品管理系统功能模块描述促销方案系统功能模块描述客户类型设置总结项目的需求分析数据库的设计方案22多文档程序设计第二章23教学目标理解文档视图结构处理的方式掌握.NET下MDI程序的设计

特点:文档是一种数据源视图是数据的用户窗口表现层和处理分离24文档/视图结构25文档/视图结构SalesGridViewSalesOtherViewSalesDocumentSalesChartViewSalesTrendView……一般来说,我们可以创建一个document类来管理我们需要处理的数据,然后创建若干个view类来以不同的方式展示这些数据

有两种基于文档视图结构程序的程序:单文档(SDI)多文档(MDI)26文档/视图结构文档/视图结构程序并不等同于一般所说的多文档程序文档/视图结构指出了一种数据和显示处理分离的处理模型多文档程序仅仅是程序中能同时显示和处理多个界面基于文档视图结构的单文档界面(SDI)应用程序:用户在同一时刻只能操作一个文档27文档/视图结构基于文档视图结构的多文档界面(MDI)应用程序:允许同时操作多个文档28文档/视图结构

文档/视图结构的优点:简化了设计开发过程。模块划分更合理、独立性更强:将数据操作和数据显示、用户界面分离。便于系统的扩展和重构。

29文档/视图结构

文档/视图结构的适用范围:适于大量数据要进行处理的场合。不适于以下场合:非面向数据的应用或数据量很少的应用程序。非标准的窗口用户界面的程序。30文档/视图结构设置窗体为MDI主窗体:IsMdiContainer=True;31.NET中MDI相关知识获取当前的子窗体集合MdiChildrenforeach(Fromfinthis.MdiChildren)

if(fisForm2)

f.focus();获取活动的主窗体ActiveMdiChild32.NET中MDI相关知识排列子窗体33.NET中MDI相关知识ArrangeIcons所有MDI子图标均排列在MDI父窗体的工作区内Cascade所有MDI子窗口均层叠在MDI父窗体的工作区内。TileHorizontal所有MDI子窗口均水平平铺在MDI父窗体的工作区内。TileVertical所有MDI子窗口均垂直平铺在MDI父窗体的工作区内。激活指定窗体ActivateMdiChild(Formform)Mainform.ActivateMdiChild(childForm);childForm.Focus();确定窗体是否是MDI子窗体或主窗体使用Form类的内部属性IsMdiChild/IsMdiContainerif(form.IsMdiChild) form.Show();else form.ShowDialog();34.NET中MDI相关知识设置MDI子窗体的数据Clipboard:剪贴板对象,该对象提供将数据置于系统剪贴板中以及从中检索数据的方法Clipboard.GetDataObject:检索当前位于系统剪贴板中的数据IdataObject.GetDataPresent:确定此实例中存储的数据是否与指定的格式关联。IdataObject.GetData:检索与指定的数据格式关联的数据。35.NET中MDI相关知识.NET中MDI相关知识IDataObjectdata=Clipboard.GetDataObject();if(data.GetDataPresent(DataFormats.Text){ stringtext=data.GetData(DataFormats.Text).ToString();}MDI子窗体的特点:MDI子窗体由MDI父窗体调度。MDI子窗体需要通过MdiParent指出其MDI父窗体。MDI子窗体不能以模式对话框的方式显示。37.NET中MDI相关知识ChildFormchildform=newChildForm();childform.MdiParent=this;childform.Show();MDI程序的菜单及子菜单的合并在主窗体中显示子窗体列表通过指定MdiWindowsListItem实现菜单的合并38.NET中MDI相关知识.NET中MDI相关知识Dotnet2.0中:MDI窗体菜单的合并涉及到Form的MainMenuStrip属性和MenuStrip的AllowMerge属性设置MDI主窗体和子窗体的MenuStrip菜单AllowMerge属性为true;设置MDI主窗体的MainMenuStrip菜单为一特定的MenuStrip菜单.NET中MDI相关知识MenuStrip合并相关属性MergeAction指示该菜单项的菜单与另一个菜单合并时该菜单项的行为,其值如下之一:Append忽略匹配结果,将该项追加到集合结尾Insert将该项插入目标集合中的匹配项前。如果匹配项在列表的结尾,将该项追加到列表。如果没有匹配项,将该项插入到集合的开始MatchOnly要求匹配项,但不进行任何操作,使用此方法来创建树和成功访问嵌套布局Remove:移除匹配项Replace:用源项替换匹配项。原始项的下拉项不会成为项的子项MergeIndex指示菜单项与另一个菜单项合并时的相对位置.NET中MDI相关知识注意:MDI子窗体的MenuStrip被合并到主窗体后回保留占位符,影响界面的显示效果,解决此问题要将窗体的菜单控件Visible属性设置为false即可。MDI程序的退出事件System.Windows.Forms.Form.ClosingSystem.Windows.Forms.Form.FormClosingSystem.Windows.Forms.Form.ClosedSystem.Windows.Forms.Form.FormClosedSystem.Windows.Forms.Form.Deactivate当主窗体引发了相应事件后,将通知并等待所有的子窗体处理同样的事件,只有当所有子窗体处理完相应的事件后,主窗体才继续下一个事件的处理。42.NET中MDI相关知识MDI中窗体和SDI窗体的行为差异MDI程序中的Opacity属性不影响MDI子窗体的外观CenterToParent方法不影响MDI子窗体的行为MDI应用程序中的MDI子窗体不能显示为模式窗体43.NET中MDI相关知识.NET下的MDI程序设计基于文档视图结构的多文档程序设计过程创建一个MDI主窗体类,此类提供如下服务:提供数据处理,扮演文档视图结构中的文档的角色创建一个或若干MDI子窗体,这些窗体负责以特定形式显示文档中的特定数据,扮演文档视图结构中的视图的角色45.NET下的MDI程序设计需求应用程序提供路径选择功能,选择特定的路径后,在一个窗口显示出该路径下的所有文本文件,可以同时显示多个路径下的文本文件列表在文件列表中双击指定的文件后,在新的窗口中显示其内容

46.NET下的MDI程序设计.NET下的MDI程序设计分析我们要创建的是一个基于文档视图结构的多文档程序我们要一个子窗体负责显示文本文件列表我们要一个子窗体显示指定文件的内容我们要一个主窗体类,此类完成如下负责提供要处理的路径调度视图的显示逻辑如果各个窗体存在通讯的话,处理这些通讯.NET下的MDI程序设计分析我们要一个主窗体类,此类完成如下负责提供要处理的路径调度视图的显示逻辑当指定一个新的路径时,调用视图显示文本文件列表当被要求打开指定的文件时调用相应的视图显示指定文件的内容如果各个窗体存在通讯的话,处理这些通讯在本程序中显示文件文件列表的视图将向主窗体报告用户要求打开文件创建MDI窗体类调度视图的显示逻辑TxtContentView的显示逻辑&视图之间的通讯49.NET下的MDI程序设计50总结文档/视图模型SDI&MDI.NET下的MDI程序设计第三章在.NET框架下开发三层结构数据库应用系统52教学目标理解三层结构掌握使用三层结构开发应用系统会使用OOP实现三层结构

53三层结构为什么需要三层结构54什么是三层结构所谓三层体系结构,就是在客户端与数据库之间加入了一个“中间层”,也叫组件层。三层结构中的“三层”是指表示层、业务逻辑层和数据访问层。55三层结构表示层:表示层主要负责完成用户和系统的交互。表示层的设计目标是简洁、方便、易操作。表示层一般为Windows应用程序或Web应用程序56三层结构业务逻辑层:业务逻辑层是业务处理的逻辑平台,该层所做的工作比较复杂,做业务上的数据校验,并实现业务流程,是表现层与数据访问层之间的桥梁public

static

stringGetPWD(stringname,stringpwd){

return

UserInfoDAL.GetPWD(name,pwd);//调用数据访问层的方法}57三层结构数据访问层:数据访问层主要实现对数据库的统一访问、操作和管理。数据访问层为系统提供规范、统一的数据访问入口该层根据业务逻辑层的请求去处理与数据库之间的交互,不对数据做任何业务上的加工在这里SQL语句是最多的public

static

stringGetPWD(stringname,stringpwd){

stringsql="selectempCodefromUserInfowhereuserName='"+name+"'anduserPWD='"+pwd+"'";

return(string)DBHelper.GetScalar(sql);}58三层结构三层之间的关系各层之间相互依赖三层模式之间通过自身提供的对外方法来传参访问。三层之间松耦合,互不干扰,同时层内部的各个类之间也是“松耦合”,各层之间的数据传递方向分为请求和响应两个方法数据传递方向59搭建三层结构搭建表示层60搭建三层结构搭建业务逻辑层61搭建三层结构搭建数据访问层62搭建三层结构添加各层之间的依赖关系实现业务逻辑层对数据访问层的依赖实现表示层对业务逻辑层的依赖63用OOP实现三层结构

什么是实体类实体类就是描述一个业务实体的“类”,是应用系统所涉及的对象,也是存储应用系统信息的数据表,我们将每一个数据表中的字段定义成变量,添加相应的属性,并将这些属性用一个类封装,这个类就称为“实体类”,

64三层结构中实体类的使用在表示层中使用实体类(1)将实体对象中封装的数据展示给用户当表示层接收到从业务逻辑层返回的实体对象,并将实体对象中封装的消息展示给用户时,表示层需要对实体对象中封装的信息进行解析。有两种情况:一种是对单个实体对象进行解析,另一种是对实体对象集合进行解析(2)将用户请求的数据封装到实体对象中在表示层,我们首先需要实例化实体对象,然后将用户请求的数据赋值给实体对象中对应的属性,就可将用户请求的数据封装到实体对象中65三层结构中实体类的使用在业务逻辑层中使用实体类业务逻辑层主要负责传递实体对象,并对实体对象中封装的数据进行处理。(1)将接收到的实体对象传递到下一层当业务逻辑层接收到装有信息的业务实体对象后,根据请求或响应将实体对象传到下一层。(2)根据用户请求对实体对象中的数据进行处理当我们使用实体类开发三层结构应用系统时,数据处理来自两个方面,一方面来自业务实体对数据的处理,实体类本身是由属性组成的,而大多都是可读写属性。另一方面来自业务逻辑对数据的处理。66三层结构中实体类的使用

在数据访问层中使用实体类(1)将数据库中的数据封装到实体对象中或将多个实体对象封装成集合。当用户的请求是数据查询请求时,数据访问层需要实现对数据库的查询访问。当请求的结果只有一条记录时,我们将这条记录封装成一个实体对象。当请求的结果是多条记录时,我们将每一条记录封装成一个实体对象,然后再将多个实体对象封装成List<T>集合。(2)将实体对象中的数据保存到数据库中当用户的请求是数据保存请求时,数据访问层首先对实体对象中封装的数据进行解析,然后将解析出的数据保存到数据库中。67三层结构中实体类的使用业务实体在三层结构中的作用与地位68实现三层结构应用

通过实现CRM系统中的客户信息的添加来演示三层结构的应用我们要完成的任务步骤如下:(1)实现业务实体①新增项目Model。②在其他项目中添加对实体项目的引用③编写实体类④添加需求所用数据库中表对应的实体类。(2)设计用户界面(3)实现数据访问层(4)实现业务逻辑层(5)实现表示层数据绑定69小结三层结构中的三层是指表示层、业务逻辑层、数据访问层各层的依赖顺序是:表示层依赖业务逻辑层,业务逻辑层依赖数据访问层搭建三层结构基本框架的步骤如下:搭建表示层、搭建业务逻辑层、搭建数据访问层、添加各层之间的相互依赖用OOP实现三层结构时,实体类是三层之间数据传递的载体使用实体类消除关系数据与类之间的差别,以更好的使用面向对象的思想来实现我们的系统在使用实体类开发三层结构,用户的请求需要返回实体对象集合时,可以使用List<T>实现70.NET数据集&数据提供程序第四章71教学目标了解数据库访问的发展过程理解ADO.NET的工作原理掌握ADO.NET操作数据库的方法72数据访问技术的发展ODBCNativeLibraryOLEDB(DAO/RDO)ADOADO.NET73OLEDBOLEDB的数据访问序列:初始化OLE连接到数据源发出命令处理结果释放数据源对象并停止初始化OLE74OLEDBOLEDB的组件模型:DataProviders数据提供者DataConsumers数据使用者ServiceComponents服务组件执行数据提供者一级数据使用者之间数据传递的工作75ADO.NETADO.NET的核心组件:DataSet.NETFramework数据提供程序76ADO.NETADO.NET结构图77ADO.NETDataSet:设计目的独立于任何数据源的数据访问组成一个或多个DataTable对象的集合数据行、数据列、主键、外键、约束和数据的关系信息用途容纳由.NETFrameworkDataProvider获取的数据或者XML中加载的数据78ADO.NET.NETFramework数据提供程序:组件的目的实现数据操作和对数据的快速、只进、只读访问组件的用途ConnectionCommandDataReaderDataAdapter79ADO.NET.NETFramework数据提供程序:SQLServer.NETFramework数据提供程序OLEDB.NETFramework数据提供程序ODBC.NETFramework数据提供程序Oracle.NETFramework数据提供程序80ADO.NET从数据源中获取数据,并保存到DataSet。81ADO.NET只有数据提供者,不用DataSet82DataSet的结构和使用DataSet结构图DataSet的结构和使用DataTable由行和列的集合信息构成,即DataColumn集合和DataRow集合构成写入数据Rows的Add方法Add(DataRowrow);Add(Paramobject[]values);DataTabletable=newDataTable(“students”);table.Columns.Add(newDataColumn(“Name”,typeof(string)));table.Columns.Add(newDataColumn(“Age”,typeof(int)));DataTabletable=newDataTable(“students”);table.Columns.Add(newDataColumn(“Name”,typeof(string)));table.Columns.Add(newDataColumn(“Age”,typeof(int)));DataRowrow=table.NewRow();row[“Name“]=“Neo”; row[“Age”]=27;table.Rows.Add(row); table.Rows.Add(newobjects[]{“Neo”,27});DataSet的结构和使用Relations表示两个DataTable对象之间的父/子关系,关系数据库的数据源的table之间的约束关系//定义关系对的父值DataColumnparent=DataSet1.Tables[“Customers”].Columns[“CustID”];//定义关系对的子值DataColumnchild=DataSet1.Tables[“Orders”].Columns[“CustID”];//定义关系DataRelationrelCustOrder=newDataRelation(“CustomersOrders”,parent,child);//将关系添加入到DataSet中DataSet1.Relations.Add(relCustOrder);DataSet的结构和使用ExtendProperties代表一些用户自定义的描述信息例如:存入数据的过期时间DataSet1.ExtendProperties.Add(“ExpiredTime”,DateTime.Now.Add(newTimeSpan(0,1,0,0)));86SQLServer数据提供程序的使用SqlConnection创建SqlConnection对象SqlConnectionconn=newSqlConnection(“DataSource=jy;InitialCatalog=EBuy;IntegratedSecurity=True”);连接字符串DataSource:指明服务器,机器域名或IP地址InitialCatalog:数据库的名字IntegratedSecurity:连接使用用户的Windows登录UserID:SQLServer中的用户名Password:SQLServer中的用户名匹配的密码87SQLServer数据提供程序的使用例:SqlConnectionconn=newSqlConnection(“DataSource=…;InitialCatalog=…;UserId=…;Password=…”);也可以直接实例化一个SqlConnection对象,然后用ConnectionString属性初始化该对象SqlConnectionconn=newSqlConnection();conn.connectionstring=“DataSource=…;InitialCatalog=…;UserId=…;Password=…”;打开:Open关闭:Close88SQLServer数据提供程序的使用SqlCommand创建SqlCommand对象SqlCommandcmd=newSqlCommand(“select*fromcustomer”,conn);SqlCommandcmd=newSqlCommand(); mandText=“select*fromcustomer”; cmd.CommandType=CommandType.Text; cmd.Connection=conn;TableDirect:直接的表操作StoredProcedure:存储过程命令Text:文本命令(一般是构造的SQL命令)89SQLServer数据提供程序的使用SqlCommandSqlCommand的参数SqlCommandcmd=newSqlCommand(); mandText=“selectnamefromCategorieswhereCategoryId=@CategoryId”; cmd.CommandType=CommandType.Text; SqlParameterparamID=newSqlParameter(“@CategoryId”,SqlDbT); paramID.Value=m_Id; cmd.Parameters.Add(paramID); cmd.Connection=conn;90SQLServer数据提供程序的使用SqlCommand查询数据使用SQL的select命令会得到一组数据集,应该使用SqlCommand对象的ExecuteReader方法SqlCommandcmd=newSqlCommand(“selectCategoryNamefromCategories”,conn); SqlDataReaderrdr=cmd.ExecuteReader(); stringmyvalue=rdr.Getstring(2); 91SQLServer数据提供程序的使用SqlCommand插入数据使用SqlCommand对象的ExecuteNonQuery方法stringinsertstring=@”insertintoCategories(CategoryName,Description)values(‘Miscellaneous’,’Whatever’)”; SqlCommandcmd=newSqlCommand(insertstring,conn); cmd.ExecuteNonQuery();92SQLServer数据提供程序的使用SqlCommand更新数据使用SqlCommand对象的ExecuteNonQuery方法,用于执行一个无返回值的sql查询stringupdatestring=@”updateCategoriessetCategoryName=‘other’whereCategoryName=‘Miscellaneous’”; SqlCommandcmd=newSqlCommand(updatestring); cmd.Connection=conn; cmd.ExecuteNonQuery();93SQLServer数据提供程序的使用SqlCommand删除数据使用SqlCommand对象的ExecuteNonQuery方法stringdeletestring=@”deletefromCategorieswhereCategoryName=‘other’; SqlCommandcmd=newSqlCommand(); cmd.CommandText=deletestring; cmd.Connection=conn; cmd.ExecuteNonQuery();94SQLServer数据提供程序的使用SqlCommand得到单一值使用SqlCommand对象的ExecuteScalar方法,能让数据库执行并且只返回你所需要的单独值SqlCommandcmd=newSqlCommand(“selectcount(*)fromCategories”,conn); intcount=(int)cmd.ExecuteScalar();95SQLServer数据提供程序的使用SqlDataReader创建SqlDataReader对象SqlDataReaderdr=cmd.ExecuteReader();读取数据快速只向前,只读一遍while(rdr.read()){ stringcontact=(string)rdr[“ContactName”]; stringcompany=(string)rdr[“companyName”]; Console.Write(“{0,-25}”,contact); Console.Write(“{0,-25}”,company);}96SQLServer数据提供程序的使用SqlDataAdapter管理与数据源的连接(DataSet只存储数据而不与数据源发生交互)例如:当data填充数据的时候打开连接将数据加载到DataSet中关闭连接97SQLServer数据提供程序的使用SqlDataAdapter得到SqlDataAdapter的实例使用SQL命令和连接对象来读写数据SqlDataAdapterCustomers=newSqlDataAdapter(“selectCustomerID,CustomerNamefromCustomers”,conn); select语句指明了将哪些数据读入数据集SqlCommandecmd=newSqlCommand(“selectCustomerID,CustomerNamefromCustomers”,conn); SqlDataAdapterCustomers=newSqlDataAdapter(cmd);98SQLServer数据提供程序的使用SqlDataAdapter用SqlDataAdapter获取数据一旦初始化号SqlDataAdapter,就可以调用其Fill方法将需要的数据加载到DataSetSqlConnectionconn=newSqlConnection("DataSource=YourSqlServer;

InitialCatalog=YourDataBase;UserID=YourID;Password=YourPassword");SqlCommandcmd=newSqlCommand("select*fromCustomers",conn);SqlDataAdapterda=newSqlDataAdapter(cmd);DataSetds=newDataSet();using(conn){conn.Open();da.Fill(ds);conn.Close();}99SQLServer数据提供程序的使用SqlDataAdapter使用SqlDataAdapter更新数据源100SQLServer数据提供程序的使用事务的处理使用SqlTransaction需要从连接对象中获取事物:SqlTransactiontrans=conn.BeginTransaction();获取事物后,把需要事物处理的操作包括到事物之中SqlConnectionconn=newSqlConnection();SqlCommandcmd=newSqlCommand(conn,“…");SqlDataAdapterda=newSqlDataAdapter(cmd);InitSqlDataAdapter(da,conn,);DataSetds=newDataSet();conn.Open();SqlTransactiontrans=conn.BeginTransaction();da.Fill(ds);try{UpdateDataSource(da,ds);trans.Commit();}catch{trans.Rollback();}finally{conn.Close();conn.Dispose();}102SQLServer数据提供程序的使用事务的处理使用TransactionScope创建一个隐式的事物过程Using(TransactionScopets=newTransactionScape()){ if(成功) ts.Complete();}SqlConnectionconn=newSqlConnection();SqlCommandcmd=newSqlCommand(conn,“…");SqlDataAdapterda=newSqlDataAdapter(cmd);InitSqlDataAdapter(da,conn);DataSetds=newDataSet();conn.Open();SqlTransactiontrans=conn.BeginTransaction();da.Fill(ds);using(TransactionScopets=newTransactionScope()){ UpdateDataSource(da,ds); trans.Commit();}104总结OLEDB组件模型ADO.NET操作数据ADO.NET核心组件.NETFramework数据提供程序的使用105使用DataGridView第五章106教学目标掌握DataGridView的使用。掌握DataGridView的数据处理。

107DataGridView:结构108DataGridView:结构由行和列的集合构成。Columns决定了显示的方式。行和列决定了一个单元格(DataGridViewCell)。Columns(列集合)即:DataGridViewColumnCollection决定了DataGridView的显示。列集合由DataGridViewColumn组成。109DataGridView:列类型DataGridViewTextBoxColumn用TextBox作为显示/输入工具的列使用该类型的列当用户编辑数据时,将使用TextBox作为输入空间DataGridViewCheckBoxColumn用CheckBox作为显示/输入工具的列DataGridViewImageColumn用于显示图像DataGridViewButtonColumn该列的每个单元格中显示按钮UseColumnTextFontButtonValue属性设置为true,使每个单元格显示相同的按钮文本Text属性是按钮的文本单元格的Button点击事件是通过DataGridView的CellContentClick事件响应的DataGridViewComboBoxColumn用于在单元格中显示下拉列表,可以包含如同ComboBox控件一样的选择项DataGridViewLinkColumn用于在单元格中显示连接110DataGridView:列类型例:Chapter05_01111步骤:定义一个编辑控件,该控件要实现IDataGridViewEditingControl接口。从DataGridViewCell或者它的继承类开始开始实现一个单元格,并明确指出寄宿编辑控件类型为(1)的类型,同时也指出容纳的值类型为(1)中的值类型。从DataGridViewColumn或者任何它的继承类开始定义新的列类型并重载CellTemplate属性,指明要使用的单元格。DataGridView:扩展列类型例:Chapter05_02DataGridView:扩展列类型113格式化DataGridView基本格式对象:DataGridViewCellStyle表示控件中的各个单元格的格式设置和样式信息头格式列格式行格式格式事件114格式化DataGridView头格式:行头格式: ColumnHeaderDefaultCellStyle,ColumnHeader…等列头格式: ColumnHeaderDefaultCellStyle,ColumnHeader…等115格式化DataGridView列格式:Column的DefaultCellStyle:设置单元格的默认单元格样式。(背景)this.data1.DefaultCellStyle.BackColor=Color.black;DisplayStyle:获取或设置一个值,该值确定当组合框处于非编辑模式时它的显示方式。116格式化DataGridView行格式:RowsDefaultCellStyle:获取或设置应用于DataGridView的行单元格的默认样式。AlternatingRowsDefaultCellStyle:设置交替行的格式RowTemplate:获取或设置一行,该行表示控件中所有行的模板。DataGridView中的列对象具有DefaultStyle等属性,可以单独对一个列指定格式格式化DataGridViewDataGridViewComboBoxColumnboxc=newDataGridViewComboBoxColumn();boxc.HeaderText=“国家”;…DataGridViewCellStylecellStyle=newDataGridViewCellStyle();cellStyle.BackColor=Color.FromKnowVolor(KnownColor.Aqua);cellStyle.ForeColor=Color.Red;cellStyle.Font=newFont(“Tahoma”,10);boxc.DefaultCellStyle=cellStyle;…118格式化DataGridView格式事件:如:

CellFormatting:单元格的内容被显示前被调用,用于格式化单元格设置该事件的DataGridViewCellFormattingEventArgs参数的CellStyle进行格式化。privatevoiddataGridView1_CellFormatting(objectsender,DataGridViewCellFormattingEventArgse){if(e.Value!=null&&e.Value.ToString().IndexOf("China")>=0){e.CellStyle.ForeColor=Color.Blue;e.CellStyle.BackColor=Color.Red;e.CellStyle.Font=newFont("Tahoma",10,FontStyle.Bold);}}DataGridView其他的显示格式的属性:CellBorderStyle:是DataGridViewCellBorderStyle类型的枚举值None:Raised:三维凸起边框Single:单行边框SingleHorizontal:水平单行边框Sunken:三维凹陷边框SunkenHorizontal:水平三维凹陷边框GridColor:当CellBorderStyle是Single、SingleHorizontal、SingleVertical时设置网格线的颜色格式化DataGridView120DataGridView:显示模式显示模式:非绑定:适合于显示数据量比较少的数据,必须手动填充该控件的行记录通常使用DataGridView的Rows属性的Add方法绑定:适合同外部数据进行交互通过设置DataGridView的DataSource属性可将控件直接连接到数据源无需主动管理即可存入和提取数据行当AutoGenerateColumns属性为true时,将在控件中为数据源中的第一列创建相对应的列虚模式(略,可不讲解)可以实现自己的数据管理,在与大量数据交互时优化121DataGridView:显示模式非绑定的数据处理:通过手动(or设计时)添加列定义显示结构通过Rows的Add等类似方法添加记录通过枚举Cell集合即(枚举Columns和Rows实现)读取数据dataGridView1.ColumnCount=4;dataGridView1.Rows.Add(newobject[]{“Col1”,”Col2”,”Col3”,”Col4”});122DataGridView:显示模式获取非绑定电子表格的值主要是通过查询每个单元格的Value属性来实现的foreach(DataGridViewRowrowinthis.dataGridView1.Rows){ if(!row.IsNewRow) foreach(DataGridViewCellcellinrow.Cells) MessageBox.Show(cell.Value.ToString());}123(1)通过设置DataGridView的DataSource属性,可将DataGridView控件直接连接到其数据源,此时,DataGridView自动构造相应的列类型,如想指定列类型,须设置AutoGenerateColumns属性为falseDataGridView:绑定模式124(2)用户在DataGridView上对数据的更改将反映到DataSourceDataGridView:绑定模式125(3)DataSource的值类型必须实现下列接口之一:IList接口,如ArrayList,数组等。IListSource接口,如,DataTable和DataSet类IBindingList接口,如,BindingList类。IBindingListView接口,如,BindingSource类。DataGridView:绑定模式126(4)DataSource绑定到BindingSource控件

(*BindingSource实现了IBindingListView接口,符合规则3)DataGridView:绑定模式DataGridView绑定到数据源时,必须将DataMember属性设置为指定要绑定的列表或表的字符串DataGridView绑定到BindingSource时,可以不设置DataGridView的DataMember属性,而设置BindingSource组件的DataMember属性dataGridView.DataSource=dataSet;dataGridView.DataMember=tableName;bindingSource.DataSource=dataSet;bindingSource.DataMember=tableName;…dataGridView.DataSource=bindingSource;127使用绑定模式操作数据源显示数据:指定列的创建方式:自动|Coding|设计状态指定从数据源获取数据,并置入符合绑定要求的数据类型将(2)获取的对象指定给DataSource属性。privateDataTableGetDataSource(){SqlConnectioncon=newSqlConnection();con.ConnectionString="DataSource=jy;InitialCatalog=peoples;IntegratedSecurity=True";DataSetds=newDataSet();SqlCommandcmd=newSqlCommand("select*fromemps",con);SqlDataAdapterda=newSqlDataAdapter(cmd);using(con){con.Open();da.Fill(ds);}if(ds.Tables.Count>0&&ds.Tables[0]!=null)returnds.Tables[0];elsereturnnull;}privatevoidBing(){dataGridView1.AutoGenerateColumns=false;dataGridView1.DataSource=GetDataSource();}使用DataGridView和ADO.NET维护记录DataGridView的AllowUserToAddRows属性可指示是否显示新记录行DefaultValuesNeeded事件可以初始化字段值CellValidating事件验证输入CellEndEdit事件:当用户输入为空时,将以一个红色的点提示用户输入错误,发现输入错误后,可以按“ESC”按钮取消例:Chapter05_03131使用绑定模式操作数据源要使用SqlDataAdapter更新外部数据,需要设置SqlDataAdapter的InsertCommand、UpdataCommand、DeleteCommand命令132使用绑定模式操作数据源数据维护1(介绍:使用ADO.NET批量更新方式):指定列的创建方式:自动|Coding|设计状态指定。使用ADO.NET的DataAdapter创建相应的命令(添加,删除,更新)。当用户更改DataGridView中的数据后,以DataGridView的DataSource作为更新对象,调用DataAdapter的Update实现数据维护。133使用绑定模式操作数据源数据维护2[可不介绍](介绍:逐条记录分别维护->添加命令列的方式实现.)134总结DataGridView结构格式化DataGridView扩展基本结构使用DataGridView处理数据绑定和非绑定模式以绑定方式处理数据添加数据源记录删除数据源记录更新数据源记录135对话框控件和打印第六章136教学目标理解打印对话框。掌握CommonDialog。掌握文件操作相关的对话框。

对话框对话框是一种用户界面接口,用于同用户进行交互,完成一些特定的任务提示对话框交互对话框CommonDialogCommonDialog是.net中对话框组件的基础System.Windows.Forms命名空间下的一个抽象类CommonDialog的2个方法和一个属性ShowDialog()/ShowDialog(IWin32Window):Reset()Tag:可以让用户在对话框中存储、维护自己的数据对话框的返回值(ShowDialog的返回值)返回一个类型为DialogResult的值DialogResult.OK在不同的对话框是代表不同的按钮对话框对话框的一般调用过程获取一个组件对象如果有必要就修改这些组件的参数的初始值调用ShowDialog显示这个组件的工作窗体,并判断返回值DialogResult以决定程序的下一步流程Dialogdialog=newDialog();dialog.属性……//初始化相关属性……if(dialog.ShowDialog()==DialogResult.OK){……//成功调用后的操作}else{……//非成功调用(比如“取消“)后的操作}140常用初始化属性(FileDialog):AddExtension和DefaultExt:AddExtension指出在打开和保存文件的时候,用户如果省略扩展名,指出是否自动加上扩展名(即:DefaultExt)InitialDirectory:指出对话框打开的初始路径,默认情况下初始路径是应用程序的执行路径RestoreDirectory指出对话框在关闭的时候是否恢复到初始路径SupporMultiDottedExtensions:是否支持形如aaa…txt的名称文件操作相关(1)141常用初始化属性(FileDialog):Title:窗体显示时的标题Filter:用于筛选文件的一个字符串

筛选字符串规则:

txtfiles(*.txt)|*.txt|第2个|第3个|……FilterIndex:有多个筛选项时,指出对话框中默认使用的筛选项 Filedialog.FilterIndex=1;FileName:文件对话框选择的文件FileNames/MultiselectValidateNames:指出是否验证名称合乎Win32中的命名规则文件操作相关(2)142常用初始化属性(FileDialog):OpenFileDialog和SaveFileDialog都是FileDialog的子类,

具有所有FileDialog的重要属性2.当正确调用文件对话框后,不论是OpenFileDialog还是 SaveFileDialog都可以由对话框的FileName获取要

打开/保存的文件名3.使用通用调用方式调用OpenFileDialog和SaveFileDialog文件操作相关(3)OpenFileDialog打开文件对话框选择一个文件然后读取内容privatestringGetFile(){ OpenFileDialogopenDialog=newOpenFileDialog(); openDialog.Filter=“txtfiles(*.txt)|*.txt|Allfiles(*.*)”; openDialog.FilterIndex=1; openDialog.RestoreDirectory=true; if(openDialog.ShowDialog==DialogResult.OK)return System.IO.File.ReadAllText(openDialog.FileName);}SaveFileDialog文件保存privatevoidSaveFile(){ SaveFileDialogsave=newSaveFileDialog(); save.AddExtension=true; save.DefaultExt=“txt”;

save.InitialDirectory=@”c:\”; if(save.ShowDialog()==DialogResult.OK) { System.IO.FileStreamfile=newSystem.IO.FileStream(save.FileName,System.IO.FilaMode.Create); for(Bytei=1;i<=100;i++) file.WriteByte(i); file.close();}}145常用初始化属性(FolderBrowerDialog):用于操作文件夹。常用初始化属性:RootFolder:初始根路径SelectedPath:成功操作后选择的路径ShowNewFolderButton:是否显示新建文件夹按钮当成功调用后使用SelectedPath获取选择的文件夹文件夹对话框(FolderBrowseDialog)文件夹对话框(FolderBrowseDialog)文件浏览对话框控件的方法:privatestringBrowserDialog(){ FolderBrowserDialogbrowser=newFolderBrowserDialog(); browser.ShowNewFolderButton=true; browser.RootFolder=Environment.SpecialFolder.MyComputer; if(browser.ShowDialog()==DialogResult.OK) returnbrowser.SelectedPath; else returnnull;}147ColorDialog(颜色对话框)常用的初始化属性(ColorDialog):Color:用于保存该对话框中选择的颜色AllowFullOpen:确定是否只使用预定义色SolidColorOnly:是否使用抖色FullOpen:默认状态下是否显示扩展颜色定义如正确调用,则由ColorDialog的Color属性获取选择的颜色ColorDialog(颜色对话框)

//用颜色对话框选取一个颜色并返回给调用者privateColorGetColor(){ ColorDialogcdlg=newColorDialog();//初始对话框组件 cdlg.AllowFullOpen=true; //启用“定义自定义颜色”按钮 cdlg.FullOpen=true; //默认显示右边部分 cdlg.SolidColorOnly=false; //使用抖动色 cdlg.ShowDialog(); //显示组件的工作窗体 returncdlg.Color; //获取选取的颜色并返回给调用者}ColorDialog(颜色对话框)

150FontDialog(字体设置对话框)FontDialog对话框的常用属性:AllowScriptChange:用于控制下拉框是否能够显示操作系统默认的字符集之外的字符集合FontMustExist:指出当用户选择、输入不存在的字体时,对话框是否提示AllowVerticalFonts:指出字体列表框中是否能显示垂直排列的字体MaxSize和MinSize:指定能使用的字体的最大和最小值ShowApply:是否显示应用按钮ShowColor:是否显示颜色下拉框ShowEffects:是否显示效果组内的选项如正确调用,则由FontDialog的Font属性获取选择的字体FontDialog(字体设置对话框)

//设置对话框的显示属性privatevoidSetFont(Formform){

FontDialogfd=newFontDialog();

fd.AllowScriptChange=true;fd.AllowSimulations=true;fd.AllowVerticalFonts=true;fd.FontMustExist=true;fd.MaxSize=30;fd.MinSize=6;fd.ShowApply=true;fd.ShowEffects=true;if(fd.ShowDialog()==DialogResult.OK) { form.Font=fd.Font; //设置窗体的显示字体为选择的字体 form.ForeColor=cd.Color;//设置窗体的显示字体前景色为选择的颜色 }}FontDialog(字体设置对话框)153打印:PrintDocument(1)PrintDocument用于控制如何具体打印一个文档PrintDocument的重要属性:DefaultPageSettings:打印页面设置,可由PageSetupDialog设置DocumentName:获取或设置打印文档时要显示的文档名PrinterSetting:打印机设置,可由PrintDialog设置Print方法:指出开始打印文档BeginPrint事件:在调用Print方法时并且在打印文档的第一页之前发生EndPrint事件:打印完文档的最后一页时发生PrintPage:每开始打印一个新的页面时发生154使用PrintDocument打印文档的步骤:获取PrintDocument对象,如有必要设置相关属性,如PrinterSetting实现PrintDocument的PrintPage事件,在该事件中利用PrintPageEventArgs参数的Graphics属性获取打印机的DC,并在该DC上绘制出打印的内容(同时使用其他参数控制绘制过程)调用Print进行打印例:打印指定的文件(详细讲解->本章重点):Chapter06打印:PrintDocument(2)155打印页面设置对话框

PageSetupDialog用于调整打印页面的相关属性(如:边距)。 常用初始化属性:AllowMargins:指示是否启用对话框的边距部分AllowOrientation:该值指示是否启用对话框的方向部分AllowPaper:该值指示是否启用对话框的纸张部分AllowPrinter:该值指示是否启用“打印机”按钮MinMargins:指示允许用户选择的最小边距156用于设置打印时候的页面设置成功调用后,可由PageSetupDialog的PageSettings属性获取设置信息。(比如:将该属性赋值给PrintDocument的DefaultPageSettings属性)。打印页面设置对话框

PageSetupDialog157打印:PrintDialog打印对话框用于打印文档时对打印机及其相关参数进行调整 其常用初始化属性:AllowCurrentPage:控制“当前页面”选项是否有效

AllowPrintToFile|PrintToFile:在选择“打印机”组中右下角一个可选框“打印到文件”,AllowPrintToFile控制是否启用|PrintToFile指出默认情况下该选择框是否被选中AllowSelection:控制“页面范围”组中部的“选定范围”是否启用AllowSomePages:控制要打印的“页码”项UseEXDialog:使用什么样的对话框面板158打印:PrintDialog成功调用后,可由PrintDialog的PrinterSettings属性获取设置信息比如:将该属性赋值给PrintDocument的PrinterSettings属性用于设置打印时候的打印机设置。159打印:PrintPreviewDialog用于显示PrintDocument在打印时的外观预览对话框要求设置其Document属性为一个PrintDocument对象。关联的PrintDocument要正确实现了打印的功能160打印:PrintPreviewDialog使用方式如下:初始化PrintPreviewDialog,包括用 Document属性关联到PrintDocument.使用ShowDialog显示预览框。161总结文件对话框(FileDialgo)OpenFileDialogSaveFileDialogFolderBrowseDialog颜色对话框(ColorDialog)字体对话框(FontDialog)打印对话框PrintDocumentPageSetupDialogPrintDialogPrintPreviewDialog162控件和组件的使用第七章163教学目标了解EventLog。理解Process、Timer。掌握TreeView、ListView。

节点节点信息:TreeNode对象 节点集合:TreeNodeCollection

所有的节点由TreeNode对象构成。每个节点都包含一个子节点的集合。动态维护节点(Add,Remove,AddRange方法)如: TreeNodenewNode=newTreeNode(“NewNode”); treeView1.SelectedNode.Nodes.Add(newNode);164TreeView节点设置图标:ImageList。ImageIndex:通过索引指出默认使用的图标ImageKey:使用图标的键值指出SelectImageIndex:节点被选中后的显示图标SelectImageKey:165TreeViewTreeView使用代码添加节点:每个节点都是TreeNode类型的对象每个节点都包含有用于容纳子节点的Nodes属性使用Nodes属性的Add方法添加节点TreeNodenewNode=newTreeNode(“NewNode”);treeView1.SelectedNode.Nodes.Add(newNode);使用Nodes属性的Remove方法移除单个节点treeView1.Nodes.Remove(treeView1.SelectedNode);使用Clear方法清除所有节点TreeView.Nodes.Clear();

节点BeginUpdate和EndUpdate方法BeginUpdate:阻止TreeView在每次添加项时重绘自身EndUpdate:通知TreeView重绘 treeView1.BeginUpdate(); foreach(stringNodeTextinAppNodes) treeView1.Nodes.Add(NodeText); treeView1.EndUpdate();167TreeView获取节点信息节点是按照树形结构填充的,用递

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论