C#程序设计案例教程第五章_第1页
C#程序设计案例教程第五章_第2页
C#程序设计案例教程第五章_第3页
C#程序设计案例教程第五章_第4页
C#程序设计案例教程第五章_第5页
已阅读5页,还剩163页未读 继续免费阅读

下载本文档

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

文档简介

第五章本书学习情境:书店管理系统界面设计

5.1学习情境引入

我们学习了C#语言的基本语法,就可以开始用计算机能“理解”的语言表达我们的逻辑思想了,在不断的运用中,逐渐熟练掌握这些语法。开发单机用的“书店管理系统”,除了要用计算机语言描述程序逻辑并写出一段程序外,还要设计程序的用户界面。书店管理系统就是由一个一个的窗体界面组成的,也就是Windows程序窗体界面。友好的窗体界面可以极大地提高人机对话能力,因此窗体界面的设计对应用程序而言是极其重要的5.1.1项目需求

根据书店管理系统项目需求分析,该项目包括登录窗口、主窗体、采购管理、销售管理、仓储管理等界面。1.登录窗口要保证系统的安全性,就需要在使用系统前进行安全身份验证。一般通过输入用户名和密码的形式进行验证,并在登录后记录当前用户及其角色。2.主窗体界面作为一个书店管理系统,结合实际需求分析可知,它要完成的主要业务有采购、仓储、销售、财务。系统应具有供店员完成进书及销售等一系列工作的操作,以及对书店财务账目的操作和管理的功能模块,并且每个模块下又有许多子功能。3.采购管理采购模块供采购人员使用,完成图书信息录入、打印入库单的工作,并可以查询以往采购的图书信息和入库单信息。为了在多次采购同类图书时,避免重复录入烦琐的图书信息,要在采购模块中设置书目管理子模块,对采购的图书信息进行管理,包括录入、查询、修改图书信息等功能。在填写入库单时,只需调用已有的书目信息,即可避免重复录入。入库单管理子模块包括填写、打印入库单等功能。对已经打印、填写错误的出库单,只要仓库管理员未执行出库,销售人员还可以修改,但不允许删除。4.销售模块销售模块包含销售统计和出库单管理两个子模块,供销售人员填写、打印出库单,并进行销售统计。对已经打印、填写错误的出库单,只要仓库管理员未执行出库,销售人员还可以修改,但不允许删除。销售统计是指统计某个时段的畅销书和滞销书等,需要访问出库单表获取销售信息并访问库存表获取价格信息。5.仓储管理库存模块供仓库管理员凭入库单/出库单执行入库/出库以及库存查询功能。5.1.2展示

1.登录窗口图5‑1登录窗口界面设计书店登录窗口的主要作用是接收用户的相关信息,用于验证用户的身份并为用户创建相应的用户书店管理目录环境。所以界面中加有两个文本框和两个按钮及两个标签,如图5-1所示2.书店管理系统主界面建立书店管理系统的主界面,界面中加有菜单栏,如图5-2所示。3.书店管理系统添加图书信息界面添加图书信息界面中有标签、文本框、按钮、图片框等控件,主要完成图书信息的录入,如图5-3所示。5.1.3技术分解

项目展示的3个窗体界面从技术上讲每一个界面就是一个控件,界面内的每一个元素又是一个控件。在这里窗体界面是其他控件的一个容器,在这个容器中包含了其他控件。如图5-4所示的登录窗体界面,主界面是Form控件,Form控件内有Label控件(欢迎使用书店管理系统、用户名:密码:)、TextBox控件(界面中的输入文本框)、Button控件(确定、取消按钮),如图5-4所示。同样道理的书店管理系统的其他界面也是由控件组成的,只是所用的控件不同而已。从某种意义上讲,书店管理系统界面设计,就是如何合理地使用控件来完成所设计功能的过程。通过本章的学习,我们可以设计由多个窗体组成的书店管理信息系统。开发平台为我们提供了很多控件,各控件有不同的属性、事件、方法,但是书店管理系统用到的控件种类有限。希望初学者注意从最常用的开始学习,逐渐举一反三,并培养自己利用MSDN来学习其他更多控件使用方法的良好习惯。本章需要了解的基本知识如下。● 控件的基本概念。● 窗体的方法、属性及事件。● 常用的几类控件的方法、属性及事件。基本知识1:控件类

5.2.1控件类的属性、方法和事件控件(Controls)是完成用户交互的组件。控件可以提供处理数据、接收用户输入、对事件做出响应或执行连接用户和应用程序等其他功能。控件本质上是具有图形接口的组件,所以它能提供组件所提供的功能并与用户进行交互。VS.NET2008提供了丰富的窗体控件,“工具箱”中的“所有Windows窗体”里面包含了所有Windows窗体的标准控件,像标签控件(Label)、按钮控件(Button)、文本框控件(TextBox)等,工具箱中的每个控件都对应一个类,这些类均派生自System.Windows.Forms.Control类。作为各种窗体控件的基类,Control类实现了所有窗体交互控件的基本功能,如处理键盘输入、处理消息驱动、限制控件大小等。.NET已经为我们设计好工具箱中的控件类,初学者的任务是学会使用这些类的公开成员,并将各种不同的控件,组合在一个窗体中,也就是设计一个新的窗体类。学习窗体和其他控件的使用,就是学习它们的属性、方法和事件。1.属性如上一章所述,属性公开了类的数据成员。比如控件的名称,数据成员公开为Name属性。获取某个控件的Name也就得到了控件的名称;给某个控件的Name赋值,也就更改了控件的名称。控件的属性很多,如Text属性对应控件上显示的文字、ForeColor属性对应控件上文字的显示颜色等。C#是强类型语言,对属性值的操作必须类型匹配。例如,设置textBox1控件的Text属性。textBox1.Text="Helloworld!";//这是正确的。textBox1.Text=123;//这是错误的,因为123是Int32类型,而TextBox控件的Text属性是String类型的。因此,要了解属性的含义及其数据类型。图5‑5Windows窗体的属性面板在VisualStudio.NET中,可以直接在属性面板上更改属性的值。属性面板一般在窗口右边,可以按F4键显示,或操作菜单“视图|属性窗口”,如图5-5所示。2.方法方法是一个执行对象的行为的成员。程序员要实现用户要求的逻辑功能,经常会调用某个类的方法,来使对象完成某种行为。方法有一个形式参数列表(可能为空)和一个返回数值(或void),并且可以是静态也可以是非静态。静态方法要通过类来访问。非静态方法,也称为实例方法,要通过类的实例(对象)来访问。方法可以被重载,这意味着多个方法可能有相同的名称。程序员应主要掌握常用方法的参数和返回值。3.事件控件的事件,对应着控件从初始化到和用户交互以至最后销毁,所经历的各个发展阶段。控件的每个事件,都对应着特定的时机。比如Button类控件的Click事件,在用户单击此按钮时发生;再如Form类的Load事件,在窗体初始化后、还未显示时发生。每个事件发生时,都会自动执行关联的一个(或多个)方法,这个方法称为事件委托函数,该函数的参数是事件发生时的环境参数。当然,前提是程序员事先编好了这样的方法,并指定了此方法和某个事件关联。选择合适的事件,编写事件委托函数,是Windows窗体程序设计的工作线索。例如,要求在窗体显示之前用程序设置窗体的标题栏为“欢迎”,我们应该选择Form的Load事件,而不是Button的Click事件。程序员要了解事件发生的时机和事件的参数。在VisualStudio.NET2008的可视化设计界面中,把选中对象的所有事件都列了出来,集中在属性面板的事件列表中,如图5-6所示。在这个事件列表中,左边是这个对象支持的事件,右边是这个事件发生时要执行的方法。如果是空的,那么这个对象将不对这个事件做出反应。因此,事件和方法可以通过这里连接起来。在.NET中,只要双击事件的名称,系统就会把这个事件默认的处理方法和这个事件关联起来,即前述的事件委托。比如,双击Click事件,属性栏就会变为如图5-7所示的形式。在Form1.Designer.cs文件中,窗体设计器生成的代码里,则会自动出现以下语句,该语句和图5-7中的事件表格是一致的:删除此句,属性面板中的“Form1_Load”就会自动消失;清除属性面板中的“Form1_Load”,下面的语句就会被自动删除。

this.Load+=newSystem.EventHandler(this.Form1_Load);出现上面的语句时,Load事件和Form1_Load方法就关联起来,即建立了委托关系。也就是程序运行时,在发生窗体Form1被用户Load的事件时,就会自动执行Form1_Load方法。与此同时,系统会在Form1.cs文件中自动添加Form1_Load方法的声明,代码如下。privatevoidForm1_Load(objectsender,EventArgse){}该方法有两个参数,第一个是object类型,代表发生事件的对象,此处为Form1对象;第二个是EventArgs类型,代表发生Load事件时的环境参数。只要在此方法中写入:this.Text=”欢迎”;就可以实现在窗体显示之前,用程序设置窗体的标题栏为“欢迎”的功能了。5.2.2自测

1.思考题(1)在VisualStudio.NET中,如何设置控件的属性?(2)在VisualStudio.NET中,如何应用控件的事件?并举例说明。基本知识2:Form类

C#中的Windows应用程序是以窗体(Form)为基础的。Windows窗体是组成应用程序用户界面的窗口或对话框,可用来向用户显示信息并接受用户的输入。窗体可以是标准窗口、多文档界面(MDI)窗口、对话框等。新建Windows应用程序模板的项目时,IDE(IntegratedDevelopmentEnvironment)将自动建立一个Form1类的窗体,它派生自Form类。窗体类可以有静态成员,但从Form类继承的多数属性和方法都是实例方法,比如窗体的尺寸属性、显示窗体的方法等。所以,在程序运行时显示出的窗体是由该类创建的实例。在程序中,用this关键字引用当前窗体实例。窗体是与用户交互的主要载体,是整个Windows应用程序的控件容器,其他界面元素(控件等)都可以放置在这个容器中。每向窗体中拖曳一个控件,设计器就为其添加一个字段的声明和初始化,通过组合不同的控件集、设置窗体的属性以及编写相应的事件、方法代码,可以满足用户对应用程序的要求。下面我们就对窗体的一些重要属性、方法和事件进行介绍,之后会发现窗体是一个功能非常强大的对象。5.3.1类的继承

C#允许一个类继承其他类的属性和方法。被继承的类称为父类(也可称其为基类),继承的类称为派生或子类。子类不仅可以继承基类的属性和方法,还可以根据需要定义新的属性和方法,增加新的功能。这样可使用户重用基类的代码,专注于子类的新代码,提高类的可重用性。继承的好处是能共享代码,继承后,父类的所有字段和方法都将存在于子类中,每一个子类都具有父类的非私有特性。在有些语言中,子类可以从不止一个父类中派生,称为多继承。但在C#中,子类仅能派生于一个父类。1.继承的定义

如果要声明一个类派生于另一个类,可以使用下面的语法:[修饰符]class派生类名:基类名{//派生类成员}修饰符:可选择public、internal、abstract、sealed、new、private、protected修饰符,使用时根据需要确定。派生类名:必须是一个有效的C#标识符,一般采用Pascal大小写命名规则,单词的第一个字母大写。基类名:被继承的类的名。类体:用于定义派生类的成员。继承意味着一个类隐藏了除了构造函数和析构函数外基类的所有成员。关于继承,需要注意以下几点。● 继承是可传递的。如果C从B中派生,B又从A中派生,那么C不仅继承了B中声明的成员,同样也继承了A中的成员。Object类是所有类的基类。● 派生类应当是对基类的扩展。派生类可以添加新的成员,但不能除去基类的成员的定义。● 构造函数和析构函数不能被继承。除此以外的其他成员,不论对它们定义了怎样的访问方式,都能被继承。● 派生类如果定义了与继承而来的成员同名的新成员,可以覆盖已继承的成员。但这并不是在派生类中删除了这些成员,而只是不能再访问这些成员。● 类可以定义虚方法、虚属性以及虚索引指示器,它的派生类能够重载这些成员,从而实现类的多态性。● 派生类的成员有两个来源:一个是从基类中继承来的;另一个是在派生类中重新定义的。【例5-1】下面的例子演示了继承的定义。usingSystem;namespaceExample5_1{//定义基类

publicclassUser{protectedstringname;//姓名,保护成员

protectedstringpassWord;//用户密码,保护成员

privatestringrole;//身份,私有成员

publicPerson(stringu_name,stringu_passWord,stringu_role)//构造函数

{passWord=u_passWord;name=u_name;role=u_role;}}//派生类定义

publicclassEmployee:User{publicstringid;//在派生类中填加用户的编号公共成员

publicEmployee(stringu_name,stringu_passWord,stringu_role,stringe_id):base(u_name,u_passWord,u_role)//构造函数

{id=e_id;}

}classClass1{[STAThread]staticvoidMain(string[]args){//用派类创建对象

EmployeeliMing=newEmployee("liMing","123","经理","8888");

}}}程序分析如下。基类User定义了两个数据成员,一个构造函数,对基类不做重点分析,重点分析Employee派生类。publicclassEmployee:User的含义是:public表示公共的;class是类关键字;Employee是派生类名称;“::”表示派生于;User是基类名。类体部分:增加一个公共成员id(表示雇员的编号),增加一个构造函数初始化对象的成员(注意派生类的构造函数的定义)。在Employee派生类的类体部分看不到基类的代码,但是派生类Employee已经继承了基类User的成员,也就是说基类的成员也是派生类的成员。2.定义派生类的构造函数

由于派生类是继承基类的成员,因此,在创建一个派生类对象时,不仅要对派生类中新增加的成员进行初始化,还要对基类中的数据进行初始化。定义派生的类的构造函数的一般形式如下。[修饰符]派生类类名(参数表1):base(参数表2){//派生类初始代码}由于派生类是继承基类的成员,因此,在创建一个派生类对象时,不仅要对派生类中新增加的成员进行初始化,还要对基类中的数据进行初始化。定义派生的类的构造函数的一般形式如下。[修饰符]派生类类名(参数表1):base(参数表2){//派生类初始代码}参数表1:指明参数的名称和类型,包含派生类新增参数及基类的参数,也可以无参数。base:基类关键字表示基类,关键字base为调用基类的成员提供了一个简便的方法,调用基类成员采用的格式为base.成员名。参数表2:指明基类参数的名称无需类型说明,这些参数应包含在参数表1中。派生类初始代码:由语句组成,用于所要执行的操作。【例5-2】下面的示例说明了派生类的构造函数定义。publicclassMyRole//基类MyRole{privateintx;privateinty;publicMyRole(intxx,intyy)//基类构造函数

{x=xx;y=yy;}}publicclassMyDerived:MyRole//派生MyDerived{privateintz;publicMyDerived(intxx,intyy,intzz):base(xx,yy)//派生类构造函数

{z=zz;}}在派生类的构造函数MyDerived(intxx,intyy,intzz)中,用参数xx、yy调用基类的构造函数初始化基类的数据,而用参数zz初始化派生类中的数据成员。派生类的构造函数有如下特点。(1)派生类的构造函数可以重载,以调用基类的不同构造函数。(2)派生类的构造函数体内一般只初始化派生类的数据函数,而不直接初始化基类成员,即使能直接访问它们。注意:在创建对象时,调用派生类的构造函数MyDerived(intxx,intyy,intzz),不必带有:base(xx,yy),MyDerivedmyTest=newMyDerived(1,2,3)。3.使用new修饰符隐藏基类成员

使用new修饰符可以显式隐藏从基类继承的成员,这样在使用派生类的对象的方法时,调用的是派生类重写的与派生类相同的新方法。若要隐藏继承的成员,使用相同名称在派生类中声明该成员,并用new修饰符修饰它即可。看下面的类。publicclassMyBase{publicintx;publicvoidMyVoke(){Console.WriteLine("ThisisMybase”);}}在派生类中用MyVoke名称声明成员会隐藏基类中的MyVoke方法。publicclassMyDerived:MyBase{newpublicvoidMyVoke(){Console.WriteLine("ThisisMyDerived”);}}注意:在同一成员上同时使用new和override是错误的。要调用隐藏的基类中的方法用下列方法:base.基类隐藏的方法。4.密封类和密封方法

C#允许把类和方法声明为sealed。对于类来说,这表示不能继承该类;对于方法来说,这表示不能重写该方法。sealedclassFinalClass{//代码}classDerivedClass:FinalClass//这将给出编译错误,因密封类不能派生{//代码}在把类或方法标记为sealed时,最可能的情形是:如果要对库、类或自己编写的其他类进行操作,则重写某些功能会导致错误。也可以因商业原因把类或方法标记为sealed,以防第三方以违反注册协议的方式扩展该类。但一般情况下,在把类或方法标记为sealed时要小心,因为这么做会严重限制它的使用。即使不希望能继承一个类或重写类的某个成员,仍有可能在将来的某个时刻,有人会遇到我们没有预料到的情形。.NET基类库大量使用了密封类,使希望从这些类中派生出自己的类的第三方开发人员无法访问这些类。例如string就是一个密封类。把方法声明为sealed也可以实现类似的目的,但很少这么做。5.抽象类和抽象函数C#允许把类和函数声明为abstract,抽象类不能实例化,而抽象函数没有执行代码,函数括号后跟一个分号,必须在非抽象的派生类中重写。如果类包含抽象函数,该类也是抽象的,必须声明为抽象的。abstractclassBuilding{publicabstractdecimalCalculateHeatingCost(); //abstractmethod}5.3.2Form类的常用属性、方法和事件

1.Form类的常用属性属性就是一组设置值,用于描述某类对象(如窗体Form)的外观、形状、大小、位置等。对于窗体(Form类),许多属性可以在设计时用属性窗口(如图5-8所示)来设置,几乎所有属性都可以在运行过程中通过代码动态设置。下面我们介绍窗体的一些常用的属性。注意:当在属性窗口选中某属性时,在属性窗口的底部窗格就会显示该属性的简要描述。● Text属性。Text属性主要用来设置窗体标题栏中显示的文本。它可以通过属性窗口来设置(如图5-9中设置为“窗体的标题”),也可以在窗体运行时为Text属性设置属性值,代码如下。this.Text=”窗体的标题”;可以把以上代码放在窗体的构造函数(该过程创建窗体的对象实例,具体参见“构造函数”)中或者窗体的Load事件中。运行效果如图5-9所示。● FormBorderStyle属性。FormBorderStyle属性用来指示窗体的边框和标题栏的外观和行为,如图5-10所示。在FormBorderStyle属性窗口中有7个枚举值,它们的具体含义如表5-1所示。枚举常量窗口的特性Fixed3D固定的三维边框FixedDialog固定的对话框样式的粗边框FixedSingle固定的单行边框续表枚举常量窗口的特性FixedToolWindow不可调整大小的工具窗口边框None无边框Sizable可调整大小的边框SizableToolWindow可调整大小的工具窗口边框● Name属性。图5‑11Name属性的可视化设置该属性为String类型的值,用于获取或设置窗体的名称,该名称主要用于在程序中引用该窗体对象。我们知道,VS默认给新建的窗体命名为Form1、Form2等。我们可以修改窗体的Name属性,一般在设计阶段即应为所有的窗体拟定合适的名称,并在窗体新建的第一时间就将Name属性改定,以免中途改名带来种种麻烦,如图5-11所示。除了以上几个常用属性外,窗体属性(例如窗体图标、背景颜色、显示方式等)还有很多,这里就不一一介绍了,请读者在实验时自行练习。2.Form类的常用方法

下面是一些最常用的窗体的方法及其用途描述。● Show:向用户显示窗体控件。● ShowDialog:将窗体显示为模式对话框。● Close:关闭窗体。● Hide:对用户隐藏窗体控件。.Form类的常用事件

在.NET开发环境下设计窗体时,有以下一些Form类的常用事件(含顺序)。● Init事件。初始化窗体时触发的事件。初始化是窗体生存周期的第一步,在该事件的生存周期内不应该访问其他控件,因为这些控件可能尚未生成。● Load事件。在第一次显示窗体前触发Load事件。● Activated事件。当使用代码激活或用户激活窗体时,就会触发Activated事件。● Mouse事件:MouseMove/Enter/Hover/Down/Up/Leave/Wheel等事件。这些都是与鼠标操作有关的事件,分别在鼠标指针移到窗体上、鼠标指针进入窗体、鼠标指针在窗体内保持静止、鼠标键按下、鼠标键释放、鼠标移出窗体、移动鼠标滚轮时发生。● 键盘事件:KeyDown/Press/Up等(非字符键不引发KeyPress事件)。在窗体上按下键或释放键时发生。● Closing事件。在关闭窗体时发生。● Closed事件。关闭窗体后发生。5.3.3两个Form之间的数据传递

上面一节介绍了Form窗体类的主要属性、方法和事件,下面我们来看一下如何在一个窗体上单击一个按钮以显示另一个窗体。在建立好了项目之后,系统会自动新建一个窗体Fom1,我们可以在上面添加控件、编写程序。当我们的应用程序需要多个窗体时,该如何添加第2个窗体?如何控制第2个窗体呢?设计一个Windows窗体程序,首先要建立Windows应用程序项目,分析本项目需要哪些数据和控件,然后进行设计窗体程序的“三部曲”工作:固定工具箱,在窗体上组织控件并布局;隐藏工具箱、显示属性面板,设计各控件的各属性初始值;指定控件的事件委托,编写事件委托函数及相关函数代码。上述三步可以简单概括为布置界面、设置属性、编写事件委托函数。【例5-3】两个Form的窗体程序小案例。①第一步启动C#应用程序,新建一个项目,进入编辑环境,这样系统会自动给我们新建一个窗体Fom1,如图5-12所示。②从“项目”菜单中选择“添加Windows窗体”项,打开添加新项界面,选择“Windows窗体”。在名称栏内,默认的名称是Form2,可以根据需要来修改它的名称。修改好后单击“添加”按钮,这样设计窗口内就有了第2个窗体,如图5-13所示。③选中Form2窗体,从左边的“工具箱”中拖曳控件,并为所拖曳的控件设置属性,编写相关的事件代码。如拖曳一个Button控件,默认为“button1”,在右边的“属性”面板中,将button1的“Text”属性改为“显示窗体Form2”。然后,双击“button1”,切换到代码页,系统自动生成如下语句。privatevoidbutton1_Click(objectsender,EventArgse){

}编写button1的Click事件代码如下。privatevoidbutton1_Click(objectsender,EventArgse){Form2myForm=newForm2();myForm.Show();}这样就可以了。当程序运行后,首先出现的是Form1窗口,其上有一个按钮,单击该按钮后,出现了Form2窗口,如图5-14所示。5.3.4演练

1.实验题目Form类。2.实验目的● 掌握利用Form对象的基本属性控制Form的外观。● 了解利用Form对象的基本方法。3.实验内容(1)建立一个Windows应用程序项目,包含Form1和Form2两个窗体。Form1中有一个按钮“显示Form2”,要求单击该按钮时才显示Form2;Form2上也有一个按钮“关闭Form1”,单击这个按钮,将关闭Form1,也就关闭了整个应用程序。(2)选做:在(1)基础上,当单击Form1的标题栏的关闭按钮时,显示Form2,隐藏Form1。4.实验步骤由读者写出。5.实验总结由读者写出。5.3.5自测

1.选择题(1)如果将窗体的FormBorderStyle属性设置为None,则

。a.窗体没有边框并不可调整大小。b.窗体没有边框但可以调整大小。c.窗体有边框但不可调整大小。d.窗体是透明的。(2)如果将窗体设置为透明的,则

。a.要将窗体的FormBorderStyle属性设置为None。b.要将Locked属性设置为True。c.要将Opacity属性设置小于100%。d.要将Enable属性设置为True。(3)下面描述错误的是

。a.窗体也是控件。b.窗体也是类。c.控件是从窗体继承来的。d.窗体的父类是控件类。(4)要使窗体刚运行时,显示在屏幕的中央,应设置窗体的

属性。a.WindowsStateb.StartPostionc.CenterScreend.CenterParenr基本知识3:基本控件

VisualStudio.NET提供了很多Windows窗体控件,而且每个控件都有大量的属性和事件。这些控件及其属性和事件使得我们可以快速地设计出内容丰富的Windows窗体。本节将介绍几个最基本的控件。5.4.1Label类控件

标签(Label)控件是一种最简单的控件,通常用于需要静态文字提示的场合,是最常用的控件之一。Label控件还可用于显示应用程序运行时的信息,也可用于为窗体添加描述性文字,以便为用户提供帮助信息。在应用Label控件前,我们先来了解一下Label控件的几个主要属性。1.控件外观● Text属性。Label控件所显示的提示性文字保存在Text属性中。它的设置方法为,首先从“工具箱”中的“所有Windows窗体”中拖曳一个Label控件放在一个窗体中,选中所生成的Label1,再在其属性面板中把Text属性改为所要显示的文本即可,如图5-15所示。运行效果如图5-16所示。注意:TextAlign属性只有在Label控件的AutoSize属性值为False时有效● TextAlign属性。为了设置Label控件中文字的排列方式,Label控件还定义了一个TextAlign属性。该属性同样采用了可视化设置,如图5-17所示,用户可以很方便地设置Label控件中文字的排列方式。● Image属性。为了美化Label控件的显示效果,还可以通过Image属性为Label控件指定一幅图片在为背景。可以作为Label控件背景的图片类型包括jpg、bmp、gif、png等,操作如图5-18所示。说明:VS2008提供的一些常用的图标图片存放的默认安装位置为“C:\ProgramFiles\MicrosoftVisualStudio9.0\Common7\VS2008ImageLibrary”路径下● ForeColor和BackColor属性。分别表示文字颜色(前景色)和背景色,属性类型都为Color结构类型,可以进行可视化设置。通过Label控件的BackColor属性可以设置标签的背景颜色。在属性面板中,系统提供了几十种颜色可供选择。另外还可以通过程序代码来修改BackColor属性,例如:Label1.BackColor=Color.Transparent;是将标签设为透明。● Font属性。表示文本的字体,包含丰富的字体设置,属性类型是System.Drawing.Font类,可以通过可视化的方法进行设置,如图5-19所示。单击Font属性后面的“省略号”,即可弹出字体对话框,如图5-20所示。2.控件布局属性

● AutoSize属性。表示控件大小是否自动适应文字内容,为bool类型,属性值默认为True。● Left、Top、Width、Height属性和Location、Size属性。表示控件在父容器中的定位和尺寸,其中Left、Top表示定位,在属性面板中显示为Location属性,Width和Height表示尺寸,在属性面板中显示为Size属性。Left、Top、Width、Height属性是int类型,Location是Point结构类型,Size是Size结构类型。3.其他

● Enabled属性。表示该控件是否可供用户使用,为bool类型,默认为True(所有控件都有此属性)。若设置此属性值为False,则该控件在运行时状态为灰色显示(即为不可用)。5.4.2TextBox类控件

文本框(TextBox)用于获取用户输入或显示的文本,是最常用的控件之一。在应用该控件前,我们先介绍一些他的常用属性和方法事件。1.常用属性

● Text属性。保存用户通过文本框输入的信息,可以在界面设计时指定一个初始值,这样在程序运行时,该初始值将自动显示在该文本框中。在程序中可以通过读取该属性的值来获取用户的输入信息。● ReadOnly属性。指定文本框是否为只读控件,默认值为False。默认情况下,文本框中的内容可以被编辑。如果将ReadOnly属性的值设为True后,则该控件不可用。● MultiLine属性。控制编辑控件的文本是否能够跨越多行,默认值为False。在默认的情况下,文本框可以最多输入2

048个字符。如果将MultiLine属性的值设为True,则最多可以容纳32KB的文本。同样,在多行输入的情况下,也可以通过读取该属性的值来获取用户的输入信息。● TabIndex/TabStop属性。按Tab键时的焦点顺序,要想哪个TextBox获得焦点,把它的TabStop属性设为True即可。2.常用事件

【例5-4】文本框TextChanged事件的应用演示。其大体步骤为,首先从“工具箱”中的“所有Windows窗体”中拖曳一个TextBox控件放在一个窗体中,双击所生成的TextBox1,进入代码编辑文件,输入如下代码。privatevoidtextBox1_TextChanged(objectsender,System.EventArgse){MessageBox.Show("文本已改变,请注意存盘!");}程序运行后,如果我们对文本框中的文本作任何改动,都会弹出一个对话框,如图5-21所示。说明:上例是一个典型的选取事件不恰当的反例,应该用文本框的Leave事件完成此功能,请读者通过此题进一步体会事件发生时机的含义。5.4.3Button类控件

按钮(Button)控件允许用户通过单击来执行操作。当该按钮被单击后,它看起来像是被按下然后释放。它是最常用的控件之一。在应用该控件前,我们先介绍一些它的常用属性和方法事件。1.常用属性

● Text属性。Button控件所显示的提示性的文字保存在Text属性中。它的设置方法为,首先从“工具箱”中的“所有Windows窗体”中拖曳一个Button控件放在一个窗体中,选中所生成的button1,再在其属性面板中把Text属性改为所要显示的文本即可。● FlatStyle属性。C#允许改变按钮的外观,一般设置FlatStyle属性的不同值,就可以改变它的平面显示风格,该属性可以取如下的值。● Flat:按钮总是以平面方式显示。● Popup:鼠标移动到按钮上时,以三维方式显示按钮,其他情况同Flat。● Standard:按钮总是以三维方式显示。2.常用事件

● Click事件。对于Button控件,我们常用的事件是Click事件,是单击按钮时所引发的处理操作。【例5-5】按钮Click事件的应用演示。下面我们通过一个小例子,来演示一下Click事件的应用。其大体步骤为,首先从“工具箱”中的“所有Windows窗体”中拖曳一个Button控件放在一个窗体中,如图5-22所示,

双击所生成的button1,进入代码编辑区域,输入如下代码。privatevoidbutton1_Click(objectsender,System.EventArgse){MessageBox.Show("你单击了一下按钮哦!");}程序运行结果如图5-23所示:3.其他事件

对于Button控件,我们还经常用KeyDown、KeyPress、KeyUp事件来响应键盘的一些操作,用MouseDown、MouseEnter、MouseHover、MouseLeave、MouseMove事件来响应鼠标的一些操作。Button控件还有很多事件,有兴趣的读者可以自己试验一下,看看有什么有趣的事件发生.注意:Form类还有AcceptButton和CancelButton两个属性与Button按钮有关,设置窗体的AcceptButton属性值为某一个按钮(例如Button1),相当于运行该窗体时用户按Enter键时所单击的窗体上的Button1按钮;设置窗体的CancelButton属性值为某一个按钮(例如Button2),相当于运行该窗体时用户按Esc键时所单击的窗体上的Button2按钮。5.4.4演练

1.实验题目基本控件2.实验目的● 掌握利用Label、TextBox、Button类控件的基本属性。● 了解利用Label、TextBox、Button的基本方法。3.实验目的(1)设计一个窗体,包含一个Label,一个TextBox,一个Button。Label对象显示“请输入文本”,TextBox对象可以接受多行输入,Button对象的显示文本是“保存”。若文本框中文本改变过而未按保存按钮,当窗体关闭时,显示消息框“您还未保存!”,且取消关闭操作;文本框文本未改变或已经按过保存,则不提示,执行关闭。(2)选做:设计书店管理系统登录框,当输入正确的用户名密码并单击登录时,用提示框提示登录成功,当输入错误的用户名密码时,提示登录失败。4.实验步骤由读者写出。5.实验总结由读者写出。5.4.5自测1.填空题(1)表示控件是否可以对用户交互做出响应的属性是

。(2)表示是否显示控件的属性是

。(3)按钮控件的常用事件是

。(4)如果想在文本框中输入密码,常指定

属性。2.选择题(1)当TextBox控件文本(Text)属性发生改变时会引发控件的

事件。a.TextChangedb.SizeChangedc.StyleChangedd.LocationChanged(2)设置TextBox控件只读属性应设置

。a.Textb.ReadOnlyc.MultiLined.WordWrap(3)Label控件中设置中文字的排列方式的属性

。a.Textb.TextAlignc.Sized.Tag(4)要使TextBox控件中的输入显示一系列的“*”,应设置该控件的

属性。a.Nameb.Textc.PasswordChard.ReadOnly基本知识4:菜单相关控件

菜单条、状态条和工具条是Windows窗体程序中用户界面的一个重要部分,是应用非常普遍的桌面元素。在.NETFramework3.5中,菜单条、状态条、工具条都由新增的ToolStrip控件提供高度一致和高度灵活的处理。5.5.1ToolStrip控件ToolStrip控件为Windows工具栏对象提供支持。它是多种工具条项(工具条子控件)的容器。1.ToolStrip控件的主要属性● Name属性。获取或设置控件的名称。● Items属性。获取菜单条中的工具条项的集合。说明:Items是集合属性,有Add、Remove等集合属性具有的方法;Items属性类型为ToolStripItemCollection类型,其中每个元素是ToolStripItem类型,而ToolStripItem仅仅是一个个ToolStripButton、ToolStripTextBox、ToolStripLabel等的基类型;即,实际包含在ToolStrip的Items属性中的元素是ToolStripButton、ToolStripTextBox、ToolStripLabel等子控件;这些子控件都是窗体类的字段,可以用this.toolStripLabel1来直接访问,而不用this.toolStrip1.Items[0]的方式来访问。● ShowItemToolTips属性。获取或设置一个值,该值指示是否显示MenuStrip的工具提示。【例5-6】演示工具栏ToolStrip控件的应用。①启动VS2008,建立一个项目,进入窗体设计的主界面。②从左边的“工具箱”中拖曳一个ToolStrip控件,默认为“toolStrip1”,单击智能按钮,选择“Button”选项,如图5-24所示,然后在其“属性”面板中,单击“Image”属性后的“…”按钮,打开“选择资源”对话框,如图5-25所示,单击“导入”按钮,导入相应的图片资源后单击“确定

图5‑24ToolStrip控件的智能按钮图5‑25选择资源对话框③重复步骤②,添加“保存”、“剪切”、“粘贴”和分隔栏,如图5-26所示。在添加分隔栏时,选择的是智能按钮中的“Separator”项。④双击“打开”按钮,切换到代码页,系统自动生成如下语句。privatevoidtoolStripButton1_Click(objectsender,EventArgse){}编写“打开”按钮的Click事件代码如下。privatevoidtoolStripButton1_Click(objectsender,EventArgse){//此处添加相应代码}重复本步骤,添加“保存”、“剪切”、“粘贴”项的代码。⑤按F5键(或用菜单操作“调试|启动”),进行调试,调试成功的效果如图5-27所示。

图5‑26添加工具栏图片按钮

图5‑27工具栏的运行效果5.5.2

MenuStrip控件

MenuStrip控件表示窗体菜单结构的容器。此控件容纳ToolStripMenuItem、ToolStripComboBox、ToolStripSeparator和ToolStripTextBox对象。MenuStrip控件主要用来容纳ToolStripMenuItem控件,该控件表示一个菜单项。ToolStripSeparaor只是一个占位间隔。用户可以将ToolStripMenuItem对象添加到MenuStrip中。每个ToolStripMenuItem也可以是其他子菜单项的父菜单。MenuStrip控件的属性和ToolStrip类似,其功能主要是由ToolStripMenuItem控件实现的。1.ToolStripMenuItem控件的主要属性● Name属性。获取或设置控件的名称。● Text。获取或设置菜单项的显示文本。● ShortcutKeys。获取或设置与ToolStripMenuItem关联的快捷键2.ToolStripMenuItem控件的主要事件● Click事件。在单击ToolStripItem时发生。【例5-7】菜单条及菜单项的应用。①启动VS2008,建立一个项目,进入窗体设计的主界面。②从左边的“工具箱”中拖曳一个MenuStrip控件,默认为“menuStrip1”,单击智能按钮,选择“MenuItem”选项,如图5-28所示,然后在右边的“属性”面板中,将“Text”属性改为“文件”(或者选择“MenuItem”选项后单击该项直接输入文本也可以修改其“Text”属性值)。③重复步骤②,添加“打开”、“保存”和分隔栏,如图5-29所示。在添加分隔栏时,选择的是智能按钮中的“Separator”项。

图5‑28MenuStrip控件的智能按钮

图5‑29添加子菜单

④双击“打开”菜单项,切换到代码页,系统自动生成如下语句。privatevoid打开ToolStripMenuItem_Click(objectsender,EventArgse){}编写“打开”菜单项的Click事件代码如下。privatevoid打开ToolStripMenuItem_Click(objectsender,EventArgse){MessageBox.Show("您单击的是打开项!");}重复本步骤,添加保存项的代码。⑤按F5键(或用菜单操作“调试|启动”),进行调试,调试成功的效果如图5-30所示。⑥单击“打开”项后,会弹出一个消息框,如图31所示。图5‑30菜单运行显示

图5‑31消息框

5.5.3ContextMenuStrip控件

在Windows操作系统、Office办公软件等这类软件中,用户在某个界面元素上单击鼠标右键,都可以弹出一个快捷菜单,帮助用户实现一些功能的快捷操作。在开发Windows应用程序时实现这一功能,将大大方便用户。那么如何来实现这一功能呢?在.NET中,利用ContextMenuStrip控件即可完成此功能。ContextMenuStrip控件的主要属性和MenuStrip控件相同,容纳的工具条项也相同,它们在使用上的不同之处主要是:ContextMenuStrip需要与某个界面元素建立关联,即需要设置某个宿主控件的ContextMenuStrip属性为一个ContextMenuStrip控件的实例。【例5-8】上下文菜单条ContextMenuStrip的使用。

图5‑32ContextMenuStrip控件的智能按钮下面我们通过一个小例子来演示一下快捷菜单的应用。①启动VS2008,建立一个项目,进入窗体设计的主界面。②从左边的“工具箱”中拖曳一个ContextMenuStrip控件,默认为“contextMenuStrip1”,单击智能按钮,选择“MenuItem”选项,如图5-32所示,然后在右边的“属性”面板中,将“Text”属性改为“最大化”。③重复步骤②,添加“最小化”、“关闭”和分隔栏,如图5-33所示。在添加分隔栏时,选择的是智能按钮中的“Separator”项。图5‑32ContextMenuStrip控件的智能按钮④双击“最大化”菜单项,切换到代码页,系统自动生成如下语句。privatevoid最大化ToolStripMenuItem_Click(objectsender,EventArgse){}编写“最大化”菜单项的Click事件代码。privatevoid最大化ToolStripMenuItem_Click(objectsender,EventArgse){WindowState=FormWindowState.Maximized;}重复本步骤,添加最小化项和关闭项的代码。privatevoid最小化ToolStripMenuItem_Click(objectsender,EventArgse){WindowState=FormWindowState.Minimized;}privatevoid关闭ToolStripMenuItem_Click(objectsender,EventArgse){this.Close();}⑤设置Form1的ContextMenuStrip属性为contextMenuStrip1。⑥按F5键(或用菜单操作“调试|启动”),进行调试,调试成功的效果如图5-34所示。

图5‑33添加快捷菜单图5‑34弹出式快捷菜单演示5.5.4StatusStrip控件

StatusStrip控件可以显示正在Form上查看的对象的相关信息、对象的组件或与该对象在应用程序中的操作相关的上下文信息。通常,StatusStrip控件由StatusLabel对象组成,每个这样的对象都可以显示文本、图标或同时显示这二者。StatusStrip还可以包含DropDownButton、SplitButton和ProgressBar控件。StatusStrip控件的属性和ToolStrip类似,其功能主要是由StatusLabel控件实现的。StatusLabel控件的主要属性如下。● Name。获取或设置项的名称。● Text。获取或设置要显示在项上的文本。● Spring。获取或设置一个值,该值指示在调整窗体大小时,StatusLabel是否自动填充StatusStrip上的可用空间。StatusStrip控件的使用,跟前面所述的MenuStrip控件、ContextMenuStrip控件、ToolStrip控件类似,这里就不一一赘述,请读者参照上述控件自己学习。5.5.5演练

1.实验题目工具条等控件2.实验目的● 掌握ToolStrip、MenuStrip、ContextMenuStrip、StatusStrip控件的基本属性。● 掌握ToolStripLabel、ToolStripButton的常用属性和事件。3.实验内容设计一个窗体,包含两个文本框、一个ToolStrip、一个MenuStrip、一个ContextMenuStrip、一个StatusStrip,ToolStrip中包含一个ToolStripButton,MenuStrip和ContextStrip中各包含一个菜单项,菜单项和按钮都完成一个功能:用户单击时在StatusStrip中显示被单击的控件的名称。4.实验步骤由读者写出。5.实验总结由读者写出。5.6基本知识5:其他常用控件

除了上述基本控件、菜单控件以外,.NET还提供了很多其他Windows窗体控件,而且每个控件都有大量的属性和事件。本节将再介绍几个比较常用的控件。5.6.1RadioButton类、CheckBox类控件、GroupBox类控件1.RadioButton控件RadioButton控件通常成组出现,用于为用户提供由两个或多个互斥选项组成的选项集。当用户选择单选按钮时,同一组中的其他单选按钮不能同时被选中。即在这组选项中,你能且只能选择一个。(1)RadioButton控件主要是Checked属性。● Checked属性。表示单选按钮是否被选中,默认值为False,默认情况下接受单击会自动被选中,同一容器的其他RadioButton对象的Checked属性的值也会随之改变。在同一Form窗体上,可以用若干GroupBox控件容纳RadioButton,以实现对RadioButton分组,如图5-35所示。(2)RadioButton控件的常用事件。● CheckedChanged事件。当RadioButton控件的Checked属性值改变时发生。下面利用RadioButton控件及前几节介绍的Label及Button控件,设计一个类似查询分析器登录框的示例。新建一个项目,本示例的具体操作步骤如下。第1步(布置界面),选中Form1窗体,从工具箱中拖曳一个GroupBox,然后再在GroupBox控件中拖曳两个RadioButton、两个Label标签、两个TextBox文本框,在Form窗体中再拖曳三个Button按钮。第2步(设置属性),如图5-36所示,修改各控件的Name属性和Text属性,此外还要设置Text属性值为“Windows身份验证”的RadioButton的Checked属性值为True,两个Label和两个TextBox的Enabled属性值为False。第3步(编写事件委托函数),双击Text属性值为“SQLServer身份验证”的RadioButton,进入代码文件,编写其发生CheckedChanged事件时调用的委托函数,具体代码如下。

图5‑35单选按钮的运行效果图5‑36界面的布置效果privatevoidradioButtonSqlServer_CheckedChanged(objectsender,EventArgse){if(radioButtonSqlServer.Checked){labelName.Enabled=true;labelPwd.Enabled=true;textBoxName.Enabled=true;textBoxPwd.Enabled=true;}else{labelName.Enabled=false;labelPwd.Enabled=false;textBoxName.Enabled=false;textBoxPwd.Enabled=false;}}按F5运行程序,开始时,两个Label和两个TextBox都是灰显(不可用)状态。当选中“SQLServer身份验证”的RadioButton按钮时,它们都变为可用;当选中“Windows身份验证”的RadioButton按钮时,它们又都变为不可用。2.CheckBox类控件

CheckBox类控件(复选框)常用于为用户提供多项选择。在同一窗体中,不同的复选框是相互独立的,复选框之间互不影响,这和前面的RadioButton单选按钮是明显不同的。可以成组地使用复选框以显示多重选项,使用户可以从中选择一项或多项。图5‑37CheckAlign属性的可视化设置对于CheckBox控件,经常使用的属性如下● Checked属性。表示复选框是否被选中,默认值为False。当复选框被选中时,其Checked属性被设置为True,当Checked属性值更改时,将引发CheckedChanged事件。图5‑37CheckAlign属性的可视化设置●

CheckAlign属性。用来确定控件中小方框相对于文本的位置。对于这个属性,系统采用了可视化设置,如图5-37用户可以方便地进行设置。对于CheckBox控件,经常使用的事件为CheckedChanged事件,这跟RadioButton控件相同。3.GroupBox类控件GroupBox控件称为成组框,它的作用是将一些控件捆绑成一个组,使用户界面清晰明了。值得注意的是,当RadioButton控件分组使用时,一定要将每组分别放在一个GroupBox控件内,才能起到分组单选的作用。设计该控件时,要将GroupBox控件拖入Windows窗体内,然后再向框内加入其他控件。GroupBox控件一般只修改其Text属性,Text是框头的提示性文字。很少为GroupBox控件编写事件处理程序。5.6.2ListBox类、ComboBox类控件

1.ListBox控件ListBox控件可以显示一组选项的列表,用户可以单击选择这些项。ListBox类还提供了一些方法,用以添加、删除项,以及在列表的项内查找文本。(1)主要属性。● Items属性。列表项,集合中的元素是object类型,一般是string。● SelectedIndex属性。获取或设置ListBox中当前选定项的从零开始的索引。● SelectedItem属性。获取或设置ListBox中的当前选定项。● SelectedItems/SelectedIndices属性。分别是多项选中的选中项集合和选中索引集合,属性类型分别为SelectedObjectCollection和SelectedIndexCollection类型。● SelectionMode属性。获取或设置在ListBox中选择项所用的方式,SelectionMode属性值为枚举类型:None、One、MultiSimple(单击即选中,再单击即取消选中),MultiExtend。(2)主要事件。● SelectedIndexChanged事件。该事件当SelectedIndex属性值更改时发生。关于ListBox控件的使用,可以采用可视化的设计方法,也可以采用编写代码的方法来设计。下面通过一个例题程序来演示ListBox控件的使用。【例5-9】设计一个窗体,实现单击Text属性值为“〉〉”的按钮可以将一个列表框(称为源列表框)中的选中项加入到另一个列表框(称为目标列表框),并且单击Text属性值为“〈〈”的按钮可以将目标列表框中的选中项删除的功能。各控件功能如表5-2所示。表5‑2 各控件的功能表类型NameTextItemsClick事件功能ListBox源ListBox经典著作社会科学历史地理政治法律外国文学ListBox目标ListBoxButton添加Button>>将“源ListBox”的选中项添加到“目标ListBox”中Button去掉Button<<将“目标ListBox”的选中项删除图5‑38窗体布置效果本示例的具体操作步骤如下。①第1步(布置界面),按照上述表格,在Form窗体上拖曳两个ListBox和两个Button按钮,界面设计效果如图5-38所示。②第2步(设置属性),按照上述表格描述,分别设置各控件的对应属性值。③第3步(编写事件委托函数),分别双击两个Button按钮,进入代码文件,编写两个Button按钮被单击发生Click事件时调用的委托函数,具体函数代码如下。privatevoid添加Button_Click(objectsender,EventArgse){

目标ListBox.Items.Add(源ListBox.SelectedItem);}privatevoid去掉Button_Click(objectsender,EventArgse){

目标ListBox.Items.Remove(目标ListBox.SelectedItem);}图5‑38窗体布置效果④按F5运行程序,当选中源ListBox中的“经典著作”项,单击“>>”按钮,将其添加到目标ListBox中去,同样操作把“社会科学”和“政治法律”选项也添加到目标ListBox中,操作效果如图5-39所示。

⑤当选中目标ListBox中的“社会科学”项后,单击“<<”按钮,把该选中项删除,操作效果如图5-40所示。

图5‑39窗体运行效果

图5‑40单击“<<”按钮的效果2.ComboBox类控件ComboBox控件通常称为组合框,可以看作是把一个TextBox控件和一个ListBox控件组合在一起的控件。因此它具有上述两种控件的特点:用户既可以在ComboBox控件中进行输入,就像在TextBox控件中一样,也可以在其附带的下拉列表框中选取某项内容。通常ComboBox控件的下拉列表部分折叠显示。ComboBox控件的属性大部分都来自于文本框和列表框,用法上基本也没什么区别。下面就介绍ComboBox控件的一个常用属性。● DropDownStyle。获取或设置指定组合框样式的值。该属性可取的值为下列值之一。● DropDown:文本部分可编辑,用户必须单击箭头按钮来显示列表部分。● DropDownList:用户不能直接编辑文本部分,必须单击箭头按钮来显示列表部分。● Simple:文本部分可编辑,列表部分总可见。ComboBox控件的方法和事件也大部分来自文本框和列表框,这里就不再赘述,请读者自学练习使用。5.6.3OpenFileDialog类控件

“打开”对话框主要用于已经存在的文件,如图5-41所示,其作用一般仅仅为获取用

温馨提示

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

评论

0/150

提交评论