Presentation is loading. Please wait.

Presentation is loading. Please wait.

郑州轻工业学院网络中心 胡光武 hgw@zzuli.edu.cn .NET技术交流 郑州轻工业学院网络中心 胡光武 hgw@zzuli.edu.cn.

Similar presentations


Presentation on theme: "郑州轻工业学院网络中心 胡光武 hgw@zzuli.edu.cn .NET技术交流 郑州轻工业学院网络中心 胡光武 hgw@zzuli.edu.cn."— Presentation transcript:

1 郑州轻工业学院网络中心 胡光武 hgw@zzuli.edu.cn
.NET技术交流 郑州轻工业学院网络中心 胡光武

2 交流内容 .NET框架及VS.NET7.0开发环境介绍 .NET面对对象的概念及VB.NET语法介绍 ASP.NET开发基础
ADO.NET进行数据访问 .NET类库简介与组件技术 XML及Web Services介绍 网站开发建设中的若干问题及Win32 Application开发介绍

3 学习方法 参考书籍 MSDN 在线论坛(

4 .NET Framework简介 什么是.NET
Microsoft® .NET 是 Microsoft XML Web Services 平台。XML Web Services 允许应用程序通过 Internet 进行通讯和共享数据,而不管所采用的是哪种操作系统、设备或编程语言。Microsoft .NET 平台提供创建 XML Web Services 并将这些服务集成在一起之所需。

5 .NET Framework简介 .NET Framework的目标
提供一个一致的面向对象的编程环境,而无论对象代码是在本地存储和执行,还是在本地执行但在 Internet 上分布,或者是在远程执行的。 提供一个将软件部署和版本控制冲突最小化的代码执行环境。 提供一个保证代码(包括由未知的或不完全受信任的第三方创建的代码)安全执行的代码执行环境。 提供一个可消除脚本环境或解释环境的性能问题的代码执行环境。 使开发人员的经验在面对类型大不相同的应用程序(如基于 Windows 的应用程序和基于 Web 的应用程序)时保持一致。 按照工业标准生成所有通信,以确保基于 .NET Framework 的代码可与任何其他代码集成。

6 .NET Framework简介 .NET框架基本构成 公共语言运行库(Common Language Runtime,CLR)
.NET Framework 具有两个主要组件:公共语言运行库和 .NET Framework 类库。公共语言运行库是 .NET Framework 的基础。您可以将运行库看作一个在执行时管理代码的代理,它提供核心服务(如内存管理、线程管理和远程处理),而且还强制实施严格的类型安全以及可确保安全性和可靠性的其他形式的代码准确性。事实上,代码管理的概念是运行库的基本原则。.NET Framework 的另一个主要组件是类库,它是一个综合性的面向对象的可重用类型集合,您可以使用它开发多种应用程序,这些应用程序包括传统的命令行或图形用户界面 (GUI) 应用程序,也包括基于 ASP.NET 所提供的最新创新的应用程序(如 Web 窗体和 XML Web services)。

7 .NET Framework简介 公共语言运行库
公共语言运行库管理内存、线程执行、代码执行、代码安全验证、编译以及其他系统服务。这些功能是在公共语言运行库上运行的托管代码所固有的。

8 .NET Framework简介 托管(managed)代码 以运行库为目标的代码称为托管代码 非托管(unmanaged)代码
不以运行库为目标的代码称为非托管代码

9 .NET Framework简介 公共语言运行库特性 安全性检查 自动内存管理 提高开发效率 仍可以使用COM和DLL
随着越来越多的黑客程序和病毒的出现,使得人们对Internet的安全性越来越关注。公共语言运行库针对托管组件的来源,给不同的托管组件赋予不同程序的信任。运行库强制还实施代码访问安全,如嵌入在Web页中的可执行文件能够在屏幕上播放动画或音乐,但不能访问用户的个人数据、文件系统或网络。 运行库自动处理对象布局并管理对对象的引用,在不再使用它们的时候进行释放。这种自动内存管理解决了两个重要的问题:内在泄漏和无效地址引用。 程序员可以用他们选择的开发语言编写应用程序,但仍能充分利用其他开发人员用其他语言所编写的运行库、类库和组件。任何选择以运行库为目标编译器供应商都可以这样做。 尽管运行库是未来的软件所设计的,但是它也能支持现在和以前的软件。托管和非托管代码之间互操作性使开发人员能够继续使用所需的COM组件和DLL。

10 .NET Framework简介 托管代码执行过程 编译器 JIT 源代码 MSIL 本机代码
编译将源代码翻译为MSIL并生成所需的元数据,现在有多种编译器可以生成MSIL 执行时,实时编译器将MSIL翻译为本机代码,本机代码是运行于JIT编译器所在同一计算机结构上的CPU特定的指令代码,开发人员可以编写一组可在不同结构的计算机上进行JIT编译和执行MSIL,如果托管代码调用平台相关的、本机API或平台特定的类库,则它只能运行于特定的操作系统上。在编译过程中,代码必须通过验证过程,该过程检查MSIL和无数据以查看是否可以将代码确定为类型安全。 首次调用时,将对其进行JIT编译,然后执行。下次执行该方法时,将执行JIT编译过的本机代码。 在执行过程中,托管代码接收自动内存管理、安全性、同非托管代码的互操作性,跨语言调用支持、增强的部署和版本控制支持等服务。

11 .NET Framework简介 反编译问题 VB3/4 P-代码 有很好的编译工具 VB5/6 本机代码 少有好的编译工具
 VB MSIL ildasm,ilasm Dotfuscator

12 .NET Framework简介 自动内存管理 跨语言支持及CLS 程序集(Assembly)
 “程序集”通过描述特定组件或应用程序的所有必需文件来替换和扩展类型库的能力。一个程序集可以包含一个或多个命名空间。 1.自动内存管理是公共语言库在托管过程中提供的服务之一。公共语言库的垃圾回收器(Garbage Collector)为应用应用程序,管理内存的分配和释放。对开发人员而言... 初始化新进程时,运行库会为进程保管一个连续的地址空间区域,这个保留的地址空间就称为托管堆.托管堆维护一个指针,这个指针指向分配堆下一个要分配的地址.最初... 从托管堆中分配内存要比非托管内存分配速度要快.由于... 垃圾回收器的优化引擎根据已执行的分配决定执行回收的最佳时间.垃圾回收器在执行回收时,会释放应用程序不再使用的对象所占用的内存. 2.语言交互性是一种代码与使用其他编程语言编写的另一种代码进行交互的能力.语言互用性可以有助于最大程序地提高代码的重复使用率,从而提高开发过程的效率.要和其他对象完全交互,而不管这些对象是以何种语言实现的,对象必须只向调用方公开那些它们必须与之互用的所有语言的通用功能。为此定义了公共语言规范 (CLS),它是许多应用程序所需的一套基本语言功能。 3.程序集(Assembly)是.NET框架应用程序的主要构造块..NET之所以要引入程序集的概念,实际上是为了解决Windows目前版本控制问题.

13 .NET Framework简介 .NET Framework 类库
.NET Framework 类库是一个与公共语言运行库紧密集成的可重用的类型集合。该类库是面向对象的,并提供您自己的托管代码可从中导出功能的类型。这不但使 .NET Framework 类型易于使用,而且还减少了学习 .NET Framework 的新功能所需要的时间。此外,第三方组件可与 .NET Framework 中的类无缝集成。

14 .NET Framework简介 .NET类库的功能 脚本应用程序或寄宿的应用程序
 控制台应用程序。  脚本应用程序或寄宿的应用程序  Windows GUI 应用程序(Windows 窗体)。  ASP.NET 应用程序。  XML Web services。  Windows 服务

15 .NET Framework简介 .NET类库的功能 表示基础数据类型和异常。 Windows GUI的支持,包括窗体和控件等
 表示基础数据类型和异常。  Windows GUI的支持,包括窗体和控件等  文件I/O、目录访问和注册表访问。  数据库访问(ADO.NET)。  网络和Web游览。  访问Windows操作系统、环境变量等  COM的互操作性  图形技术(GDI+)

16 .NET Framework简介 .NET框架环境

17 .NET Framework简介 命名空间(Namespace)
命名空间用来组织程序集中所定义的所有对象,通过按照层次结构组织类、接口和方法来避免命名冲突。程序集可以包括多个命名空间,而命名空间可以包含其他命名空间,避免了引用的多义性,也简化了引用。 dim LBox as System.Windows.Forms.ListBox

18 .NET Framework简介 命名空间(Namespace) 防止多义性 引用命名空间
 防止多义性  引用命名空间  注意:在命名空间内,可以定义模块、接口、类、委托、枚举、结构以及其他命名空间项,但不能定义属性、过程、事件。而这些项必须在模块、结构或类这样的容器中声明。

19 .NET Framework简介 类库的查看 常用类库的作用 Microsoft命名空间
Microsoft.CSharp,Mircrosoft.VisualBasic,Microsoft.Win32  System命名空间  System,System.Collections,System.Data,System.Diagnostics   System.Drawing,System.IO,System.Net,System.Security System.Text,System.Threading,System.Timer, System.Xml System.Web.Services,System.Web.UI,System.Window.Form

20 .NET Framework简介 关于.NET的一些问题 .NET平台是否支持所有的操作系统?
在.NET Framework1.0下开发的软件是否可以在新版本的.NET Framework下运行? Visual Basic.NET和C#哪一种语言更好? 开发工具是否一定要使用Visual Studio.NET? Q2:在 .NET Framework 1.0 版的基础上,.NET Framework 1.1 版进行了扩展,不仅对现有的功能做了改进,还新增了一些功能,并对文档进行了增强。 增加对移动设备的编程,数据访问及安全性,并增加对IPv6的支持。

21 Visual Studio.NET集成开发环境介绍
安装过程及注意事项 Visual Studio.NET集成开发环境简单介绍 Q1:Visual Studio .NET 提供了四种版本:专业版、企业级开发版、企业级结构设计版和学院版。各标准版中还分别提供了 Visual Studio 中包含的核心语言:Visual Basic、Visual C++、Visual C# 和 Visual J#。各版本的区别见:ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/vsintro7/html/vxoriVisualStudioEditions.htm Q2:硬件要求:P2450,推荐P3600M以上,推荐256M内存,系统驱动器上有 900 MB,安装驱动器上有 4.1GB,支持的操作系统为Windows® 2000、Windows XP、Windows Server 2003 或 Windows NT 4.0,Windows NT 4.0 仅支持远程组件安装。在 Windows NT 4.0 上不能安装 Visual Basic、Visual C++、Visual C# 和 Visual J#。 Windows XP Home 不支持本地 Web 应用程序开发; Microsoft Windows 2000 Datacenter Server 不是受支持的操作系统   软件要求:开发 ASP Web 应用程序和 XML Web services 必须装IIS;编译与 Microsoft Windows 消息队列 (MSMQ) 相关的代码需安装消息队列服务 ;在远程计算机上调试代码需安装Visual Studio 远程调试器 ;使用源代码管理来控制存储过程的版本需安装Visual Studio 6.0 存储过程版本控制Visual SourceSafe Microsoft SQL Server

22 VB.NET语法简介及与VB6的区别 数据类型 VB.NET .NET 字节数 取值范围 Boolean System.Boolean 2
True False Byte System.Byte 1 0-255 Char System.Char Date System.Datetime 8 0001 年 1 月 1 日凌晨 0:00:00 到 9999 年 12 月 31 日晚上 11:59:59。

23 VB.NET语法简介及与VB6的区别 数据类型 VB.NET .NET 字节数 取值范围 Object System.Object 4
Short System.Short 2 -32,768 到 32,767。 Single System. 负值取值范围为 E+38 到 E-45;正值取值范围为 E-45 到 E+38。 String 取决于实现平台 0 到大约 20 亿个 Unicode 字符。

24 VB.NET语法简介及与VB6的区别 数据类型 VB.NET .NET 字节数 取值范围 Decimal System.Decimal 16
Double System.Double 8 负值取值范围为 E+308 到 E-324;正值取值范围为 E-324 到 E+308。 Integer System. 4 -2,147,483,648 到 2,147,483,647。 Long System.Long -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。

25 VB.NET语法简介及与VB6的区别 数据类型长度的变化 CurrencyDecimal VariantObject
String类型的改变 自定义类型不再支持Type…End Type,必须用Structure…End Structure

26 VB.NET语法简介及与VB6的区别 数据类型转换 CBool(expression) CByte(expression)
 CChar(expression)  CDate(expression)  CDbl(expression)  CDec(expression)  CInt(expression)  CLng(expression)  CObj(expression)  CShort(expression)  CSng(expression)  CStr(expression)

27 VB.NET语法简介及与VB6的区别 变量的声明  Dim I,J,K As Integer ‘注意与VB6的区别 变量的使用范围

28 VB.NET语法简介及与VB6的区别 运算符方面的改变 算术运算符:/ \
算术运算符:/ \ 赋值运算符:+=,-=,/=,\=,*=,&=,^=,<<=,>>=等,但不支持++,--,%= 新增Like,IS,TypeOf…IS对象比较运算符 &和+都能进行字符串的连接操作 逻辑运算符方面,除原有的And,Or,Not,Xor操作符外,新增AndAlso,OrElse两个短路运算符 新增移位操作符<< >> AddressOf ,GetType 运算符 类型安全 1/将两个数相除并返回以浮点数表示的结果。 Dim MyValue As Double MyValue = 10 / 4 ' Returns 2.5. MyValue = 10 / 3 ' Returns \将两个数相除并返回以整数形式表示的结果。 Dim myValue As Integer myValue = 11 \ 4 ' Returns 2 2 &=连接 String 变量与 String 表达式,并将结果赋给该变量。 Dim var1 As String = "Hello " Dim var2 As String = "World!" var1 &= var2 ' The value of var1 is now "Hello World!" ^=计算以该变量值为底、以表达式为指数的幂,并将结果赋回给该变量。 Dim var1 As Integer = 10 Dim var2 As Integer = 3 var1 ^= var2 ' The value of var1 is now 1000. <<=对变量值执行数学左移位,并将结果赋给该变量。 Dim Var As Integer = 10 ' Variable containing bit pattern to shift. Dim Shift As Integer = 3 ' Amount to shift bit pattern. Var <<= Shift ' The value of Var is now 80. AndAlso对两个表达式执行简化逻辑合取。 OrElse用于对两个表达式执行短路逻辑析取。 3.Like比较两个字符串。如果 string 匹配 pattern,则 result 为 True;如果不匹配,则 result 为 False。如果 string 和 pattern 都是空字符串,则结果是 True。否则,如果 string 或 pattern 中有一个为空字符串,则结果为 False。 ?任何单个字符*零或更多字符#任何单个数字(0 到 9)[charlist]charlist 中的任何单个字符[!charlist]不在 charlist 中的任何单个字符 Dim myCheck As Boolean myCheck = "F" Like "FFF" ' Does "F" match "FFF"? Returns False myCheck = "F" Like "[A-Z]" ' Does "F" occur in the set of ' characters from A to Z? Returns True. IS比较两个对象引用变量。 Is 运算符确定两个对象引用是否引用同一个对象。但是,它不执行值比较。如果 object1 和 object2 都引用同一个对象,则 result 为 True;否则 result 为 False。 Dim myObject As New Object Dim otherObject As New Object Dim yourObject, thisObject, thatObject As Object yourObject = myObject thisObject = myObject thatObject = otherObject myCheck = yourObject Is thisObject ' Returns True. myCheck = thatObject Is thisObject ' Returns False. myCheck = myObject Is thatObject ' Returns False, if myObject is not thatObject. 可以用 TypeOf...Is 运算符测试对象是否为特定类型。语法为 TypeOf <object expression> Is <TypeName> Dim x As Button x = New Button() If TypeOf x Is Control Then ' Insert code to continue program execution. 因为 x 的类型是 Button,而 Button 从 Control 继承,所以 TypeOf x Is Control 表达式计算为 True。 ========================================================================= 6 AddressOf创建引用特定过程的过程委托实例。 以下示例使用 AddressOf 运算符来指定线程的启动函数。 Imports System.Threading ' Access threading namespace. Public Sub CountSheep() Dim i As Integer = 1 ' Sheep don't count from 0. Do While (True) ' Endless loop. Console.WriteLine("Sheep " & i & " Baah") i = i + 1 Thread.Sleep(1000) 'Wait 1 second. Loop End Sub Sub UseThread() Dim t As New System.Threading.Thread(AddressOf CountSheep) t.Start() GetType:返回指定类型的 Type 对象。Type 对象可以用于检索关于类型的信息,如类型的属性、方法和事件。 GetType(Integer) ' Returns the integer Type object. ================================================= 7 类型安全:操作数通常应为同一类型。例如,如果要加一个 Integer 变量,应将其与另一个 Integer 变量相加,将结果值赋予的变量也应为 Integer 类型。 确保采用良好类型安全编码的一种方法是使用 Option Strict。如果 Option Strict 为 On,则 Visual Basic .NET 自动执行类型安全的转换。因此,如果试图将 Integer 变量与 Double 变量相加,并将结果值赋予一个 Double 变量,则运算正常进行。另一方面,不安全的或双字节到单字节转换将导致编译器错误。因此,如果试图将 Integer 变量与 Double 变量相加,并将结果值赋予一个 Integer 变量,则导致编译器错误,因为 Double 变量无法隐式转换为 Integer 类型。 但是,如果 Option Strict 为 Off,则允许发生这些隐式的双字节到单字节转换,但是可能导致意外丢失数据或丢失精度。因此,建议编写产品代码时使用 Option Strict On。 另外Option Explicit 语句用于在文件级强制对该文件中的所有变量进行显式声明。

29 VB.NET语法简介及与VB6的区别 函数调用的区别 部分函数不能再使用 Byval与ByRef与VB6的区别 数组方面的区别
异常处理的更改 控制语句的更改 1 在asp中调用response.write x 和response.write(X)都正确,但是在asp.net里第一种方法不再正确 2 部分函数如now(),date()函数不能再使用,必须使用System.Datetime类 3 VB6的函数传递参数方式为ByRef即传递引用地址,而VB.Net则是默认传递值Byval 4 5 on error goto err_hander语法用try…catch…finally取代 6 while…wend语句不存在,而采用while…end while

30 VB.NET语法简介及与VB6的区别 流程控制语句 决策控制 循环控制 With语句 Exit语句 1 if…then…end if
if…then…elseif…elseif…else…end If Switch case Var Case … Case else End switch

31 VB.NET语法简介及与VB6的区别 其他改变 Set关键字不再保留 事件过程的改变 Tab键顺序的修改 默认属性的改变
用户自定义属性的改变 Windows程序设计中一些事件及属性的改变 2 VB6以name_event来命名事件过程,而vb.net采用handles语句 4 在VB6中,对象都可以默认属性.例如,Caption是Label控件的默认属性 Label1=“hello”与Label1.caption=“hello”是等价的,而VB.net不支持这种默认属性,除非属性是带有参数的集合属性. 5 对于自定义属性,采用Property Get,Property Let,Property Set语句来设置或获得属性值,而VB7引入了新的属性声明语法.这样保证了属性特征的一致性. 如 Private MonthNum as Integer=1 Property Month() as Integer Get return MonthNum End Get Set(Byval value as Integer) MonthNum=value End Set End Property

32 VB.NET处理数据结构 数组 枚举 常量 结构 集合与列表 散列表 1 定义一维数组 Dim friends(4) as string
1 定义一维数组  Dim friends(4) as string Friends(0)=“abc” 定义多维数组 Dim matrix(9,9) as integer Dim I, J As Integer Dim MaxDim0, MaxDim1 As Integer ' Highest subscripts, not lengths. Dim MatrixA(9, 9) As Double MaxDim0 = MatrixA.GetUpperBound(0) ' Maximum for first dimension. MaxDim1 = MatrixA.GetUpperBound(1) ' Maximum for second dimension. For I = 0 To MaxDim0 For J = 0 To MaxDim1 MatrixA(I, J) = (I * 10) + J Next J Next I 维数的访问,一维数组,可以通过length方法,多维数组的length方法返回整个数组的大小,多维数组可以通过GetUpperBound/GetLowerBound(维数),但不管一维或多维,都可以采用Ubound和Lbound方法 Dim A(100, 5, 4) As Byte UBound(A, 1) =100 因此必须人为的解释下标为0的事实 调整数组的大小 Redim Preserve关键字 遍历方法 For Each…Next For…Next 排序,利用System.Array.Sort()方法 ===================================== 枚举:枚举提供一种使用成组的相关常数以及将常数值与名称相关联的方便途径。例如,可以为一组与一周中的七天相对应的整数常数声明一个枚举,然后在代码中使用这七天的名称而不是它们的整数值。用 Enum 语句在类或模块的声明部分创建枚举。 Public Enum Days Sunday=1 Monday=2 Tuesday=3 Wednesday=4 Thursday=5 Friday=6 Saturday=7 End Enum ============================================================ 常量:代码经常包含反复出现的常数值。它也可能依赖于某些难于记忆或没有明显意义的数值。使用 Const 语句声明常数并设置它的值。通过声明一个常数,可以为值分配有意义的名称。声明常数后,就不能修改它或为它分配新值。 Public Const DaysInYear = 365 Public Const Four As Integer = 4, Five As Integer = 5, Six As Integer = 44 结构:使用 Structure 语句作为结构声明的开始,并使用 End Structure 语句作为结构声明的结束。在这两条语句中必须至少声明一个成员。成员可以属于任何数据类型,但必须至少包括一个非共享变量或事件。 Private Structure Employee Public GivenName As String ' This employee's given name. Public FamilyName As String ' This employee's family name. Public Extension As Long ' This employee's telephone extension. Private Salary As Decimal ' This employee's annual salary. Public Sub GiveRaise(Raise As Double) ' Raise this employee's salary. Salary *= Raise End Sub Public Event ReviewTime() ' This employee must be reviewed. End Structure ======================================== 集合请参考System.Collections 散列表 System.Data.Hashtable

33 VB.NET处理数据结构 数组 1. 数组是指具有同一数据类型的数据列表 2. 一维数组
1. 数组是指具有同一数据类型的数据列表 2. 一维数组    Dim s(9) As string ‘定义一个长度为10的字符串数组 Dim friends() As String={“A”,”B”,”C”) 3. 动态数组(ReDim Preserve) 4. 多维数组 Dim friends(2,2) As string 5. 数组的操作(正向遍历、反向遍历,排序) For Each…Next  For…Next 6. UBound和LBound关键字

34 VB.NET处理数据结构 枚举 常量 Const关键字 1. 目的:为了限制存储到变量的值的取值范围,防止无效值
1. 目的:为了限制存储到变量的值的取值范围,防止无效值 2. 只能基于Integer,Long,Short和Byte数据类型,如果未显示指定基础类型,则默认值为 Integer   Public Enum Color As Integer Red=1 Green=2 Blue=3 End Enum 常量  Const关键字

35 VB.NET处理数据结构 结构 1. 创建 Public Structure Customer
1. 创建   Public Structure Customer Public FirstName as String Public LastName as String Public as String End Structure 2. 声明 Dim testCustomer As Customer

36 VB.NET面对对象编程 类与对象 类是对象的符号表示形式。与蓝图描述构成建筑的项一样,类以同样的方式描述组成对象的属性、字段、方法和事件。就像一副蓝图可以用于建成多座建筑一样,一个类也可以用于根据需要创建多个对象。就像蓝图定义使用建筑的人可以访问建筑的哪些部分一样,类也可以通过封装来控制用户对对象项的访问。 “类”和“对象”这两个术语有时互换使用,但实际上,类描述对象的“结构”,而对象则是类的可用“实例”。每个实例都是其类的一个精确而又不同的副本。由于对象是类的一个“实例”,所以创建对象的动作就称为“实例化”。 类由字段、属性、方法和事件组成。字段、属性、方法和事件是类的成员。

37 VB.NET面对对象编程 字段和属性 属性和字段表示对象中存储的信息。 字段实际上就是类中定义的变量,可以直接读取或设置它们。
属性是使用Property Get和Property Set过程实现,这些过程对如何设置或返回值提供了更多的控制,可以在分配或检索值之前验证这些值。 类由字段、属性、方法和事件组成。字段和属性表示对象包含的信息。字段类似于变量,因为可以直接读取或设置它们。例如,如果有一个名为 Car 的对象,则可以在名为 Color 的字段中存储其颜色。 属性的检索和设置方法与字段类似,但是属性是使用 Property Get 和 Property Set 过程实现的,这些过程对如何设置或返回值提供更多的控制。在存储值和使用此值的过程之间的间接层帮助隔离数据,并使您得以在分配或检索值之前验证这些值。

38 VB.NET面对对象编程 方法 方法表示对象可执行的操作。通过类中添加Sub过程或函数来定义方法 事件 事件是导致执行某过程的通知。对象可同时处理和生成事件。使用 RaiseEvent 语句生成事件,使用 Handles 关键字或 AddHandler 语句处理事件。 方法表示对象可执行的操作。例如,Car 对象可以有 StartEngine、Drive 和 Stop 方法。通过向类中添加过程(Sub 例程或函数)来定义方法。 事件是对象从其他对象或应用程序接收的通知,或者是对象传输到其他对象或应用程序的通知。事件使对象得以在每当特定情况发生时执行操作。Car 类的一个事件示例是 Check_Engine 事件。因为 Microsoft Windows 是事件驱动的操作系统,所以事件可来自其他对象、应用程序或用户输入(如鼠标单击或按键)。

39 VB.NET面对对象编程 封装 指将一组相关属性、方法和其他成员视为一个单元或对象。对象可以控制更改属性和执行方法的方式。 封装还使您可以控制如何使用数据和过程 继承 类可以继承和扩展其他类的特性。作为新类的基础的类称为“基类”。从基类派生的类称为“派生类”。派生类继承基类中定义的所有字段、属性、方法和事件。这就意味着可以开发和调试类一次,然后将其作为其他类的基础重复使用。 Public Dim 语句中的 Public 关键字声明的元素可从以下位置访问:同一项目中的任意位置,引用该项目的其他项目,以及由该项目生成的程序集。以下代码显示了示例 Public 声明: Public Class ClassForEverybody 仅可以在模块、命名空间或文件级使用 Public。这意味着可以在源文件中或在模块、类或结构内(但不能在过程中)声明 public 元素。 Protected Dim 语句中的 Protected 关键字声明元素仅可以从同一个类内,或该类的派生类中访问。以下代码显示了示例 Protected 声明: Protected Class ClassForMyHeirs 只能在类级且仅当声明类的成员时才能使用 Protected。 Friend Dim 语句中的 Friend 关键字声明元素可以从同一个项目内访问,但不能从项目外部访问。以下代码显示了示例 Friend 声明: Friend StringForThisProject As String 仅可以在模块、命名空间或文件级使用 Friend。这意味着,可以在源文件中或在模块、类或结构内(但不能在过程中)声明 friend 元素。 Protected Friend Dim 语句中的 Friend 关键字和 Protected 关键字一起声明元素可以从派生类或同一项目内或二者进行访问。以下代码显示了示例 Protected Friend 声明: Protected Friend StringForProjectAndHeirs As String 只能在类级且仅当声明类的成员时才能使用 Protected Friend。 Private Dim 语句中的 Private 关键字声明元素仅可以从同一模块、类或结构内访问。以下代码显示了示例 Private 声明: Private NumberForMeOnly As Integer 仅可以在模块、命名空间或文件级使用 Private。这意味着可以在源文件中或在模块、类或结构内(但不能在过程中)声明 private 元素。 在模块级,没有任何可访问性关键字的 Dim 语句与 Private 声明等效。 ======================================= Visual Basic .NET 引入了下列类级别语句和修饰符以支持继承: Inherits 语句 — 指定基类。 NotInheritable 修饰符 — 防止程序员将该类用作基类。 MustInherit 修饰符 — 指定该类仅适于用作基类。无法直接创建 MustInherit 类的实例,只能将它们创建为派生类的基类实例。(其他编程语言,如 C++ 和 C#,使用术语“抽象类”来描述这样的类。) 继承:Inherits 语句导致类继承指定类的所有非私有成员。 Class Class1 Sub Method1() MessageBox.Show("This is a method in the base class.") End Sub Overridable Sub Method2() MessageBox.Show("This is another method in the base class.") End Class Class Class2 Inherits Class1 Public Field2 as Integer Overrides Sub Method2() Messagebox.Show("This is a method in a derived class.") Protected Sub TestInheritance() Dim C1 As New class1() Dim C2 As New class2() C1.Method1() ' Calls a method in the base class. C1.Method2() ' Calls another method from the base class. C2.Method1() ' Calls an inherited method from the base class. C2.Method2() ' Calls a method from the derived class.

40 VB.NET面对对象编程 多态(重写) 基于继承的多态性 基于接口的多态性
“多态性”指定义具有功能不同但名称相同的方法或属性的多个类的能力,这些类可由客户端代码在运行时交换使用。 基于继承的多态性 基于接口的多态性 关于继承的多态 例如,可以定义一个类 BaseTax,该类提供计算某个州/省的销售税的基准功能。从 BaseTax 派生的类,如 CountyTax 或 CityTax,如果适合的话可实现如 CalculateTax 这样的方法。 多态性来自这样一个事实:可以调用属于从 BaseTax 派生的任何类的某个对象的 CalculateTax 方法,而不必知道该对象属于哪个类。 下面示例中的 TestPoly 过程演示基于继承的多态性: Const StateRate As Double = ' %5.3 State tax Const CityRate As Double = ' %2.8 City tax Public Class BaseTax Overridable Function CalculateTax(ByVal Amount As Double) As Double Return Amount * StateRate ' Calculate state tax. End Function End Class Public Class CityTax ' This method calls a method in the base class ' and modifies the returned value. Inherits BaseTax Private BaseAmount As Double Overrides Function CalculateTax(ByVal Amount As Double) As Double ' Some cities apply a tax to the total cost of purchases, ' including other taxes. BaseAmount = MyBase.CalculateTax(Amount) Return CityRate * (BaseAmount + Amount) + BaseAmount Sub TestPoly() Dim Item1 As New BaseTax() Dim Item2 As New CityTax() ShowTax(Item1, 22.74) ' $22.74 normal purchase. ShowTax(Item2, 22.74) ' $22.74 city purchase. End Sub Sub ShowTax(ByVal Item As BaseTax, ByVal SaleAmount As Double) ' Item is declared as BaseTax, but you can ' pass an item of type CityTax instead. Dim TaxAmount As Double TaxAmount = Item.CalculateTax(SaleAmount) MsgBox("The tax is: " & Format(TaxAmount, "C")) 关于接口的继承 接口提供在 Visual Basic .NET 中可实现多态性的另一种方法。接口描述属性和方法的方式与类相似,但与类不同,接口不能提供任何实现。多个接口具有允许软件组件的系统不断发展而不破坏现有代码的优点。 若要使用接口实现多态性,应在几个类中以不同的方式实现接口。客户端应用程序可以以完全相同的方式使用旧实现或新实现。基于接口的多态性的优点在于,不需要重新编译现有的客户端应用程序就可以使用新的接口实现。 下面的示例定义名为 Shape2 的接口,该接口在名为 RightTriangleClass2 和 RectangleClass2 的类中实现。名为 ProcessShape2 的过程调用 RightTriangleClass2 或 RectangleClass2 实例的 CalculateArea 方法: Sub TestInterface() Dim RectangleObject2 As New RectangleClass2() Dim RightTriangleObject2 As New RightTriangleClass2() ProcessShape2(RightTriangleObject2, 3, 14) ProcessShape2(RectangleObject2, 3, 5) Sub ProcessShape2(ByVal Shape2 As Shape2, ByVal X As Double, _ ByVal Y As Double) MessageBox.Show("The area of the object is " _ & Shape2.CalculateArea(X, Y)) Public Interface Shape2 Function CalculateArea(ByVal X As Double, ByVal Y As Double) As Double End Interface Public Class RightTriangleClass2 Implements Shape2 Function CalculateArea(ByVal X As Double, _ ByVal Y As Double) As Double Implements Shape2.CalculateArea ' Calculate the area of a right triangle. Return 0.5 * (X * Y) Public Class RectangleClass2 ' Calculate the area of a rectangle. Return X * Y Overrides 可选项。指示该 Function/sub/property过程重写基类中的同名过程。参数的个数和数据类型以及返回值的数据类型都必须完全与基类过程中它们各自的个数和数据类型匹配。 Overridable 可选项。指示该 Function/sub/property 过程可被派生类中的同名过程重写。Overridable 是自身可重写基类过程的过程的默认设置。 NotOverridable 可选项。指示该 Function/sub/property 过程无法在派生类中被重写。NotOverridable 是自身不能重写基类过程的过程的默认设置。 MustOverride 可选项。指示该 Function/sub/property 过程在此类中未实现,必须在派生类中实现以使该类可创建。

41 VB.NET面对对象编程 重载 “重载”过程是指使用相同的名称但不同的参数列表,在多个版本中定义过程。重载的目的是定义过程的若干个密切相关的版本,而不需要通过名称来区分它们,而是使用不同的参数列表。 重载规则及注意事项 隐藏 重载是在一个类中用相同的名称但是不同的参数类型创建一个以上的过程、实例构造函数或属性。 “重载”过程是指使用相同的名称但不同的参数列表,在多个版本中定义过程。重载的目的是定义过程的若干个密切相关的版本,而不需要通过名称来区分它们,而是使用不同的参数列表。 当对象模型指示对于在不同数据类型上进行操作的过程使用同样名称时,重载非常有用。例如,可显示几种不同数据类型的类可以具有类似如下所示 Display 过程: Overloads Sub Display(ByVal theChar As Char) ' Add code that displays Char data. End Sub Overloads Sub Display(ByVal theInteger As Integer) ' Add code that displays Integer data. Overloads Sub Display(ByVal theDouble As Double) ' Add code that displays Double data. 如果不使用重载,那么即使每个过程执行相同的操作,也需要为它们创建不同的名称,如下所示: Sub DisplayChar(ByVal theChar As Char) Sub DisplayInt(ByVal theInteger As Integer) Sub DisplayDouble(ByVal theDouble As Double) 因为重载提供了对可用数据类型的选择,所以它使得属性或方法的使用更为容易。例如,可以用下列任一代码行调用前面讨论过的重载 Display 方法: Display("9"C) ' Call Display with a literal of type Char. Display(9) ' Call Display with a literal of type Integer. Display(9.9R) ' Call Display with a literal of type Double. 重载规则 用同样名称添加两个或更多属性或方法可以创建类的一个重载成员。除了重载派生成员,每一个重载成员必须具有不同的参数列表。当重载属性或过程时,下面的项不能用作区分特征: 应用于成员或成员参数的修饰符,如 ByVal 或 ByRef。 参数名 过程的返回类型 重写:重写派生类中的属性和方法 默认情况下,派生类从其基类继承方法。如果继承的属性或方法需要在派生类中有不同的行为,则可以“重写”它,即,可以在派生类中定义该方法的新实现。下列修饰符用于控制如何重写属性和方法: 隐藏:同一模块、类或结构中的编程元素可以名称相同但范围不同。当以这种方式声明了两个元素,并且代码引用了它们共享的名称时,范围较窄的元素将隐藏其他元素(块范围是最窄的)。 Module Mod4 Public Num As Integer ' This Num is a module-level variable. Sub Show() Dim Num As Integer ' This Num is a local variable. Num = 2 ' Local Num has a value of 2. MsgBox(CStr(Mod4.Num)) ' Mod4.Num has a value of 1. Sub UseModuleLevelNum() Num = 1 ' Set module-level Mod4.Num to 1. ' ... Show() ' Call Show, which displays module-level Num. End Module Shadows 可选项。指示此类隐藏基类中的同名编程元素。可以用其他任何类型的元素来隐藏任何类型的被声明元素。被隐藏的元素在隐藏它的派生类内不可用,除非隐藏元素不可访问,例如,如果它为 Private。

42 VB.NET面对对象编程 接口 和类一样,接口也定义了一系列属性、方法和事件。但与类不同的是,接口并不提供实现。它们由类来实现,并从类中被定义为单独的实体。 接口表示一种约定,实现接口的类必须严格按其定义来实现接口的每个方面。 Interfaces 定义类所能实现的属性、方法和事件。接口允许将功能定义为一些紧密相关的属性、方法和事件的小组;这样就减少了兼容性问题,因为可以在不损害现有代码的情况下开发接口的增强型实现。在任何时候都可以通过开发附加接口和实现来添加新的功能。 Visual Basic .NET 以前的 Visual Basic 版本可以使用接口,但不能直接创建它们。Visual Basic .NET 引入了 Interface 语句,它使您能够从类将真正的接口定义为独特的实体,并用改进版本的 Implements 关键字来实现这些接口。 定义:接口定义包含在 Interface 语句和 End Interface 语句之间。在 Interface 语句后面,可以选择性地添加一个 Inherits 语句,由它列举一个或多个继承接口。 示例: 以下示例定义了两个接口。第二个接口 Interface2 对 Interface1 做了继承,且定义了一个附加属性和方法。 Interface Interface1 Sub sub1(ByVal i As Integer) End Interface Interface Interface2 Inherits Interface1 ' Demonstrates interface inheritance. Sub M1(ByVal y As Integer) ReadOnly Property Num() As Integer 下一个示例则实现上一示例中所定义的接口 Interface1: Public Class ImplementationClass1 Implements Interface1 Sub Sub1(ByVal i As Integer) Implements Interface1.Sub1 ' Place code here to implement this method. End Sub End Class 最后一个示例则实现 Interface2,包括自 Interface1 继承的方法: Public Class ImplementationClass2 Implements Interface2 Dim INum As Integer = 0 Sub sub1(ByVal i As Integer) Implements Interface2.Sub1 ' Place code here that implements this method. Sub M1(ByVal x As Integer) Implements Interface2.M1 ReadOnly Property Num() As Integer Implements _ Interface2.Num Get Num = INum End Get End Property

43 VB.NET面对对象编程 共享成员 共享成员是由一个类的所有实例共享的属性、过程和字段。一些编程语言将这样的项称为“静态成员”。 事件与委托
异常处理 共享成员是由一个类的所有实例共享的属性、过程和字段。一些编程语言将这样的项称为“静态成员”。 共享过程是不与类的特定实例相关联的类方法。例如,在 Math 类中定义的 Cos 方法是共享方法。可以通过两种方法调用共享过程:将其作为对象的方法调用或直接从类调用。这样,对于必须先创建类的实例然后才能使用它的规则,共享过程为例外。 事件:事件是一个信号,它告知应用程序有重要情况发生。例如,用户单击窗体上的某个控件时,窗体引发一个 Click 事件并调用一个处理该事件的过程。事件还允许在不同任务之间进行通信。比方说,您的应用程序脱离主程序执行一个排序任务。若用户取消这一排序,应用程序可以发送一个取消事件让排序过程停止。 声明事件 使用 Event 关键字在类、结构、模块和接口内部声明事件,如以下示例所示: Event AnEvent(ByVal EventNumber As Integer) 引发事件 事件就像是通告已发生重要情况的消息。广播该消息的行为叫引发事件。在 Visual Basic .NET 中,使用 RaiseEvent 语句引发事件,如以下示例所示: RaiseEvent AnEvent(EventNumber) 必须在声明事件的范围内引发事件。例如,派生类不能引发从基类继承的事件。 事件发送器 任何能引发事件的对象都是事件发送者,也称事件源。窗体、控件和用户定义的对象都是事件发送器 事件处理程序 事件处理程序是相应事件发生时调用的过程。您可以将任何有效子例程用作事件处理程序。可是,不能将函数用作事件处理程序,因为它不能将值返回给事件源。 关联事件与事件处理程序 在事件处理程序生效之前,首先必须使用 Handles 或 AddHandler 语句将它与事件关联。 可将 Try...Catch...Finally 语句用于结构化异常处理 Public Sub TryExample() Dim x As Integer = 5 ' Declare variables. Dim y As Integer = 0 Try ' Set up structured error handling. x /= y ' Cause a "Divide by Zero" error. Catch ex As Exception When y = 0 ' Catch the error. MsgBox(ex.toString) ' Show friendly error message. Finally Beep() ' Beep after error processing. End Try End Sub

44 VB.NET面对对象编程 Me关键字 MyClass关键字 MyBase关键字 UML图 早期绑定和晚期绑定 类与模块的区别
Me:通过 Me 关键字,可以引用当前在其中执行代码的类或结构的特定实例。 Sub ChangeFormColor(FormName As Form) Randomize() FormName.BackColor = Color.FromArgb(Rnd() * 256, Rnd() * 256, Rnd() * 256) End Sub 可以使用以下语句来调用此过程并将“窗体”(Form) 类的当前实例作为参数传递: ChangeFormColor(Me) MyClass 的行为类似于引用最初实现时类的当前实例的对象变量。MyClass 与 Me 类似,但对它的所有方法的调用都按该方法为 NotOverridable 来处理。因此,所调用的方法不受派生类中的重写影响。 MyBase 关键字的行为类似于引用类的当前实例的基类的对象变量。 当对象分配给对象变量时,Visual Basic 编译器执行名为“绑定”的进程。当对象分配给声明为特定对象类型的变量时,该对象为“早期绑定”。早期绑定对象允许编译器在应用程序执行前分配内存以及执行其他优化。 与之相对,当对象分配给声明为 Object 类型的变量时,该对象为“晚期绑定”。这种类型的对象可以保存对任何对象的引用,但没有早期绑定对象的很多优越性。 类和模块均是封装在它们中定义的项的引用类型,但它们在从其他过程如何访问这些项上有所不同。 类和模块之间的主要差异在于类可以实例化而标准模块不能。因为标准模块的数据不会有多个副本,所以当程序的一部分更改标准模块中的一个公共变量时,如果程序的其他任何部分随后读取该变量,则都会获取同样的值。另一方面,类数据对于每个实例化的对象都是独立存在的。另一个不同在于:不像标准模块,类可以实现接口。

45 VB.NET面对对象编程 不同语言下关键字对比 常见问题 是把多个类放在同一个文件中好,还是每个类放在一个单独的文件中好?
程序中经常调一个函数,按照面对对象的思想是否应该把该类放一个类中 当对一个类进行调用时,是否必须生成该类的一个对象,然后利用该对象去调用? 编码规范 参考:ms-help://MS.MSDNQTR.2003FEB.2052/vsintro7/html/vxoriLanguageEquivalentsKeywords.htm Q4:ms-help://MS.MSDNQTR.2003FEB.2052/vsent7/html/vxconcodingtechniques.htm

46 Web Form技术 Web Form技术相对于ASP有如下优点: 创建动态Web用户界面的功能更强大,使其创建过程更简单
页面无需脚本程序或者cookie,能够满足任何浏览器客户端的需要 页面兼容ASP语法结构 服务器端控件使压缩合并公用功能简单临易行 自带内置服务器控件,并且支持第3方产品 服务器端控件可以创建适用于高.低版本浏览器的HTML内容 模板提供了定制列表服务器控件外观及行为的简单方法 验证控件可以处理客户端或者服务器端的数据验证工作 Web form是纯文本文件,以.aspx作为文件扩展名.当客户端浏览器请求一个.aspx文件时,asp.net将解析并编译目标文件为.NET架构类,接着这个类动态处理客户端的请求. Aspx文件只在第一次访问时被编译,随后的再次请求将重用这个类实例. Asp.net提供了兼容asp的语法结构,其中包括支持<%...%>代码块,使用它混合编写html以及aspx代码.这些代码段按照从上到下的顺序在页面中被执行.与asp不同的是,.aspx文件中位于<%%>之间的代码是被编译过的,而不是使用脚本引擎解释执行的.这样处理后,将大大地提高程序的运行效率.

47 Web Form技术 HTML服务器端控件 Web服务器端控件 验证服务器端控件 Web窗体语法 ASP.NET正则表达式
Asp.net所提供的Server控件有两种,HTML控制元件是以HTML标记为基础而衍生出来的控制元件.Web服务器控件是ASP.NET针对HTML服务器端控件不足而新增的控制元件,除了提供属性读取及设定的功能外,还具体“方法”及“事件驱动”的能力

48 HTML服务器端控件 默认情况下,ASP.NET 文件中的 HTML 元素被视为文本,并且页面开发人员不能以编程方式访问。若要使这些元素能够以编程方式访问,可以通过添加 runat="server" 属性,指示应将 HTML 元素作为服务器控件分析和处理。 唯一的 id 属性允许以编程方式引用该控件。属性用于声明服务器控件实例上的属性参数和事件绑定。 HTML 服务器控件必须驻留在具有 runat="server" 属性的包含 <form> 标记中。 ASP.NET 不要求文本(非动态的)HTML 内容的格式正确,但它确实要求所有 HTML 元素要正确结束(用一个后缀“/”或结束标记)和干净地嵌套(不允许出现重叠标记)。如果没有正确结束 HTML 元素,ASP.NET 将无法识别该元素。该元素将被忽略或者将发生编译错误,具体取决于该元素的构成方式。 可以用三种不同的方法创建任意 Web 窗体控件的实例:作为 HTML 文档中的元素创建;在应用程序快速开发 (RAD) 环境中创建,该环境允许您将控件拖到页上;或以编程方式在代码声明块或代码隐藏文件中创建。

49 HTML服务器端控件 共享的HTML控件属性 HTMLAnchor HTMLButton HTMLForm
HtmlGenericControl HTMLImage HTMLInputButton HTMLInputCheckBox 1. ms-help://MS.MSDNQTR.2003FEB.2052/cpgenref/html/cpconsharedhtmlcontrolproperties.htm

50 HTML服务器端控件 共享的HTML控件属性 HTMLInputFile HTMLInputHidden HTMLInputImage
HtmlInputRadioButton HTMLInputText HTMLSelect HTMLTable 1. ms-help://MS.MSDNQTR.2003FEB.2052/cpgenref/html/cpconsharedhtmlcontrolproperties.htm

51 HTML服务器端控件 共享的HTML控件属性 HTMLTableCell HTMLTableRow HTMLTextArea
1. ms-help://MS.MSDNQTR.2003FEB.2052/cpgenref/html/cpconsharedhtmlcontrolproperties.htm

52 HTML服务器端控件 HTMLAnchor
创建一个服务器端控件,该控件映射到 <a> HTML 元素并允许您链接到其他 Web 页。 <a id="programmaticID" href="linkurl" name="bookmarkname" OnServerClick="onserverclickhandler" target="linkedcontentframeorwindow" title="titledisplayedbybrowser" runat="server" > linktext </a> 请记住将 HtmlAnchor 控件嵌入 HtmlForm 控件的开始和结束标记中。 下一步,编写一个事件处理程序来向 HtmlControl 的 HRef 属性分配一个 URL。 虽然 HtmlAnchor 控件不直接支持绑定到数据源,但可以从数据源中的字段的值生成超级链接。首先将数据源绑定到列表控件,如 Repeater。然后在列表控件内部声明一个 HtmlAnchor 控件。最后添加 HRef 属性值的内联代码,使用 DataBinder 类的 Eval 方法指定要使用的字段。

53 HTML服务器端控件 HTMLButton
创建一个服务器端控件,该控件映射到 <button> HTML 元素并允许您创建普通按钮。 <button id="programmaticID" OnServerClick="onserverclickhandler" runat="server" > buttontext, image, or control </button> 使用 HtmlButton 控件对 HTML <button> 元素进行编程。可以为 HtmlButton 控件的 ServerClick 事件提供自定义代码,以指定在单击该控件时执行的操作。 <button> 元素在 HTML 4.0 规范中定义。因此,仅在 Microsoft Internet Explorer 4.0 NetScape6.0版及更高版本中支持 HtmlButton 控件。 且必须放在<form runat=“server”></form>之间

54 HTML服务器端控件 HTMLForm 创建一个服务器端控件,该控件映射到 <form> HTML 元素并允许您为 Web 页中的元素创建一个容器。 <form id="programmaticID" method=POST | GET action="srcpageURL" runat="server" > Other controls, input forms, and so on. </form> 在Asp中,表单数据的处理采用的是数据上传模式,在asp.net中则是事件驱动模式.不过相对于asp,asp.net则是首次引用事件驱动程序设计,在asp.net中,许多对象(如page,button对象.listbox对象等)都有事件驱动,在asp.net中,每个.aspx网页就是一个page对象,它有page_load和page_unload事件 由于asp.net表单中,由于是事件驱动,而表且表单及处理表单的程序同属于一个.aspx网页,所以不必通过request对象来读取数据 注意: 不能在单个 Web 窗体页上包含多个 HtmlForm 控件。默认情况下,将 HtmlForm 控件的 method 属性设置为 POST。您可以根据需要自定义 method 属性,但如果将 method 属性设置为 GET 或 POST 以外的值,则可能破坏内置视图状态并回送 Web 窗体提供的服务。 注意:  action 属性总是设置为页本身的 URL。无法更改 action 属性;因此,只能向页本身回送。

55 HTML服务器端控件 HtmlGenericControl
创建服务器端控件,该控件映射到不由特定的 .NET Framework 类表示的 HTML 元素(如 <body> 和 <div>)。 <span | body | div | font | others id="programmaticID" runat="server" > Contentbetweentags </span | body | div | font | others> 下面的示例显示可以如何基于 HtmlInputText 控件中的用户输入生成要显示的文本。通过在页上声明 <span> 元素创建的 HtmlGenericControl 为 <span> 元素提供对 InnerHtml 属性的访问。这使您可以操作分配给 <span> 元素的文本字符串。 [Visual Basic] Page Language="VB" AutoEventWireup="True" %> <html> <head> <script runat="server"> Sub SubmitBtn_Click(Source As Object, e As EventArgs) MySpan.InnerHtml = "Welcome to ASP.NET, " & myText.Value & "." End Sub </script> </head> <body> <form id="myForm" runat="server"> <p>Enter your name here: <input type="text" id="myText" runat="server"> <br><br> <input type="submit" Value="Click Here!" OnServerClick="SubmitBtn_Click" runat="server"> <b><span id="MySpan" runat="server"/><b> </form> </body> </html> [C#] Page Language="C#" AutoEventWireup="True" %> void SubmitBtn_Click(object Source, EventArgs e) { MySpan.InnerHtml = "Welcome to ASP.NET, " + myText.Value + "."; } 下面的示例显示可以如何使用 HtmlGenericControl 来允许用户修改页的背景色。它还显示如何使用 AttributeCollection 类以编程方式访问可在任何 HTML 控件上声明的属性。 Body.Attributes("bgcolor") = ColorSelect.Value <body id=Body runat="server"> <h3>Updating Styles with the HtmlGenericControl</h3> <form runat="server"> <p> Select a background color for the page: <p> <select id="ColorSelect" runat="server"> <option>White</option> <option>Wheat</option> <option>Gainsboro</option> <option>LemonChiffon</option> </select> <input type="submit" runat="server" Value="Apply" OnServerClick="SubmitBtn_Click">

56 HTML服务器端控件 HtmlImage 创建服务器端控件,该控件映射到 <img> HTML 元素并允许您显示图像。 <img id="programmaticID" alt="alttext" align= top | middle | bottom | left | right border="borderwidth" height="imageheight" src="imageURL" width="imagewidth" runat="server" > 使用 HtmlImage 控件对 HTML <img> 元素进行编程。此控件使您可以通过使用 Src、Width、Height、Border、Alt 和 Align 属性,分别动态地设置和检索图像的源、宽度、高度、边框宽度、替换文本和对齐方式。 注意   此控件不需要结束标记。

57 HTML服务器端控件 HtmlInputButton
创建一个服务器端控件,该控件映射到 <input type=button>、<input type=submit> 和 <input type=reset> HTML 元素,并允许您分别创建命令按钮、提交按钮或重置按钮。 <input type=button | submit | reset id="programmaticID" OnServerClick="onserverclickhandler" runat="server" > 注意   “重置”按钮不支持 ServerClick 事件。单击“重置”按钮时,未必清除页上的所有输入控件。相反,在加载页时,它们返回到它们的原始状态。例如,如果文本框最初包含值 "JohnDoe",则单击“重置”按钮会使文本框返回到该值。 与 HtmlInputText 和 HtmlTextArea 控件一起使用时,可创建可以在服务器上处理的用户输入页或身份验证页。 注意   此控件不需要结束标记。

58 HTML服务器端控件 HtmlInputCheckBox
创建服务器端控件,该控件映射到 <input type=checkbox> HTML 元素并允许您创建使用户可以选择 true 或 false 状态的复选框控件。 <input type=checkbox id="programmaticID" checked runat="server" > 使用 HtmlInputCheckBox 控件对 <input type=checkbox> HTML 元素进行编程。单击 HtmlInputCheckBox 控件时,该控件不会向服务器回送。当使用回送服务器的控件(如 HtmlInputButton 控件)时,复选框的状态被发送到服务器进行处理。若要确定是否选择了复选框,请测试控件的 Checked 属性。 注意   此控件不需要结束标记。

59 HTML服务器端控件 HtmlInputFile
创建一个服务器端控件,该控件映射到 <input type=file> HTML 元素并允许您将文件上载到服务器。 <input type=file id="programmaticID" accept="MIMEencodings" maxlength="maxfilepathlength" size="widthoffilepathtextbox" postedfile="uploadedfile" runat="server" > 使用 HtmlInputFile 控件对 HTML <input type=file> 元素进行编程。可以使用 HtmlInputFile 控件方便地设计页,该页允许用户将二进制文件或文本文件从浏览器上载到在 Web 服务器上指定的目录中。所有 HTML 3.2 和更高版本的 Web 浏览器都允许进行文件上载。 注意: 需要上载的服务器端目录必须设置为Everyone为可写权限 必须将窗体的 enctype 属性设置为“multipart/form-data”。

60 HTML服务器端控件 HtmlInputHidden
创建一个服务器端控件,该控件映射到 <input type=hidden> HTML 元素并允许您将信息存储在窗体上不可查看的控件中。 <input type="hidden" id="programmaticID" value="contentsofhiddenfield" runat="server" > 使用 HtmlInputHidden 控件对 <input type=hidden> HTML 元素进行编程。尽管此控件是窗体的一部分,但它永远不在窗体上显示。由于在 HTML 中不保持状态,此控件通常与 HtmlInputButton 和 HtmlInputText 控件一起使用,以在对服务器的发送之间存储信息。 注意   此控件不需要结束标记。

61 HTML服务器端控件 HtmlInputImage
创建一个服务器端控件,该控件映射到 <input type=image> HTML 元素并允许您创建显示图像的按钮。 <input type=image id="programmaticID" src="imagepath" align="imagealignment" alt="alttext" OnServerClick="onserverclickhandler" width="borderwidthinpixels" runat="server" > 备注 使用 HtmlInputImage 控件对 HTML <input type=image> 元素进行编程。可以将此控件与 HtmlInputText、HtmlTextArea 及其他控件一起使用以构造用户输入窗体。因为此控件是在服务器上运行的 <input type=image> 元素,所以它提供与 HTML 相同的按钮自定义。此控件可以替代不支持 DHTML 和 HtmlButton 控件的浏览器。 注意   此控件不需要结束标记。 HTML 控件相对于 Web 控件的优点之一是:服务器端事件不与在客户端发生的事件冲突,除非服务器和客户端的代码本身彼此取消。这样,您就可以使用动态 HTML (DHTML) 事件修改在 Web 窗体页上包含的任何图像的外观。

62 HTML服务器端控件 HtmlInputRadioButton
创建一个服务器端控件,该控件映射到 <input type=radio> HTML 元素并允许您在 Web 页上创建单选按钮。 <input type=radio id="programmaticID" checked name="radiobuttongroup" runat="server" > 备注 使用 HtmlInputRadioButton 控件对 HTML <input type=radio> 元素进行编程。通过将 Name 属性设置为组中所有 <input type=radio> 元素所共有的值,可以将多个 HtmlInputRadioButton 控件组成一组。同组中的单选按钮互相排斥;一次只能选择该组中的一个单选按钮。 注意   此控件不需要结束标记。 HtmlRadioButton 控件不会自动向服务器回送。必须依赖于使用某个按钮控件(如 HtmlInputButton、HtmlInputImage 或 HtmlButton)来回送到服务器。可通过为 ServerChange 事件编写处理程序来对 HtmlRadioButton 控件进行编程。 注意   只为更改为选中状态的单选按钮引发 ServerChange 事件

63 HTML服务器端控件 HtmlInputText
创建一个服务器端控件,该控件映射到 <input type=text> 和 <input type=password> HTML 元素,并允许您创建单行文本框以接收用户输入。 <input type=text | password id="programmaticID" maxlength="max#ofcharacters" size="widthoftextbox" value="defaulttextboxcontents" runat="server" > 备注 使用 HtmlInputText 控件对 <input type=text> 和 <input type=password> HTML 元素运行服务器代码。与标准 HTML 一样,这些控件可用于在 HTML 窗体中输入用户名和密码。 注意   当 Type 属性的设置为 password 时,文本框中的输入将受到屏蔽。 可以将此控件与 HtmlInputButton、HtmlInputImage 或 HtmlButton 控件一起使用以在服务器上处理用户输入。通过使用 MaxLength、Size 和 Value 属性,可以分别控制可输入的字符数、控件宽度和控件内容。 注意   此控件不需要结束标记。

64 HTML服务器端控件 HtmlSelect
创建一个服务器端控件,该控件映射到 <select> HTML 元素并允许您创建列表控件。 <select id="programmaticID" OnServerChange="onserverchangehandler" DataSource="databindingsource" DataMember="datamembervalue" DataTextField="fieldtodatabindoptionttext" DataValueField="fieldtodatabindoptionvalue" Multiple Items="collectionofoptionelements" SelectedIndex="indexofcurrentlyselecteditem" Size="#ofvisibleitems" Value="currentitemvalue" runat="server" > <option>value1</option> <option>value2</option> </select> 备注 使用 HtmlSelect 控件对 HTML <select> 元素进行编程。默认情况下,此控件呈现为下拉列表框。但是,如果允许多重选择(通过指定 Multiple 属性)或为 Size 属性指定大于 1 的值,则该控件将显示为列表框。 若要确定单选 HtmlSelect 控件中的选定项,首先使用 SelectedItem 属性获取选定项的索引。然后,可以使用此索引从 Items 集合中检索选定项。 若要确定允许同时进行多重选择的 HtmlSelect 控件中的选定项,则需要循环访问 Items 集合并测试每项的 Selected 属性。 还可以将该控件绑定到数据源。设置 DataSource 属性以指定要将其绑定到该控件的数据源。将数据源绑定到控件后,可以通过设置 DataValueField 和 DataTextField 属性,分别指定将哪个字段绑定到 Value 和 Text 属性。

65 HTML服务器端控件 HtmlTable 创建一个服务器端控件,该控件映射到 <table> HTML 元素并允许您创建表。 <table id="programmaticID" align=left | center | right bgcolor="bgcolor" border="borderwidthinpixels" bordercolor="bordercolor" cellpadding="spacingwithincellsinpixels" cellspacing="spacingbetweencellsinpixels" height="tableheight" rows="collectionofrows" width="tablewidth" runat="server" > <tr> <td></td> </tr> </table> 备注 使用 HtmlTable 控件对 HTML <table> 元素进行编程。HtmlTable 控件由一个表的 Rows 集合中存储的行(由 HtmlTableRow 对象表示)组成。每行均由存储在行的 Cells 集合中的单元格(由 HtmlTableCell 对象表示)组成。 若要创建表,首先应在页上的窗体中声明一个 HtmlTable 控件。然后,将 HtmlTableRow 对象放置在 HtmlTable 控件的开始和结束标记之间(对于表中所需的每一行放置一个对象)。定义表中的行之后,声明位于每个 HtmlTableRow 对象的开始和结束标记之间的 HtmlTableCell 对象以创建该行的单元格。 注意   请确保每行和每列中的单元格的数目正确,否则该表可能不会按预期的方式显示。一般情况下,各行的单元格数应相同。同样,各列的单元格数也应相同。如果要合并单元格,则各行的宽度应相同,各列的高度也应相同。 HtmlTable 控件允许您自定义表的外观。通过设置 BgColor、Border、BorderColor、Height 和 Width 属性,可以分别指定表的背景色、边框宽度、边框颜色、表高度和表宽度。通过设置 CellSpacing 和 CellPadding 属性,还可以控制单元格间的间距以及单元格内容与单元格边框间的间距。

66 HTML服务器端控件 HtmlTableRow
创建一个服务器端控件,该控件映射到 <tr> HTML 元素并允许您创建和操作表中的行。 <tr id="programmaticID" align="tablecontentalignment" bgcolor="tablebgcolor" bordercolor="bordercolor" height="tableheight" cells="collectionoftablecells" valign="verticalalignmentofrowcontent" > <td>cellcontent</td> <td>cellcontent</td> <td>cellcontent</td> </tr> 备注 使用 HtmlTableRow 类对 <tr> HTML 元素进行编程。<tr> 元素表示表中的行。 HtmlTableRow 类使您可以控制表中各个独立行的外观。通过设置 BgColor、BorderColor 和 Height 属性,可以分别控制该行的背景色、边框颜色和高度。 通过设置 Align 和 VAlign 属性分别控制行中单元格内容的水平和垂直对齐方式。 表中的每行都包含一个 Cells 集合,该集合对于该行中的每个单元格都包含一个 HtmlTableCell

67 HTML服务器端控件 HtmlTableCell
创建一个服务器端控件,该控件映射到 <td> 和 <th> HTML 元素并允许您操作表中的单元格。 <td or th id="programmaticID" align="alignmentofcontentincell" bgcolor="bgcolor" bordercolor="bordercolor" colspan="#ofcolscellspans" height="cellheight" nowrap="True | False" rowspan="#ofrowscellspans" valign="vertalignmentofcellcontent" width="cellwidth"> CellContent </td or /th> 备注 使用 HtmlTableCell 类对 <td> 和 <th> HTML 元素进行编程。<td> 元素表示数据单元格,而 <th> 元素表示标题单元格。请注意,<th> 单元格的内容始终为粗体并居中。 HtmlTableCell 类使您可以控制各个独立单元格的外观。通过设置 BgColor、BorderColor、Height 和 Width 属性,可以分别控制单元格的背景色、边框颜色、高度和宽度。 注意   同一行中的所有单元格都具有相同的高度。一行中最高的单元格确定该行中所有单元格的高度。 通过设置 Align 和 VAlign 属性,分别控制单元格内容的水平和垂直对齐方式。通过设置 NoWrap 属性,还可以指定文本是否自动在单元格的下一行上继续。 HtmlTableCell 类使您可以通过设置 ColSpan 和 RowSpan 属性来合并单元格。ColSpan 属性使您可以控制一个单元格占据的列数,而 rowspan 属性则指定一个单元格占据的行数。 注意   合并单元格时,请确保表中各行具有相同的长度。还应确保各列具有相同的高度。否则,表可能不会按预期的方式显示。

68 HTML服务器端控件 HtmlTextArea
创建一个服务器端控件,该控件映射到 <td> 和 <th> HTML 元素并允许您操作表中的单元格。 <textarea id="programmaticID" cols="numberofcolsintextarea" name="namepassedtobrowser" rows="numberofrowsintextarea" onserverchange="onserverchangehandler" runat="server" > textareacontent </textarea> 备注 使用 HtmlTextArea 控件对 HTML <textarea> 元素进行编程。此控件使您可以创建多行文本框。文本框的尺寸由 Cols 和 Rows 属性控制。Cols 属性确定控件的宽度,而 Rows 属性确定控件的高度。 HtmlTextArea 控件包含 ServerChange 事件,当控件的内容在对服务器进行发送之间更改时,将引发该事件。该事件通常用于验证在控件中输入的文本。

69 Web服务器控件 基本Web服务器控件属性 样式属性
某些控件支持样式属性,它们允许您设置控件中各个元素的颜色和字体等外观。若要更改元素的外观,请设置适当样式对象的属性。 1 Reference to:ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpgenref/html/cpconbasewebcontrolproperties.htm 2 R.T:ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpgenref/html/cpconstyleobjectproperties.htm

70 Web服务器控件 AdRotator Web 在 Web 窗体页上显示公布标志/广告标志。
<asp:AdRotator id="Value" AdvertisementFile="AdvertisementFile" KeyWordFilter="KeyWord" Target="Target" OnAdCreated="OnAdCreatedMethod" runat="server"/> 1 keywordfilter 用于筛选出 XML 公布文件中特定类型的公布的关键字。 AdvertisementFile要注意以下几点:  公布文件中的 XML 必须格式正确。  AdRotator 控件只分析文件中的第一个 <Advertisements> 元素。该文件中的所有其他 <Advertisements> 元素均被忽略。  可以向公布的 XML 说明中添加自定义元素。这些值被传递给 AdProperties 词典属性中的 AdCreated 事件。 3 AdCreated事件:在控件创建后、呈现页面前,在每个到服务器的往返行程过程中发生一次。

71 Web服务器控件 AdvertisementFile <Advertisements> <Ad>
<ImageUrl> URL of image to display for Advertisement #1 </ImageUrl> <NavigateUrl> URL of page to link to for Advertisement #1 </NavigateUrl> <AlternateText> Text to show as a ToolTip for Advertisement #1 </AlternateText>

72 Web服务器控件 AdvertisementFile <Keyword>
Keyword used to filter for Advertisement #1 </Keyword> <Impressions> Relative importance of Advertisement #1 </Impressions> <CustomInformation> Custom Data about Advertisement #1 </CustomInformation> </Ad> </Advertisements>

73 Web服务器控件 Button Web 服务器控件
<asp:Button id="MyButton" Text="label" CommandName="command" CommandArgument="commandargument" CausesValidation="true | false" OnClick="OnClickMethod" runat="server"/> 默认情况下,单击 Button 控件时会执行页验证。页验证确定与该页上验证控件关联的输入控件是否通过该验证控件指定的验证规则。如果某个 Button 控件(如“重置”按钮)需要禁用此行为,则将 CausesValidation 属性设置为 false。 注意   由于 <asp:Button> 元素没有内容,因此可用 /> 结束该标记,而不必使用单独的结束标记。

74 Web服务器控件 Calendar Web 服务器控件 显示一个月历,该月历允许用户选择日期和移动到下一个月或上一个月。 语法见备注
<asp:Calendar id="Calendar1" CellPadding="pixels" CellSpacing="pixels" DayNameFormat="FirstLetter|FirstTwoLetters|Full|Short" FirstDayOfWeek="Default|Monday|Tuesday|Wednesday| Thursday|Friday|Saturday|Sunday" NextMonthText="HTML text" NextPrevFormat="ShortMonth|FullMonth|CustomText" PrevMonthText="HTML text" SelectedDate="date" SelectionMode="None|Day|DayWeek|DayWeekMonth" SelectMonthText="HTML text" SelectWeekText="HTML text" ShowDayHeader="True|False" ShowGridLines="True|False" ShowNextPrevMonth="True|False" ShowTitle="True|False" TitleFormat="Month|MonthYear" TodaysDate="date" VisibleDate="date" OnDayRender="OnDayRenderMethod" OnSelectionChanged="OnSelectionChangedMethod" OnVisibleMonthChanged="OnVisibleMonthChangedMethod" runat="server"> <TodayDayStyle property="value"/> <DayHeaderStyle property="value"/> <DayStyle property="value"/> <NextPrevStyle property="value"/> <OtherMonthDayStyle property="value"/> <SelectedDayStyle property="value"/> <SelectorStyle property="value"/> <TitleStyle property="value"/> <WeekendDayStyle property="value"/> </asp:Calendar>

75 Web服务器控件 CheckBox Web 服务器控件
创建复选框 (CheckBox) 控件,该控件允许用户在 true 或 false 状态之间切换。 <asp:CheckBox id="CheckBox1" AutoPostBack="True|False" Text="Label" TextAlign="Right|Left" Checked="True|False" OnCheckedChanged="OnCheckedChangedMethod" runat="server"/> 由于 <asp:CheckBox> 元素没有内容,因此可用 /> 结束该标记,而不必使用单独的结束标记

76 Web服务器控件 CheckBoxList Web 服务器控件 创建多选复选框组。此控件支持绑定到数据源。
<asp:CheckBoxList id="CheckBoxList1" AutoPostBack="True|False" CellPadding="Pixels" DataSource='<% databindingexpression %>' DataTextField="DataSourceField" DataValueField="DataSourceField" RepeatColumns="ColumnCount" RepeatDirection="Vertical|Horizontal" RepeatLayout="Flow|Table" TextAlign="Right|Left" OnSelectedIndexChanged="OnSelectedIndexChangedMethod" runat="server"> <asp:ListItem value="value" selected="True|False"> Text </asp:ListItem> </asp:CheckBoxList> CheckBoxList 控件支持数据绑定。若要将控件绑定到数据源,首先创建一个数据源,如一个 System.Collections.ArrayList 对象(该对象包含要在控件中显示的项)。然后,使用 Control.DataBind 方法将该数据源绑定到 CheckBoxList 控件。使用 DataTextField 和 DataValueField 属性分别指定将数据源中的哪个字段绑定到控件中每个列表项的 Text 和 Value 属性。现在,CheckBoxList 控件将显示数据源中的信息。 若要确定 CheckBoxList 控件中的选定项,请循环访问 Items 集合并测试该集合中每一项的 Selected 属性。

77 Web服务器控件 DataList Web 服务器控件
通过使用模板显示数据源中的项。通过操作组成 DataList 控件的不同组件的模板(如 ItemTemplate 和 HeaderTemplate),可以自定义该控件的外观和内容。 <asp:DataList id="DataList1" CellPadding="pixels" CellSpacing="pixels" DataKeyField="DataSourceKeyField" DataSource='<% databindingexpression %>' ExtractTemplateRows="True|False" GridLines="None|Horizontal|Vertical|Both" RepeatColumns="ColumnCount" RepeatDirection="Vertical|Horizontal" RepeatLayout="Flow|Table" ShowFooter="True|False" ShowHeader="True|False" OnCancelCommand="OnCancelCommandMethod" OnDeleteCommand="OnDeleteCommandMethod" OnEditCommand="OnEditCommandMethod" OnItemCommand="OnItemCommandMethod" OnItemCreated="OnItemCreatedMethod" OnUpdateCommand="OnUpdateCommandMethod" runat="server"> <AlternatingItemStyle ForeColor="Blue"/> <EditItemStyle BackColor="Yellow"/> <FooterStyle BorderColor="Gray"/> <HeaderStyle BorderColor="Gray"/> <ItemStyle Font-Bold="True"/> <PagerStyle Font-Name="Ariel"/> <SelectedItemStyle BackColor="Blue"/> <HeaderTemplate> Header template HTML </HeaderTemplate> <ItemTemplate> Item template HTML </ItemTemplate> <AlternatingItemTemplate> Alternating item template HTML </AlternatingItemTemplate> <EditItemTemplate> Edited item template HTML </EditItemTemplate> <SelectedItemTemplate> Selected item template HTML </SelectedItemTemplate> <SeparatorTemplate> Separator template HTML </SeparatorTemplate> <FooterTemplate> Footer template HTML </FooterTemplate> </asp:DataList>

78 Web服务器控件 DropDownList Web 服务器控件 使用户可以从单一选择下拉列表中进行选择。下拉列表可以包含任意数目的项。
<asp:DropDownList id="DropDownList1" runat="server" DataSource="<% databindingexpression %>" DataTextField="DataSourceField" DataValueField="DataSourceField" AutoPostBack="True|False" OnSelectedIndexChanged="OnSelectedIndexChangedMethod"> <asp:ListItem value="value" selected="True|False"> Text </asp:ListItem> </asp:DropDownList> 使用 SelectedIndex 属性以编程方式确定用户从 DropDownList 控件中选择的项的索引。然后即可使用该索引从控件的 Items 集合中检索选定的项。

79 Web服务器控件 HyperLink Web 服务器控件 在页上创建一个链接,用户可以单击它以移动到其他页。
<asp:HyperLink id="HyperLink1" NavigateUrl="url" Text="HyperLinkText" ImageUrl="url" Target="window" runat="server"/> <asp:HyperLink id="HyperLink1""" NavigateUrl="url" ImageUrl="url" Target="window" runat="server"> Text </asp:HyperLink>

80 Web服务器控件 Image Web 服务器控件 在 Web 窗体页上显示 Web 兼容图像。
<asp:Image id="Image1" runat="server" ImageUrl="string" AlternateText="string" ImageAlign="NotSet|AbsBottom|AbsMiddle|BaseLine| Bottom|Left|Middle|Right|TextTop|Top"/> 注意   由于 <asp:Image> 元素没有内容,因此可用 /> 结束该标记,而不必使用单独的结束标记。

81 Web服务器控件 ImageButton Web 服务器控件 使您能够处理图像中的用户单击,从而为您提供类似于图像映射的功能。
<asp:ImageButton id="ImageButton1" ImageUrl="string" Command="Command" CommandArgument="CommandArgument" CausesValidation="true | false" OnClick="OnClickMethod" runat="server"/>

82 Web服务器控件 Label Web 服务器控件 在 Web 窗体页上显示静态文本并使您可以通过编程方式对其进行操作。
<asp:Label id="Label1" Text="label" runat="server"/> or <asp:Label id="Label1" runat="server"> Text </asp:Label>

83 Web服务器控件 LinkButton Web 服务器控件 <asp:LinkButton id="LinkButton1"
Text="label" Command="Command" CommandArgument="CommandArgument" CausesValidation="true | false" OnClick="OnClickMethod" runat="server"/> <asp:LinkButton id="LinkButton1" Text="label" Command="Command" CommandArgument="CommandArgument" CausesValidation="true | false" OnClick="OnClickMethod" runat="server"/> or Text </asp:LinkButton> 使用 LinkButton 控件在 Web 窗体页上创建超级链接样式按钮。通过设置 Text 属性或将文本放在 LinkButton 控件的开始和结束标记之间来指定要在 LinkButton 控件中显示的文本。可以创建“提交”按钮或“命令”按钮。

84 Web服务器控件 ListBox Web 服务器控件
创建单选或多选列表框。 <asp:ListBox id="Listbox1" DataSource="<% databindingexpression %>" DataTextField="DataSourceField" DataValueField="DataSourceField" AutoPostBack="True|False" Rows="rowcount" SelectionMode="Single|Multiple" OnSelectedIndexChanged="OnSelectedIndexChangedMethod" runat="server"> <asp:ListItem value="value" selected="True|False"> Text </asp:ListItem> </asp:ListBox> <asp:LinkButton id="LinkButton1" Text="label" Command="Command" CommandArgument="CommandArgument" CausesValidation="true | false" OnClick="OnClickMethod" runat="server"/> or Text </asp:LinkButton> 使用 LinkButton 控件在 Web 窗体页上创建超级链接样式按钮。通过设置 Text 属性或将文本放在 LinkButton 控件的开始和结束标记之间来指定要在 LinkButton 控件中显示的文本。可以创建“提交”按钮或“命令”按钮。

85 Web服务器控件 Literal Web 服务器控件 在页上显示静态内容并允许您以编程方式对其进行操作。
<asp:Literal id="Literal1" Text="Text" runat="server"/> 使用 Literal 控件在 Web 窗体页上显示静态文本。与 Label 控件不同的是,Literal 不允许您向其内容应用样式。

86 Web服务器控件 Panel Web 服务器控件 为其他控件提供容器。此控件作为 HTML <div> 元素呈现。
<asp:Panel id="Panel1" BackImageUrl="url" HorizontalAlign="Center|Justify|Left|NotSet|Right" Wrap="True|False" runat="server"> (Other controls declared here) </asp:Panel> Panel 控件是其他控件的容器。它对于以编程方式生成控件以及显示和隐藏控件组尤其有用。通过设置 BackImageUrl 属性,可以在 Panel 控件的背景中显示图像。使用 HorizontalAlignment 属性可以指定包含在该控件中的项的水平对齐方式。Wrap 属性使您可以确定当行的长度超过面板的宽度时,控件中的项是否自动在下一行继续。

87 Web服务器控件 PlaceHolder Web 服务器控件 在页控件层次结构中为以编程方式添加的控件保留位置。
<asp:PlaceHolder id="PlaceHolder1" runat="server"/> 将 PlaceHolder 控件用作容器,从而将动态添加的服务器控件存储到 Web 页中。PlaceHolder 控件不产生任何可见的输出,仅用作 Web 页上其他控件的容器。可使用 Control.Controls 集合在 PlaceHolder 控件中添加、插入或移除控件。

88 Web服务器控件 RadioButton Web 服务器控件 在页上创建一个单选按钮。可将多个单选按钮分为一组以提供一组互相排斥的选项。
<asp:RadioButton id="RadioButton1" AutoPostBack="True|False" Checked="True|False" GroupName="GroupName" Text="label" TextAlign="Right|Left" OnCheckedChanged="OnCheckedChangedMethod" runat="server"/> 注意   还可以使用 RadioButtonList 控件。对于使用数据绑定创建一组单选按钮而言,RadioButtonList 控件更易于使用,而单个 RadioButton 控件则使您能够更好地控制布局。 若要确定 RadioButton 控件是否已选中,请测试 Checked 属性。

89 Web服务器控件 RadioButtonList Web 服务器控件 创建一组单选按钮。此控件支持绑定到数据源。
<asp:RadioButtonList id="RadioButtonList1" AutoPostBack="True|False" CellPadding="Pixels" DataSource="<% databindingexpression %>" DataTextField="DataSourceField" DataValueField="DataSourceField" RepeatColumns="ColumnCount" RepeatDirection="Vertical|Horizontal" RepeatLayout="Flow|Table" TextAlign="Right|Left" OnSelectedIndexChanged="OnSelectedIndexChangedMethod" runat="server"> <asp:ListItem Text="label" Value="value" Selected="True|False" /> </asp:RadioButtonList> RadioButtonList 控件允许您创建可通过绑定到数据源而动态生成的单一选择的单选按钮组。若要指定要在 RadioButtonList 控件中显示的项,请针对每个项在 RadioButtonList 控件的开始和结束标记之间放置一个 ListItem 元素。

90 Web服务器控件 Table Web 服务器控件 声明一个表并允许您以编程方式对其进行操作。
<asp:Table id="Table1" BackImageUrl="url" CellSpacing="cellspacing" CellPadding="cellpadding" GridLines="None|Horizontal|Vertical|Both" HorizontalAlign="Center|Justify|Left|NotSet|Right" runat="server"> <asp:TableRow> <asp:TableCell> Cell text </asp:TableCell> </asp:TableRow> </asp:Table>

91 Web服务器控件 表示 Table 控件中的行并允许您以编程方式对其进行操作。 TableRow Web 服务器控件
<asp:TableRow id="TableRow1" HorizontalAlign="Center|Justify|Left|NotSet|Right" VerticalAlign="Bottom|Middle|NotSet|Top" runat="server"> <asp:TableCell> Cell text </asp:TableCell> </asp:TableRow> 行中的单元格(由 TableCell 类的实例表示)存储在表示该行的 TableRow 的 Cells 集合中。使用 Cells 集合可以通过编程方式管理行中的单元格。

92 Web服务器控件 表示 Table 控件中的单元格并允许您以编程方式对其进行操作。 TableCell Web 服务器控件
<asp:TableCell id="TableCell1" ColumnSpan="colcount" RowSpan="rowcount" HorizontalAlign="Center|Justify|Left|NotSet|Right" VerticalAlign="Bottom|Middle|NotSet|Top" Wrap="True|False" runat="server"> Cell text </asp:TableCell> RowSpan 和 ColumnSpan 属性分别控制所用的行数和列

93 Web服务器控件 创建单行和多行文本框。 TextBox Web 服务器控件 <asp:TextBox id="value"
AutoPostBack="True|False" Columns="characters" MaxLength="characters" Rows="rows" Text="text" TextMode="SingleLine | MultiLine | Password" Wrap="True|False" OnTextChanged="OnTextChangedMethod" runat="server"/> 使用 Text 属性确定 TextBox 控件的内容。通过设置 MaxLength 属性,可以限制可输入到此控件中的字符数。将 Wrap 属性设置为 true 来指定当到达文本框的结尾时,单元格内容应自动在下一行继续。

94 Web服务器控件 显示 XML 文档或 XSL 转换的结果。 XML Web 服务器控件 <asp:Xml id="Xml1"
Document="XmlDocument object to display" DocumentContent="String of XML" DocumentSource="Path to XML Document" Transform="XslTransform object" TransformSource="Path to XSL Transform Document" runat="server"> RowSpan 和 ColumnSpan 属性分别控制所用的行数和列

95 验证服务器控件 CompareValidator 控件 <asp:CompareValidator
将输入控件的值同常数值或其他输入控件的值相比较,以确定这两个值是否与由比较运算符(小于、等于、大于等等)指定的关系相匹配。 <asp:CompareValidator id="ProgrammaticID" ControlToValidate="Programmatic ID of Server Control to Validate" ValueToCompare="value" ControlToCompare="value" Type="DataType" Operator="Operator Value" ErrorMessage="Message to display in ValidationSummary control" Text="Message to display in control" ForeColor="value" BackColor="value" ... runat="server" > </asp:CompareValidator> CompareValidator 控件使您可以将用户输入到一个输入控件(如 TextBox 控件)中的值同输入到另一个输入控件中的值相比较,或将该值与某个常数值相比较。还可以使用 CompareValidator 控件确定输入到输入控件中的值是否可以转换为 Type 属性所指定的数据类型。 注意   如果输入控件为空,则不调用任何验证函数且验证成功。使用 RequiredFieldValidator 控件防止用户跳过某个输入控件。

96 验证服务器控件 CustomValidator 控件 <asp:CustomValidator id="ProgrammaticID"
计算输入控件的值以确定它是否通过自定义的验证逻辑 <asp:CustomValidator id="ProgrammaticID" ControlToValidate="programmatic ID of Server Control to Validate" ClientValidationFunction="ClientValidateID" OnServerValidate="ServerValidateID" ErrorMessage="Message to display in ValidationSummary control" Text="Message to display in control" ForeColor="value" BackColor="value" ... runat="server" > </asp:CustomValidator> 若要创建服务器端验证函数,请为执行验证的 ServerValidate 事件提供处理程序。可使用作为参数传入事件处理程序的 ServerValidateEventArgs 对象的 Value 属性访问来自要验证的输入控件的字符串。验证结果随即存储在 ServerValidateEventArgs 对象的 IsValid 属性中。

97 验证服务器控件 RangeValidator 控件 <asp:RangeValidator id="ProgrammaticID"
计算输入控件的值,以确定该值是否在指定的上限与下限之间。 <asp:RangeValidator id="ProgrammaticID" ControlToValidate="ProgrammaticID of control to validate" MinimumValue="value" MaximumValue="value" Type="DataType" ErrorMessage="Message to display in ValidationSummary control" Text="Message to display in control" ForeColor="value" BackColor="value" ... runat="server" > </asp:RangeValidator>   如果输入控件为空,则不调用任何验证函数且验证成功。使用 RequiredFieldValidator 控件防止用户跳过某个输入控件。同样,如果输入控件的值无法转换为 Type 属性指定的数据类型,验证也会成功。强烈推荐使用一个附加的 CompareValidator 控件,将其 Operator 属性设置为 ValidationCompareOperator.DataTypeCheck,以此来检验输入值的数据类型。

98 验证服务器控件 RequiredFieldValidator 控件 <asp:RequiredFieldValidator
计算输入控件的值以确保用户输入值。 <asp:RequiredFieldValidator id="ProgrammaticID" ControlToValidate="ProgrammaticID of control to validate" InitialValue="value" ErrorMessage="Message to display in ValidationSummary control" Text="Message to display in control" ForeColor="value" BackColor="value" ... runat="server" > </asp:RequiredFieldValidator> 注意   请在执行验证之前移除输入值前后的多余空格。这样可防止在输入控件中输入的空格通过验证。

99 验证服务器控件 ValidatorSummary 控件 显示 Web 页上所有验证错误的列表。
<asp:ValidationSummary id="programmaticID" DisplayMode="BulletList | List | SingleParagraph" EnableClientScript="true | false" ShowSummary="true | false" ShowMessageBox="true | false" HeaderText="TextToDisplayAsSummaryTitle" runat="server"/> DisplayMode 属性的值,该摘要可显示为列表、项目符号列表或单个段落 EnableClientScript属性指定 ValidationSummary 控件是否使用客户端脚本更新自身。当设置为 true 时,将在客户机上呈现客户端脚本,以更新 ValidationSummary 控件,但前提是浏览器支持该功能。当设置为 false 时,客户机上将不呈现客户端脚本,且 ValidationSummary 控件仅在每次服务器往返时更新自身。这种情况下,ShowMessageBox 属性无效。

100 验证服务器控件 RegularExpressionValidator 控件
计算输入控件的值,以确定该值是否与某个正则表达式所定义的模式相匹配。 <asp:RegularExpressionValidator id="ProgrammaticID" ControlToValidate="ProgrammaticID of control to validate" ValidationExpression="expression" ErrorMessage="Message to display in ValidationSummary control" Text="Message to display in control" ForeColor="value" BackColor="value" ... runat="server" > </asp: RegularExpressionValidator> RegularExpressionValidator 控件用于确定输入控件的值是否与某个正则表达式所定义的模式相匹配。该验证类型允许检查可预知的字符序列,如社会保障号、电子邮件地址、电话号码、邮政编码等中的字符序列。 注意   如果输入控件为空,则不调用任何验证函数且验证成功。使用 RequiredFieldValidator 控件防止用户跳过某个输入控件。 使用 ValidationExpression 属性指定用于验证输入控件的正则表达式。客户端的正则表达式验证语法和服务器端略有不同。在客户端,使用的是 JScript 正则表达式语法。而在服务器端使用的则是 Regex 语法。由于 JScript 正则表达式语法是 Regex 语法的子集,所以最好使用 JScript 正则表达式语法,以便在客户端和服务器端得到同样的结果。 正则表达式参见:ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/jscript7/html/jsjsgrpregexpsyntax.htm

101 ADO.NET介绍 ADO.NET 提供对 Microsoft SQL Server 等数据源以及通过 OLE DB 和 XML 公开的数据源的一致访问。数据共享使用者应用程序可以使用 ADO.NET 来连接到这些数据源,并检索、操作和更新数据。 设计 ADO.NET 的目的是为了满足编程模型的以下要求:具有断开式数据结构;能够与 XML 紧密集成;具有能够组合来自多个、不同数据源的数据的通用数据表示形式;以及具有为与数据库交互而优化的功能,这些要求都是 .NET Framework 固有的内容。 目标 利用当前的 ADO 知识 支持 N 层编程模式 集成 XML 支持 集成 XML 支持 有关 ADO 和 ADO.NET 之间的差异的论述,请参见 上的“ADO.NET for the ADO Programmer”。

102 ADO.NET介绍 ADO.NET 结构 XML 和 ADO.NET ADO.NET 组件 在层和客户端之间对数据进行远程处理或封送
设计 ADO.NET 组件的目的是为了从数据操作中分解出数据访问。ADO.NET 的两个核心组件会完成此任务:DataSet 和 .NET Framework 数据提供程序,后者是一组包括 Connection、Command、DataReader 和 DataAdapter 对象在内的组件。 在层和客户端之间对数据进行远程处理或封送 DataSet 的设计使您能够使用 XML Web services 方便地通过 Web 将数据传输到客户端,并允许您使用 .NET 远程处理服务在 .NET 组件之间封送数据。您还可以通过这种方式对强类型的 DataSet 进行远程处理。 要使用ADO.NET,请引入System.Data 命名空间 1. ADO.NET 借用 XML 的力量来提供对数据的断开式访问。ADO.NET 的设计与 .NET Framework 中 XML 类的设计是并进的,它们都是同一个结构的组件。 ADO.NET 和 .NET Framework 中的 XML 类集中于 DataSet 对象。无论 DataSet 是文件还是 XML 流,它都可以使用来自 XML 源的数据来进行填充。无论 DataSet 中数据的数据源是什么,DataSet 都可以写为符合万维网联合会 (W3C) 的 XML,并且将其架构包含为 XML 架构定义语言 (XSD) 架构。由于 DataSet 固有的序列化格式为 XML,它是在层间移动数据的优良媒介,这使 DataSet 成为以远程方式向 XML Web services 发送数据和架构上下文以及从 XML Web services 接收数据和架构上下文的最佳选择。 2 ADO.NET DataSet 是 ADO.NET 的断开式结构的核心组件。DataSet 的设计目的很明确:为了实现独立于任何数据源的数据访问。因此,它可以用于多种不同的数据源,用于 XML 数据,或用于管理应用程序本地的数据。DataSet 包含一个或多个 DataTable 对象的集合,这些对象由数据行和数据列以及主键、外键、约束和有关 DataTable 对象中数据的关系信息组成。 ADO.NET 结构的另一个核心元素是 .NET Framework 数据提供程序,其组件的设计目的相当明确:为了实现数据操作和对数据的快速、只进、只读访问。Connection 对象提供与数据源的连接。Command 对象使您能够访问用于返回数据、修改数据、运行存储过程以及发送或检索参数信息的数据库命令。DataReader 从数据源中提供高性能的数据流。最后,DataAdapter 提供连接 DataSet 对象和数据源的桥梁。DataAdapter 使用 Command 对象在数据源中执行 SQL 命令,以便将数据加载到 DataSet 中,并使对 DataSet 中数据的更改与数据源保持一致。 可以为任何数据源编写 .NET Framework 数据提供程序。.NET Framework 提供了四个 .NET Framework 数据提供程序:SQL Server .NET Framework 数据提供程序、OLE DB .NET Framework 数据提供程序、ODBC .NET Framework 数据提供程序和 Oracle .NET Framework 数据提供程序。

103 ADO.NET介绍 ADO.NET 结构 1. ADO.NET 借用 XML 的力量来提供对数据的断开式访问。ADO.NET 的设计与 .NET Framework 中 XML 类的设计是并进的,它们都是同一个结构的组件。 ADO.NET 和 .NET Framework 中的 XML 类集中于 DataSet 对象。无论 DataSet 是文件还是 XML 流,它都可以使用来自 XML 源的数据来进行填充。无论 DataSet 中数据的数据源是什么,DataSet 都可以写为符合万维网联合会 (W3C) 的 XML,并且将其架构包含为 XML 架构定义语言 (XSD) 架构。由于 DataSet 固有的序列化格式为 XML,它是在层间移动数据的优良媒介,这使 DataSet 成为以远程方式向 XML Web services 发送数据和架构上下文以及从 XML Web services 接收数据和架构上下文的最佳选择。 2 ADO.NET DataSet 是 ADO.NET 的断开式结构的核心组件。DataSet 的设计目的很明确:为了实现独立于任何数据源的数据访问。因此,它可以用于多种不同的数据源,用于 XML 数据,或用于管理应用程序本地的数据。DataSet 包含一个或多个 DataTable 对象的集合,这些对象由数据行和数据列以及主键、外键、约束和有关 DataTable 对象中数据的关系信息组成。 ADO.NET 结构的另一个核心元素是 .NET Framework 数据提供程序,其组件的设计目的相当明确:为了实现数据操作和对数据的快速、只进、只读访问。Connection 对象提供与数据源的连接。Command 对象使您能够访问用于返回数据、修改数据、运行存储过程以及发送或检索参数信息的数据库命令。DataReader 从数据源中提供高性能的数据流。最后,DataAdapter 提供连接 DataSet 对象和数据源的桥梁。DataAdapter 使用 Command 对象在数据源中执行 SQL 命令,以便将数据加载到 DataSet 中,并使对 DataSet 中数据的更改与数据源保持一致。 可以为任何数据源编写 .NET Framework 数据提供程序。.NET Framework 提供了四个 .NET Framework 数据提供程序:SQL Server .NET Framework 数据提供程序、OLE DB .NET Framework 数据提供程序、ODBC .NET Framework 数据提供程序和 Oracle .NET Framework 数据提供程序。

104 ADO.NET介绍 ADO.NET平台要求 支持 Microsoft .NET Framework SDK(包括 ADO.NET)的平台包括:Microsoft® Windows® 2000、Microsoft® Windows NT® 4(带 Service Pack 6a)、Microsoft® Windows® Millennium Edition、Microsoft® Windows® 98 和 Microsoft® Windows® SE。使用 SQL Server .NET Framework 数据提供程序或 OLE DB .NET Framework 数据提供程序要求安装 Microsoft 数据访问组件 2.6 版或更高版本。 1. ADO.NET 借用 XML 的力量来提供对数据的断开式访问。ADO.NET 的设计与 .NET Framework 中 XML 类的设计是并进的,它们都是同一个结构的组件。 ADO.NET 和 .NET Framework 中的 XML 类集中于 DataSet 对象。无论 DataSet 是文件还是 XML 流,它都可以使用来自 XML 源的数据来进行填充。无论 DataSet 中数据的数据源是什么,DataSet 都可以写为符合万维网联合会 (W3C) 的 XML,并且将其架构包含为 XML 架构定义语言 (XSD) 架构。由于 DataSet 固有的序列化格式为 XML,它是在层间移动数据的优良媒介,这使 DataSet 成为以远程方式向 XML Web services 发送数据和架构上下文以及从 XML Web services 接收数据和架构上下文的最佳选择。 2 ADO.NET DataSet 是 ADO.NET 的断开式结构的核心组件。DataSet 的设计目的很明确:为了实现独立于任何数据源的数据访问。因此,它可以用于多种不同的数据源,用于 XML 数据,或用于管理应用程序本地的数据。DataSet 包含一个或多个 DataTable 对象的集合,这些对象由数据行和数据列以及主键、外键、约束和有关 DataTable 对象中数据的关系信息组成。 ADO.NET 结构的另一个核心元素是 .NET Framework 数据提供程序,其组件的设计目的相当明确:为了实现数据操作和对数据的快速、只进、只读访问。Connection 对象提供与数据源的连接。Command 对象使您能够访问用于返回数据、修改数据、运行存储过程以及发送或检索参数信息的数据库命令。DataReader 从数据源中提供高性能的数据流。最后,DataAdapter 提供连接 DataSet 对象和数据源的桥梁。DataAdapter 使用 Command 对象在数据源中执行 SQL 命令,以便将数据加载到 DataSet 中,并使对 DataSet 中数据的更改与数据源保持一致。 可以为任何数据源编写 .NET Framework 数据提供程序。.NET Framework 提供了四个 .NET Framework 数据提供程序:SQL Server .NET Framework 数据提供程序、OLE DB .NET Framework 数据提供程序、ODBC .NET Framework 数据提供程序和 Oracle .NET Framework 数据提供程序。

105 ADO.NET介绍 使用ADO.NET连接到数据库
在 ADO.NET 中,可以使用 Connection 对象来连接到指定的数据源。若要连接到 Microsoft SQL Server 7.0 版或更高版本,请使用 SQL Server .NET Framework 数据提供程序的 SqlConnection 对象。若要使用用于 SQL Server 的 OLE DB 提供程序 (SQLOLEDB) 连接到 OLE DB 数据源或者连接到 Microsoft SQL Server 6.x 版或较早版本,请使用 OLE DB .NET Framework 数据提供程序的 OleDbConnection 对象。若要连接到 ODBC 数据源,请使用 ODBC .NET Framework 数据提供程序的 OdbcConnection 对象。若要连接到 Oracle 数据源,请使用 Oracle .NET Framework 数据提供程序的 OracleConnection 对象。 SqlConnection OleDbConnection ODBCConnection OracleConnection

106 ADO.NET介绍 System.Data层次结构 System Data SqlClient SqlConnection
SqlCommander SqlDataReader SqlDataAdapter SqlConnection OleDbConnection ODBCConnection OracleConnection

107 ADO.NET介绍 SqlConnection对象 表示 SQL Server 数据库的一个打开的连接。不能继承此类。
要使用该类,必须引入System.Data.SqlClient命名空间 数据提供程序 Connection Command DataReader DataAdapter

108 ADO.NET介绍 SqlConnection对象 常用属性 ConnectionString ConnectionTimeout
Database DataSource PacketSize ServerVersion State WorkstationID

109 ADO.NET介绍 SqlConnection对象 ConnectionString连接字符串
DataSource/Server/Address/Addr/Network Address Connect Timeout/Connection Timeout Connection Lifetime Current Language Initial Catalog/Database Integrated Security/Trusted Connection Max Pool Size/Min Pool Size WorkstationID Packet Size Password/Pwd UserID/UID Pooling Connection Reset

110 ADO.NET介绍 SqlConnection对象
dim sqlConn as New SqlConnection(“Server=myServer;User ID=sa;Password=;Database=master;) sqlConn.Open() 连接池概念 最小及最大连接池的大小 连接重置问题

111 ADO.NET介绍 SqlConnection对象 主要方法: Open Close ChageDatabase CreateCommand
BeginTransaction

112 ADO.NET介绍 SqlCommand对象
调用其属性及方法执行任何的T-SQL命令,以验证这些的命令的执行情况,还可以结合SqlConnection类来执行事务。 重要属性: CommandText CommandTimeout CommandType Connection Parameters Transcation UpdateRowSource

113 ADO.NET介绍 SqlCommand对象 Dim mySQlCmd as new SqlCommand()
mySQLCmd.CommandType=CommandType.Text mySQLCmd.CommandText=“select * from dbo.authors” mySQLCmd.CommandType=CommandType.TableDirect mySQLCmd.CommandText=“dbo.authors” mySQLCmd.CommandType=CommandType.StoredProcedure mySQLCmd.CommandText=“dbo.sp_get_authors”

114 ADO.NET介绍 SqlCommand对象 主要方法: Cancel CreateParameter ExecuteNonQuery
ExecuteReader ExecuteScalar ExecuteXmlReader Prepare ResetCommandTimeout

115 ADO.NET介绍 SqlCommand对象 ExecuteNonQuery示例:
Dim myCommand As New SqlCommand(myExecuteQuery, myConnection) myCommand.Connection.Open() myCommand.ExecuteNonQuery() myConnection.Close()

116 ADO.NET介绍 SqlCommand对象 ExecuteReader示例:
Dim myConnection As New SqlConnection(myConnectionString) Dim myCommand As New SqlCommand(mySelectQuery, myConnection) myConnection.Open() Dim myReader As SqlDataReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection) While myReader.Read() Console.WriteLine(myReader.GetString(0)) End While myReader.Close() CommandBehavior枚举如下: ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemdatacommandbehaviorclasstopic.htm

117 ADO.NET介绍 SqlCommand对象 ExecuteScalar示例:
myScalarQuery=“select count(*) from authors” Dim myCommand As New SqlCommand(myScalarQuery, myConnection) myCommand.Connection.Open() dim authorsCount as int32=myCommand.ExecuteScalar() myConnection.Close() 执行查询,并返回查询所返回的结果集中第一行的第一列。忽略额外的列或行。

118 ADO.NET介绍 SqlCommand对象 Dim desc As String = "myFirstRegion"
Prepare示例: Dim id As Integer = 20 Dim desc As String = "myFirstRegion" Dim rConn As SqlConnection = New SqlConnection("Persist Security Info=False;" & _ "Integrated Security=SSPI;database=northwind;server=mySQLServer") rConn.Open() Dim command As SqlCommand = New SqlCommand("", rConn) ' Create and prepare an SQL statement. command.CommandText = "insert into Region (RegionID, RegionDescription) id) desc) command.Prepare() ' Calling Prepare after having set the Commandtext and parameters. command.ExecuteNonQuery() ' Change parameter values and call ExecuteNonQuery. command.Parameters(0).Value = 21 command.Parameters(1).Value = "mySecondRegion"

119 ADO.NET介绍 SqlDataReader对象
提供只读向前的数据流,它提供了从SQL Server数据库检查数据的速度最快的方法,它不与SQL Server连接直接交互,须调用SqlCommand对象的ExecuteReader方法 属性: FieldCount Item RecordsAffected Depth IsClosed 执行查询,并返回查询所返回的结果集中第一行的第一列。忽略额外的列或行。

120 ADO.NET介绍 SqlDataReader对象 主要方法: Close
GetBoolean,GetByte,GetChar..GetInt16,GetInt32,GetInt64, GetFloat,GetDouble GetBytes,GetChars GetDataTypeName GetFieldType GetName NextResult Read 执行查询,并返回查询所返回的结果集中第一行的第一列。忽略额外的列或行。

121 ADO.NET介绍 SqlDataReader对象 示例:
Dim mySelectQuery As String = "SELECT OrderID, CustomerID FROM Orders" Dim myConnection As New SqlConnection(myConnString) Dim myCommand As New SqlCommand(mySelectQuery, myConnection) myConnection.Open() Dim myReader As SqlDataReader myReader = myCommand.ExecuteReader() While myReader.Read() Console.WriteLine((myReader.GetInt32(0) & ", " & myReader.GetString(1))) End While myReader.Close() myConnection.Close() 注意,没有back和first方法

122 ADO.NET介绍 SqlDataAdapter对象 为什么要采用SqlDataAdapter 常用属性: DeleteCommand
InsertCommand UpdateCommand SelectCommand TableMappings AcceptChangesDuringFill:指定在Fill操作期间,将其添加至DataTable时是否调用AcceptChanges MissSchemaAction:确定现有 DataSet 架构与传入数据不匹配时需要执行的操作。 MissMappingAction:确定传入数据没有匹配的表或列时需要执行的操作。

123 ADO.NET介绍 Public Shared Function CreateCustomerAdapter(conn As SqlConnection) As SqlDataAdapter Dim da As SqlDataAdapter = New SqlDataAdapter() Dim cmd As SqlCommand cmd = New SqlCommand("SELECT * FROM Customers " & _ "WHERE Country AND City conn) SqlDbType.NVarChar, 15) SqlDbType.NVarChar, 15) da.SelectCommand = cmd cmd = New SqlCommand("INSERT INTO Customers (CustomerID, CompanyName) " & _ conn) SqlDbType.NChar, 5, "CustomerID") SqlDbType.NVarChar, 40, "CompanyName") da.InsertCommand = cmd Return da End Function

124 ADO.NET介绍 SqlDataAdapter对象 DeleteCommand:
Public Shared Function CreateCustomerAdapter(conn As SqlConnection) As SqlDataAdapter cmd = New SqlCommand("DELETE FROM Customers WHERE CustomerID conn) parm = SqlDbType.NChar, 5, "CustomerID") parm.SourceVersion = DataRowVersion.Original da.DeleteCommand = cmd Return da End Function

125 ADO.NET介绍 SqlDataAdapter对象
TableMapping:获取一个集合,它提供源表和 DataTable 之间的主映射。默认值是一个空集合。 Public Sub ShowTableMappings() ' ... ' create myDataAdapter myDataAdapter.TableMappings.Add("Categories", "DataCategories") myDataAdapter.TableMappings.Add("Orders", "DataOrders") myDataAdapter.TableMappings.Add("Products", "DataProducts") Dim myMessage As String = "Table Mappings:" + ControlChars.Cr Dim i As Integer For i = 0 To myDataAdapter.TableMappings.Count - 1 myMessage += i.ToString() + " " _ + myDataAdapter.TableMappings(i).ToString() + ControlChars.Cr Next i MessageBox.Show(myMessage) End Sub

126 ADO.NET介绍 SqlDataAdapter对象
MissingSchemaAction 属性 确定现有 DataSet 架构与传入数据不匹配时需要执行的操作。 Add:添加必需的列以完成架构。 (默认) AddWithKey:添加必需的列和主键信息以完成架构。 Error:如果缺少指定的列映射,则生成 InvalidOperationException。 Ignore:忽略额外列。 MissMappingAction 属性 确定传入数据没有匹配的表或列时需要执行的操作。 Ignore:忽略没有映射的列或表。返回空引用(Visual Basic 中为 Nothing)。 PassThrough:创建源列或源表,并使用其原始名称将其添加到 DataSet(默认值) 添加p37的代码

127 ADO.NET介绍 SqlDataAdapter对象 主要方法: Fill FillSchema GetFillParameters
Update 主要事件: RowUpdating RowUpdated 两事件都允许监控并对数据源的变化并作出反应。在数据源修改任何数据前都会触发RowUpdating,在修改后就会触发RowUpdated事件

128 ADO.NET介绍 SqlDataAdapter对象 Fill 方法: 在 DataSet 中添加或刷新行以匹配数据源中的行。
Public Sub GetMyRecords() ' ... ' create myDataSet and myDataAdapter myDataAdapter.Fill(myDataSet, 9, 15, "Categories") End Sub

129 ADO.NET介绍 SqlDataAdapter对象
FillSchema 方法: 将 DataTable 添加到 DataSet 中,并配置架构以匹配数据源中的架构。 Public Shared Function GetCustomerData(dataSetName As String) As DataSet Dim ds As DataSet = New DataSet(dataSetName) Dim conn As SqlConnection = New SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind") Dim da As SqlDataAdapter = New SqlDataAdapter("SELECT CustomerID, CompanyName, ContactName FROM Customers", conn) conn.Open() da.FillSchema(ds, SchemaType.Source, "Customers") da.Fill(ds) conn.Close( Return ds End Function

130 ADO.NET介绍 SqlDataAdapter对象
Update 方法:为 DataSet 中每个已插入、已更新或已删除的行调用相应的 INSERT、UPDATE 或 DELETE 语句。 Dim arArray(3) as Object Dim drDataRow as DataRow daDataAdpater.Fill(dsDataSet,”Store”) arArray(0)=“a” arArray(1)=“b” arArray(2)=“c” arArray(3)=“d” drDataRow=dsDataSet.tables(“Store”).Rows.Add(arArray) daDataAdpater.Update(dsDataSet)

131 ADO.NET介绍 DataSet对象 DataSet是ADO.NET的核心,是数据在内存中的副本,与ADO Recordset不同的是,它有多个表,每个表都来自不同的数据存储,可以通过关系将DataSet中的表彼此相连。简言之,DataSet只是内存数据库,它没有与填充它的基本数据存储相连。

132 ADO.NET介绍 DataSet相关层次模型

133 ADO.NET介绍 DataSet工作原理图 DataSet DataTable DataColumn DataRow
DataRelation DataTable DataRow DataColumn

134 ADO.NET介绍 DataSet工作原理图 在典型的多层实现中,用于创建和刷新 DataSet 并依次更新原始数据的步骤包括:
通过 DataAdapter 使用数据源中的数据生成和填充 DataSet 中的每个 DataTable。 通过添加、更新或删除 DataRow 对象更改单个 DataTable 对象中的数据。 调用 GetChanges 方法以创建只反映对数据进行的更改的第二个 DataSet。 调用 DataAdapter 的 Update 方法,并将第二个 DataSet 作为参数传递。 调用 Merge 方法将第二个 DataSet 中的更改合并到第一个中。 针对 DataSet 调用 AcceptChanges。或者,调用 RejectChanges 以取消更改。

135 ADO.NET介绍 DataSet对象 主要属性 CaseSensitive DataSetName DefaultViewManager
Tables Relations NameSpace Prefix HasErrors EnforceConstrains

136 ADO.NET介绍 DataSet对象 主要方法 AcceptChanges ReadXmlSchema
Clear RejectChanges Clone Reset Copy WriteXml GetChanges WriteXmlSchema GetXml GetXmlSchema HasChanges Merge ReadXml

137 ADO.NET介绍 DataSet对象 主要方法及属性示例: namespace,readxml,readxmlschema
WriteXml Merge: 将指定的 DataSet、DataTable 或 DataRow 对象的数组合并到当前的 DataSet 或 DataTable 中。 Private Sub ReadData(thisDataSet As DataSet) thisDataSet.Namespace = "CorporationA" thisDataSet.Prefix = "DivisionA" ' Read schema and data. Dim filename As String = "CorporationA_Schema.xml" thisDataSet.ReadXmlSchema(filename) filename = "DivisionA_Report.xml" thisDataSet.ReadXml(filename) End Sub 2 Private Sub WriteXmlToFile(thisDataSet As DataSet) If thisDataSet Is Nothing Then Return End If ' Create a file name to write to. Dim filename As String = "myXmlDoc.xml" ' Create the FileStream to write with. Dim myFileStream As New System.IO.FileStream _ (filename, System.IO.FileMode.Create) ' Create an XmlTextWriter with the fileStream. Dim myXmlWriter As New System.Xml.XmlTextWriter _ (myFileStream, System.Text.Encoding.Unicode) ' Write to the file with the WriteXml method. thisDataSet.WriteXml(myXmlWriter) myXmlWriter.Close() Private Sub DemonstrateMergeTableAddSchema() ' Create a DataSet with one table, two columns, and ten rows. Dim ds As New DataSet("myDataSet") Dim t As New DataTable("Items") ' Add tables to the DataSet ds.Tables.Add(t) ' Create and add two columns to the DataTable Dim c1 As New DataColumn("id", Type.GetType("System.Int32"), "") c1.AutoIncrement = True Dim c2 As New DataColumn("Item", Type.GetType("System.Int32"), "") t.Columns.Add(c1) t.Columns.Add(c2) ' DataColumn array to set primary key. Dim keyCol(1) As DataColumn ' Set primary key column. keyCol(0) = c1 t.PrimaryKey = keyCol ' Add RowChanged event handler for the table. AddHandler t.RowChanged, AddressOf Row_Changed ' Add ten rows. Dim i As Integer Dim r As DataRow For i = 0 To 9 r = t.NewRow() r("Item") = i t.Rows.Add(r) Next i ' Accept changes. ds.AcceptChanges() PrintValues(ds, "Original values") ' Create a second DataTable identical to the first ' with one extra column using the Clone method. Dim t2 As New DataTable t2 = t.Clone() ' Add column. t2.Columns.Add("extra", Type.GetType("System.String")) ' Add two rows. Note that the id column can't be the ' same as existing rows in the DataSet table. Dim newRow As DataRow newRow = t2.NewRow() newRow("id") = 12 newRow("Item") = 555 newRow("extra") = "extra Column 1" t2.Rows.Add(newRow) newRow("id") = 13 newRow("Item") = 665 newRow("extra") = "extra Column 2" ' Merge the table into the DataSet. Console.WriteLine("Merging") ds.Merge(t2, False, MissingSchemaAction.Add) PrintValues(ds, "Merged With Table, Schema Added") Private Sub Row_Changed(sender As Object, e As DataRowChangeEventArgs) Console.WriteLine("Row Changed " + e.Action.ToString() _ + ControlChars.Tab + e.Row.ItemArray(0).ToString()) Private Sub PrintValues(ds As DataSet, label As String) Console.WriteLine(ControlChars.Cr + label) Dim t As DataTable Dim c As DataColumn For Each t In ds.Tables Console.WriteLine("TableName: " + t.TableName) For Each r In t.Rows For Each c In t.Columns Console.Write(ControlChars.Tab + " " + r(c).ToString()) Next c Console.WriteLine() Next r Next t

138 ADO.NET介绍 DataTable对象 DataTable是从SqlDataAdapter创建的查询返回记录集,如果有多个记录集,那么就会得到一个DataTables的集合 主要属性: CaseSensitive Prefix ChildRelations PrimaryKey Columns Rows Constraints TableName DataSet DefaultView获取可能包括筛选视图或游标位置的表的自定义视图。 HasErrors MinimumCapacity NameSpace DataTable 是 ADO.NET 库中的核心对象。其他使用 DataTable 的对象包括 DataSet 和 DataView。 与dataset关连 Dim cDataset as new Dataset cDataset.tables.add(“myTable”) Columns属性示例:获取属于该表的列的集合。 Private Sub PrintValues(ByVal myTable As DataTable) Dim myRow As DataRow Dim myColumn As DataColumn For Each myRow in myTable.Rows For Each myColumn In myTable.Columns Console.WriteLine(myRow(myColumn)) Next End Sub Constraints示例: Private Sub CreateConstraint(myDataSet As DataSet, table1 As String, table2 As String, _ column1 As String, column2 As String) Dim idKeyRestraint As ForeignKeyConstraint = New ForeignKeyConstraint _ (myDataSet.Tables(table1).Columns(column1), _ myDataSet.Tables(table2).Columns(column2)) ' Set null values when a value is deleted. idKeyRestraint.DeleteRule = Rule.SetNull idKeyRestraint.UpdateRule = Rule.Cascade ' Set AcceptRejectRule to cascade changes. idKeyRestraint.AcceptRejectRule = AcceptRejectRule.Cascade myDataSet.Tables(table1).Constraints.Add(idKeyRestraint) myDataSet.EnforceConstraints = True DefaultView: Private Sub BindDataGrid() Dim myDataTable As New DataTable ' Insert code to populate a DataTable with data. ' Bind DataGrid to DataTable DataGrid1.DataSource = myDataTable Private Sub ChangeRowFilter() Dim gridTable As DataTable = CType(dataGrid1.DataSource, DataTable) ' Set the RowFilter to display a company names that begin with A through I. gridTable.DefaultView.RowFilter = "CompanyName < 'I'"

139 ADO.NET介绍 DataTable对象 主要方法: AcceptChanges RejectChanges
BeginLoadData Reset Clear Select Clone Copy EndLoadData GetChanges GetErrors ImportRow LoadDataRow NewRow

140 ADO.NET介绍 DataTable对象 BeginLoadData/EndLoadData/LoadDataRow
NewRow/ImportRow Select 1 BeginloadData 在加载数据时关闭通知、索引维护和约束。 LoadDataRow:查找和更新特定行。如果找不到任何匹配行,则使用给定值创建新行。 EndLoadRow在加载数据后打开通知、索引维护和约束。 Private Sub MyAddUpdate(ByVal myTable As DataTable) ' Create an array for the values. Dim newRow(2) As Object ' Set the values of the array. newRow(0) = "Hello" newRow(1) = "World" newRow(2) = "two" Dim myRow As DataRow myTable.BeginLoadData() ' Add the new row to the rows collection. myRow = myTable.LoadDataRow(newRow, True) myTable.EndLoadData() End Sub 2 ImportRow:将 DataRow 复制到 DataTable 中,保留任何属性设置以及初始值和当前值。 调用 NewRow 时将使用现有的表架构向表中添加一行,并为该行填充默认值,同时将 DataRowState 设置为 Added。调用 ImportRow 将保留现有的 DataRowState 以及该行中的其他值。 Private Sub MakeDataTableAndDisplay() ' Create new DataTable and DataSource objects. Dim myDataTable As DataTable = New DataTable() ' Declare DataColumn and DataRow variables. Dim myColumn As DataColumn Dim myDataView As DataView ' Create new DataColumn, set DataType, ColumnName and add to DataTable. myColumn = New DataColumn() myColumn.DataType = System.Type.GetType("System.Int32") myColumn.ColumnName = "id" myDataTable.Columns.Add(myColumn) ' Create second column. myColumn.DataType = Type.GetType("System.String") myColumn.ColumnName = "item" ' Create new DataRow objects and add to DataTable. Dim i As Integer For i = 0 to 9 myRow = myDataTable.NewRow() myRow("id") = i myRow("item") = "item " & i myDataTable.Rows.Add(myRow) Next ' Create a DataView using the DataTable. myDataView = New DataView(myDataTable) ' Set a DataGrid control's DataSource to the DataView. DataGrid1.DataSource = myDataView 3 select获取 DataRow 对象的数组。 Dim myDataAdpater as new SqlAdapter(“select * from employee”,sqlconn) myDataAdapter.TableMapping(“Table”,”employee”) myDataAdapter.MissionSchemaAction=MissionSchemaAction.AddWithKey myDataAdapter.Fill(myDataSet) Dim myDataRow as DataRow Dim myDataRows as DataRow myDataRows=myDataSet.Tables(“employee”).select(“lname like ‘A%’) For Each myDataRow in myDataRows

141 ADO.NET介绍 DataRow对象 在ADO以前的版本中,从查询返回的记录保留在Recordset。该Recordset在运行时仍然连接到数据源并进行更新。DataRow对象与Recordset相似,因为它保留与查询相关的数据,不过该数据是以断开连接Recordset的形式保存在内存中,因此对数据的任何修改都需要进行进一步的操作。 表示 DataTable 中的一行数据。 可以检查HasErrors属性,在发现错误时可采取CancelEdit撤消修改或使用EndEdit提交修改。 Private Sub CreateNewDataRow() ' Use the MakeTable function below to create a new table. Dim myTable As DataTable myTable = MakeNamesTable() ' Once a table has been created, use the NewRow to create a DataRow. Dim myRow As DataRow myRow = myTable.NewRow() ' Then add the new row to the collection. myRow("fName") = "John" myRow("lName") = "Smith" myTable.Rows.Add(myRow) Dim dc As DataColumn For Each dc in myTable.Columns Console.WriteLine(dc.ColumnName) Next DataGrid1.DataSource=myTable End Sub Private Function MakeNamesTable() As DataTable ' Create a new DataTable titled 'Names.' Dim namesTable As DataTable = new DataTable("Names") ' Add three column objects to the table. Dim idColumn As DataColumn = new DataColumn() idColumn.DataType = System.Type.GetType("System.Int32") idColumn.ColumnName = "id" idColumn.AutoIncrement = True namesTable.Columns.Add(idColumn) Dim fNameColumn As DataColumn = New DataColumn() fNameColumn.DataType = System.Type.GetType("System.String") fNameColumn.ColumnName = "Fname" fNameColumn.DefaultValue = "Fname" namesTable.Columns.Add(fNameColumn) Dim lNameColumn As DataColumn = new DataColumn() lNameColumn.DataType = System.Type.GetType("System.String") lNameColumn.ColumnName = "LName" namesTable.Columns.Add(lNameColumn) ' Create an array for DataColumn objects. Dim keys(0) As DataColumn keys(0) = idColumn namesTable.PrimaryKey = keys ' Return the new DataTable. MakeNamesTable = namesTable End Function

142 ADO.NET介绍 DataRow对象 常用属性: HasErrors Item ItemArray RowError RowState
Table 以下示例使用 HasErrors 来检查是否存在错误。如果该行有错误,则 GetColumnsInError 方法返回包含错误的列的数组,这些错误之后可以消除。然后,调用 ClearErrors 方法来清除所有错误。 Private Sub GetAllErrs(ByVal myRow As DataRow) ' Declare an array variable for DataColumn objects. Dim colArr() As DataColumn ' If the Row has errors, check use GetColumnsInError. Dim i As Integer If myRow.HasErrors Then ' Get the array of columns in error. colArr = myRow.GetColumnsInError() For i = 0 to colArr.Length - 1 ' Insert code to fix errors on each column. Console.WriteLine(colArr(i).ColumnName) Next i ' Clear errors after reconciling. myRow.ClearErrors() End If End Sub

143 ADO.NET介绍 DataRow对象 常用属性: ItemArray:通过数组获取或设置此行的所有值。
RowError:获取或设置行的自定义错误说明。可使用 HasErrors 属性首先确定 DataRow 中是否包含错误。 Dim cDataset as new DataSet() Dim cRow as DataRow Dim rowValue(1) as Object rowValue(0)=1 rowValue(1)=“ABC” cRow=cDataset.tables(“myTable”).NewRow cRow.ItemArray=rowValues cDataset.tables(“myTable”).Rows.add(cRow) 2: Private Sub SetRowErrors(ByVal myTable As DataTable) ' Set error text for ten rows. Dim i As Integer For i = 0 to 10 ' Insert column 1 value into each error. myTable.Rows(i).RowError = "ERROR: " & myTable.Rows(i)(1).ToString() Next ' Get the DataSet for the table, and test it for errors. Dim myDataSet As DataSet myDataSet = myTable.DataSet TestForErrors(myDataSet) End Sub Private Sub TestForErrors(ByVal myDataSet As DataSet) ' Test for errors. If DataSet has errors, test each table. If myDataSet.HasErrors Dim tempDataTable As DataTable For Each tempDataTable in myDataSet.Tables ' If the table has errors, then print them. If(tempDataTable.HasErrors) Then PrintRowErrs(tempDataTable) ' Refresh the DataGrid to see the error-marked rows. DataGrid1.Refresh() End If Private Sub PrintRowErrs(ByVal myTable As DataTable) Dim myDataRow As DataRow For Each myDataRow in myTable.Rows If(myDataRow.HasErrors) Then Console.WriteLine(myDataRow.RowError)

144 ADO.NET介绍 DataRow对象 常用属性: RowState
RowState 的值取决于两个因素:(1) 已在行上执行的操作类型;(2) 是否已对 DataRow 调用了 AcceptChanges。

145 ADO.NET介绍 DataRow对象 Added 该行已添加到 DataRowCollection 中,AcceptChanges 尚未调用。 4 Deleted 该行已通过 DataRow 的 Delete 方法被删除。 8 Detached 该行已被创建,但不属于任何 DataRowCollection。DataRow 在以下情况下立即处于此状态:创建之后添加到集合中之前;或从集合中移除之后。 1 Modified 该行已被修改,AcceptChanges 尚未调用。 16 Unchanged 该行自上次调用 AcceptChanges 以来尚未更改。 2 Private Sub DemonstrateRowState() 'Run a function to create a DataTable with one column. Dim myTable As DataTable = MakeTable() Dim myRow As DataRow ' Create a new DataRow. myRow = myTable.NewRow() ' Detached row. Console.WriteLine("New Row " + myRow.RowState.ToString()) myTable.Rows.Add(myRow) ' New row. Console.WriteLine("AddRow " + myRow.RowState.ToString()) myTable.AcceptChanges() ' Unchanged row. Console.WriteLine("AcceptChanges " + myRow.RowState.ToString()) myRow("FirstName") = "Scott" ' Modified row. Console.WriteLine("Modified " + myRow.RowState.ToString()) myRow.Delete() ' Deleted row. Console.WriteLine("Deleted " + myRow.RowState.ToString()) End Sub Private Function MakeTable() As DataTable ' Make a simple table with one column. Dim dt As New DataTable("myTable") Dim dcFirstName As New DataColumn("FirstName", _ Type.GetType("System.String")) dt.Columns.Add(dcFirstName) Return dt End Function

146 ADO.NET介绍 DataRow对象 常用方法: AcceptChanges GetParentRows
BeginEdit HasVersion CancelEdit IsNull ClearErrors RejectChanges Delete SetColumnError EndEdit SetParentRow GetChildRows GetColumnError GetColumnInErro GetParentRow 2 Private Sub AcceptOrReject(ByVal myRow As DataRow) ' Use a function to validate the row's values. ' If the function returns true, end the edit; otherwise cancel it. If ValidateRow(myRow) Then myRow.EndEdit() Else myRow.CancelEdit() End If End Sub Private Function ValidateRow(ByVal myRow As DataRow) As Boolean Dim isValid As Boolean ' Insert code to validate the row values. Set the isValid variable. ValidateRow = isValid End Function

147 ADO.NET介绍 DataRow对象 HasVersion:获取一个值,该值指示指定版本是否存在。根据对行的修改状态,只能使用其中一些RowVersions。如果请求不存的RowVersion的DataRow,就会出现异常。在这种情况下,就可以使用HasVersion来判断是否存在某种RowVersion

148 ADO.NET介绍 DataRow对象 RowVersion
Current 行的当前值 Default 默认行版本,由RowState决定 Original 行的原始值 Proposed 行的建议值 以下示例使用 HasVersion 方法确定列的当前值和建议值是否相同。如果相同,则取消编辑。否则,调用 AcceptChanges 方法以终止编辑。 Private Sub CheckVersionBeforeAccept() Dim r As DataRow Dim t As DataTable ' Assuming the DataGrid is bound to a DataTable. t = CType(DataGrid1.DataSource, DataTable) r = t.Rows(DataGrid1.CurrentCell.RowNumber) r.BeginEdit r(1) = Edit1.Text If r.HasVersion(datarowversion.Proposed) Then If r(1, DataRowVersion.Current) Is r(1, DataRowversion.Proposed) Then MessageBox.Show("The original and the proposed are the same") r.CancelEdit Exit Sub Else r.AcceptChanges End If MessageBox.Show("No new values proposed")

149 ADO.NET介绍 DataColumn对象
DataColumn对象用于定义DataTable对象的结构。添加到DataTable的每个DataRow都必须提供DataTable中各列的值。 注意:DataColumn只与结构有关,访问某列的值请通过DataRow.Item属性对单个行值进行访问。 Private Sub MakeTable() ' Create a DataTable. Dim myTable As DataTable = new DataTable("myTable") ' Create a DataColumn and set various properties. Dim myColumn As DataColumn = New DataColumn myColumn.DataType = System.Type.GetType("System.Decimal") myColumn.AllowDBNull = False myColumn.Caption = "Price" myColumn.ColumnName = "Price" myColumn.DefaultValue = 25 ' Add the column to the table. myTable.Columns.Add(myColumn) ' Add 10 rows and set values. Dim myRow As DataRow Dim i As Integer For i = 0 to 9 myRow = myTable.NewRow() myRow("Price") = i + 1 ' Be sure to add the new row to the DataRowCollection. myTable.Rows.Add(myRow) Next i End Sub

150 ADO.NET介绍 DataColumn对象 常用属性: AllowDBNull Table AutoIncrement Unique
AutoIncrementSeed Caption AutoIncrementStep ColumnName DataType DefaultValue Expression MaxLength Ordinal ReadOnly 1 获取或设置一个值,指示对于属于该表的行,此列中是否允许空值。如果允许空值,则为 true;否则为 false。默认为 true。 Private Sub AddNullAllowedColumn() Dim myColumn As DataColumn myColumn = New DataColumn("classID", System.Type.GetType("System.Int32")) myColumn.AllowDBNull = True ' Add the column to a new DataTable. Dim myTable As DataTable myTable = New DataTable myTable.Columns.Add(myColumn) End Sub

151 ADO.NET介绍 DataColumn对象
AutoIncrement/AutoIncrementSeed/AutoIncrementStep DataType/DefaultValue Ordinal ReadOnly,Unique Expression Private Sub AddAutoIncrementColumn() Dim myColumn As DataColumn = New DataColumn myColumn.DataType = System.Type.GetType("System.Int32") With MyColumn .AutoIncrement = True .AutoIncrementSeed = 1000 .AutoIncrementStep = 10 End With ' Add the column to a new DataTable. Dim myTable As DataTable myTable = New DataTable myTable.Columns.Add(myColumn) End Sub 2 Dim myCol As DataColumn Dim myTable As New DataTable myCol = New DataColumn With myCol .DataType = System.Type.GetType("System.String") .DefaultValue = "Address" .Unique = False myTable.Columns.Add(myCol) .DataType = System.Type.GetType("System.Int32") .DefaultValue = 100 3 Private Sub PrintColumnDetails(ByVal myColumn As DataColumn) ' Print the Ordinal, ColumnName, and DataType of the column. Console.WriteLine(myColumn.Ordinal) Console.WriteLine(myColumn.ColumnName) Console.WriteLine(myColumn.DataType) 4 Private Sub AddColumn(myTable As DataTable) ' Add a DataColumn to the collection and set its properties. Dim myColumn As DataColumn ' The constructor sets the ColumnName of the column. myColumn = New DataColumn("Total") myColumn.DataType = System.Type.GetType("System.Decimal") myColumn.ReadOnly = True myColumn.Expression = "UnitPrice * Quantity" myColumn.Unique = False

152 ADO.NET介绍 DataRelation对象
综上,DataSet可以看作是数据库在内存的副本。但是,它们之间有一个比较大的差别,DataTable对象反映基本数据表的结构,但是使用Fill方法对它们填充时,却不能从数据库的参照完整性约束条件隐含地建立DataTables之间的关系。 可以使用DataRelation创建DataSet与DataTables之间的关系,从而在DataSet中查找时可以保护数据完整性。 DataRelation 对象可执行两种功能: 它可使与正使用的记录相关的记录可用。如果在父记录中,它提供子记录;如果正使用子记录,它提供父记录。 它可强制约束的引用完整性,如删除父记录时删除相关的子记录。 例如,包含销售数据的数据集可能有 Customers 表和 Orders 表。即使这些表包含公共键(在本例中可能是 CustomerID),但数据集本身并不跟踪一个表中与另一个表中的记录相关的记录。但可以创建引用父表和子表(及它们的键)的 DataRelation 对象,然后通过该对象来使用相关表。 Private Sub CreateRelation() ' Get the DataColumn objects from two DataTable objects in a DataSet. Dim parentCol As DataColumn Dim childCol As DataColumn ' Code to get the DataSet not shown here. parentCol = DataSet1.Tables("Customers").Columns("CustID") childCol = DataSet1.Tables("Orders").Columns("CustID") ' Create DataRelation. Dim relCustOrder As DataRelation relCustOrder = New DataRelation("CustomersOrders", parentCol, childCol) ' Add the relation to the DataSet. DataSet1.Relations.Add(relCustOrder) End Sub

153 ADO.NET介绍 DataRelation对象 2 DataRelation 对象和约束 1 访问相关记录 GetChildRow
GetParentRow 2 DataRelation 对象和约束 唯一约束,它保证表中的列不包含重复内容。   外键约束,可用来维护数据集中的父表和子表之间的引用完整性。 1 DataRelation 的主要功能之一是允许您在 DataSet 中从一个 DataTable 导航至另一个 DataTable。它使您能够在给定相关 DataTable 中的单个 DataRow 的情况下检索一个 DataTable 中的所有相关 DataRow 对象。例如,当建立客户表和订单表之间的 DataRelation 后,可以使用 DataRow.GetChildRows 检索特定客户行的所有订单行。 以下代码示例创建 DataSet 中 Customers 表和 Orders 表之间的 DataRelation,并返回每个客户的所有订单。 Dim custOrderRel As DataRelation = custDS.Relations.Add("CustOrders", _ custDS.Tables("Customers").Columns("CustomerID"), _ custDS.Tables("Orders").Columns("CustomerID")) Dim custRow As DataRow Dim orderRow As DataRow For Each custRow in custDS.Tables("Customers").Rows Console.WriteLine(custRow("CustomerID")) For Each orderRow in custRow.GetChildRows(custOrderRel) Console.WriteLine(orderRow("OrderID")) Next 2 (1) Public Sub CreateTable() Dim myTable As DataTable = New DataTable myTable.Columns.Add("CustomerID", Type.GetType("System.String")) myTable.Columns.Add("CompanyName", Type.GetType("System.String")) Dim myUC As UniqueConstraint = New UniqueConstraint("CustConstraint", _ New DataColumn() {myTable.Columns("CustomerID"), _ myTable.Columns("CompanyName")} ) myTable.Constraints.Add(myUC) End Sub (2) Private myDataSet As SuppliersProducts Private Sub CreateConstraint() ' Declare parent column and child column variables. Dim pCol As DataColumn Dim cCol As DataColumn Dim myFKC As ForeignKeyConstraint ' Set parent and child column variables. pCol = MyDataSet.Tables("Suppliers").Columns("SupplierID") cCol = MyDataSet.Tables("Products").Columns("SupplierID") myFKC = New ForeignKeyConstraint("SupplierFKConstraint", pCol, cCol) ' Set null values when a value is deleted. myFKC.DeleteRule = Rule.SetNull myFKC.UpdateRule = Rule.Cascade myFKC.AcceptRejectRule = AcceptRejectRule.Cascade ' Add the constraint, and set EnforceConstraints to true. myDataSet.Tables("Products").Constraints.Add(myFKC) myDataSet.EnforceConstraints

154 ADO.NET介绍 DataRelation对象 外键约束关系 Cascade 对父记录所做的更改(更新或删除)同样适用于子表中的相关记录。
SetNull 不删除子记录,但子记录中的外键设置为 DBNull。使用该设置后,子记录可以作为“孤行”保留,即子记录与父记录没有关系。 注意 使用此规则会导致子表中的无效数据。 SetDefault 相关子记录中的外键设置为默认值(由列的 DefaultValue 属性建立)。 None 不更改相关子记录。使用该设置后,子记录会以包含对无效父记录的引用结束。 Default 默认值为 Cascade。

155 ADO.NET介绍 DataRelation对象 常用属性: ChildColumns:获取此关系的子 DataColumn 对象。
ChildKeyConstraint:获取关系的 ForeignKeyConstraint。 ChildTable DataSet ExtendedProperties Nested ParentColumns ParentKeyConstraint ParentTable RelationName 1 Private Sub GetChildCols() Dim ChildArr() As DataColumn ' Get the DataRelation of a DataSet. Dim dr As DataRelation dr = DataSet1.Relations("CustomerOrders") ' Get the child columns. ChildArr = dr.ChildColumns ' Print the ColumnName of each column. Dim i As Integer For i = 0 to ChildArr.GetUpperBound(ChildArr) Debug.Write(ChildArr(i).ColumnName) Next i End Sub 2: Private Sub SetChildKeyConstraint(ds As DataSet) Dim cCol As DataColumn Dim pCol As DataColumn ' Set child and parent columns. pCol = ds.Tables("Suppliers").Columns("SupplierID") cCol = ds.Tables("Products").Columns("SupplierID") dr = New DataRelation("SuppliersConstraint", pCol, cCol) ds.Relations.Add(dr) Dim fk As ForeignKeyConstraint = dr.ChildKeyConstraint fk.DeleteRule = Rule.SetNull fk.UpdateRule = Rule.Cascade fk.AcceptRejectRule = AcceptRejectRule.Cascade

156 DataGrid控件专题 DataGrid 控件呈现表格式数据绑定网格。该控件允许您定义各种类型的列,这些列有的用于控制网格的单元格内容的布局,如绑定列和模板列;有的用于添加特定功能,如编辑按钮列和超级链接列等。该控件还支持各种用于在数据中进行分页的选项。 语法:ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpgenref/html/cpcondatagridwebservercontrol.htm

157 .NET经典范例-Duwamish7剖析 N层体系架构

158 .NET经典范例-Duwamish7剖析 构架分析 Duwamish7其结构可以分为五层

159 .NET经典范例-Duwamish7剖析 业务实体层
作用:解决了业务数据表现形式的问题,用于各层间传递信息的数据集。根据需求分析结构,每个业务实体将模型化物理数据库的特定信息,并选择适当 的方式建立不同的业务实体。 对应工程(文件):Common项目

160 .NET经典范例-Duwamish7剖析 数据访问层 作用:为业务规则层提供数据服务,与数据库进行交互,读取或存取数据。
对应工程(文件):DataAccess项目

161 .NET经典范例-Duwamish7剖析 业务规则层
作用:包含各种业务规则和逻辑的实现。完成如客户帐户和书籍订单的验证、税费计算、订单计算这样的任务。 对应工程(文件):BusinessRules项目

162 .NET经典范例-Duwamish7剖析 业务外观层
作用:为Web层提供帐户,类别浏览和购书的界面。用作隔离层,将用户界面与各种业务功能的具体实现隔离起来。 对应工程(文件):BusinessFacade项目

163 .NET经典范例-Duwamish7剖析 Web层 作用:向客户端提供对应程序的访问 构成:由ASP.NET Web窗体和隐藏代码构成
对应工程(文件):Dumanish.sln解决方案中的web项目

164 .NET经典范例-Duwamish7剖析 系统框架层 作用:解决应用程序配置、异常处理、日志记录。
对应工程(文件):SystemFramework项目

165 .NET经典范例-Duwamish7剖析 类结构图

166 .NET经典范例-Duwamish7剖析 --数据库设计
共包含13个表 19个存储过程 无触发器

167 .NET经典范例-Duwamish7剖析 --业务实体层
概述 业务实体组件代表存储在外部介质中的持续对象或者已有的企业应用系统资源。 一个业务实体可以模拟为数据库表中的一个或多个逻辑表,其内容可能来自于一个或者多个物理表中的字段。

168 .NET经典范例-Duwamish7剖析 --业务实体层
结构分析 命名空间 Duwamish7.Common Duwamish7.Common.Data 实体与类及表的的对应关系 实体名 类名 用途 数据表 客户实体 CustomerData Customers 订单实体 OrderData OrderItems,Items,Addresses 书籍类别实体 CategoryData Categories 书籍实体 BookData Books,Items

169 .NET经典范例-Duwamish7剖析 --业务实体层
实现业务实体 XML:使用XML字符串或者DOM DataSet:是表在内存中的高速缓冲 类型化的DataSet:从DataSet类来继承而来的子类。 业务实体组件:自定义的类,用定义字段来保存业务实体数据 使用具有CRUD特性的业务实体

170 .NET经典范例-Duwamish7剖析 --数据访问层
结构分析 命名空间 Duwamish7.DataAccess 包含的类 类名 用途 Books 处理有关BookData实体有关数据访问方法 Categories 处理有关Category实体有关数据访问方法 Customers 处理有关CustomerData实体有关数据访问方法 Orders 处理有关OrderData实体有关数据访问方法

171 .NET经典范例-Duwamish7剖析 --数据访问层
数据访问策略 应用程序用来存储、检索和管理数据的方式。 使用了存储过程,将处理转移到数据而不是数据转向处理。 在一个方法调用中将所有的数据传递回客户端。 将数据库资源保留到最短的时间。 SQL连接配置

172 .NET经典范例-Duwamish7剖析 --数据访问层
类分析 数据访问层与业务外观层、业务规则层、业务实体层有着紧密联系。业务外观层和业务规则层通过数据访问层访问数据库的数据。数据访问层通过业务实体层确定待处理的业务实体。数据访问层中核心方法完全是业务外观层、业务规则层中包含的业务逻辑来设定的。 主要包含四个数据访问组件:Customers、Orders、Books、Categories.每个类对应一种业务实体的多个数据操作方法,并且都是从IDisposable接口继承。

173 .NET经典范例-Duwamish7剖析 --数据访问层
类中方法分析 Customers +InsertCustomer(in customer CustomerData):bool 插入客户数据到数据库中,返回布尔值 +LoadCustomerBy (in Address:String):CustomerData 通过参数 Address,从数据库中获取客户数据 +UpdataCustomer(in customer:CustomerData):bool 更新客户数据、返回一个布尔值

174 .NET经典范例-Duwamish7剖析 --业务外观、规则层
业务外观层 业务外观层为Web层提供帐户、类别浏览和购书的界面。业务外观层用作隔离层,它将用户界面与各种业务功能实现隔离起来 业务规则层 完成各种业务规则和逻辑的实现,如客户帐户、书籍订单的验证、订单税费的计算等。 一般情况下,业务外观层调用业务规则层,然后通过业务外观层调用数据库访问层来完成与数据库的交互。当然,业务外观层也可以直接调用数据访问层来完成与数据库的交互

175 .NET经典范例-Duwamish7剖析 --业务外观、规则层
结构分析 业务外观层 Duwamish7.BusinessFacade 业务规则层 Duwamish7.BusinessRules

176 .NET经典范例-Duwamish7剖析 --业务外观、规则层
结构分析  业务外观层 CustomerSystem 处理与客户界面有关的业务 OrderSystem 处理与订单有关的业务 ProductSystem 处理与书稿有关的业务   业务规则层 Customer 处理与客户逻辑有关的业务 Order 处理与订单逻辑有关的业务

177 .NET经典范例-Duwamish7剖析 --相关问题
Web.config分析 分五节 <configSections> 配置节处理程序的声明 <system.web> 为ASP.NET配置节指定元素 <ApplicationConfiguration> 跟踪设置 <DuwamishConfiguration> 系统应用程序设置 <SourceViewer> 查看源码时的目录设置


Download ppt "郑州轻工业学院网络中心 胡光武 hgw@zzuli.edu.cn .NET技术交流 郑州轻工业学院网络中心 胡光武 hgw@zzuli.edu.cn."

Similar presentations


Ads by Google