C#窗体应用基础
Windows窗体分布类 | partial类 | public partial class Form1 : Form 这里面包含了两个新内容:partial和Form。 Partial是“部分的”意思,这是.NET Framework2.0引人的一个新特性——分布类。在C#当中,为了方便对代码的管理和编辑,使用partial关键字可以将同一个类的代码分开放在多个文件中,每个文件都是类的一部分代码。代码编译时,编译器再将各个分布类的代码合并到一起处理。 利用Visual Studio创建的窗体都是分布类。里面包含两个文件,Form1.cs和Form1.Designer.cs。我们自己编写的代码是在Form1.cs中的,而Form1.Designer.cs中的代码都是Visual Studio自动生成的,它负责定义窗体以及控件的位置、大小等,我们一般不直接操作这个文件。Form1.cs和Form1.Designer.cs的程序代码具有相同的命名空间和相同的类名,并且都在类名前面增加了partial关键字,在编译时,Visual Studio会识别,并把它们合并成一个类来进行处理。这样做的好处是分离关注点,程序员不需要关心那些自动生成的代码,因此使用分布类把自动生成的代码剥离出去,可以使得程序员的关注点更集中,使代码看起来也更加简洁。 |
|||||||
Form窗体类 | Form类 | Form是.NET Framework定义好的一个最基本的窗体类,具有一些窗体的最基本的属性和方法。冒号表示继承,就像是孩子可以继承父母的外貌特征,我们自己创建的窗体都继承自Form类,那么它就具有了Form类中定义的属性和方法。 | |||||||
常用属性和方法 |
属性:
|
||||||||
模式窗体和无模式窗体的区别 | 模式窗体:使用ShowDialog()方法可以将窗体显示为模式窗体,当窗体显示时禁止访问应用程序的其他部分。如果正在显示的对话框在处理前必须由用户确认,那么这种窗体是非常有用的。 无模式窗体:使用Show()方法可以将窗体显示为无模式窗体,在显示无模式窗体时,允许使用应用程序的其他部分。如果窗体在很长一段时间内都可以使用,那么这种窗体是非常有用的。 |
||||||||
Application.Exit()和Form.Close()的区别 |
Application.Exit()
|
||||||||
规范 | FormBorderStyle用于设置窗体的边框样式,在设计窗体时要根据实际需要,选择适当的属性值。如果不希望窗体运行后,用户用过鼠标拖拽改变窗体大小,在设计时要将窗体的FormBorderStyle属性值设置为FixedSingle。 AutoSizeMode中的GrowAndShrink选项也能不允许用户拖拽改变窗体大小。 |
||||||||
技巧 | 用户可能习惯使用Tab键在窗体的输入框之间跳转,最好按照从上到下、从左到右的顺序来设置输入控件的Tab键顺序。设置的方法是:切换到窗体设计器视图,选择“视图”菜单下的“Tab键顺序”选项,设置完毕后,取消选择该选项。 | ||||||||
通过控件名在窗体的控件集合中查找对应的控件 | (Label)(this.Controls.Find("lblSingerName"
+ (i + 1), true)[0]); this.Controls.Find()方法通过控件名称和一个布尔类型(true则查询控件中的子控件,false则不查询子控件)作为参数返回Control类型的数组,需要强制转换成对应的控件类型。 |
||||||||
用Enter替代Tab | 1、设置TabIndex 2、设置窗体的keypress属性等于true 3、写事件,窗体的keydown事件 if(e.keyCode == keys.Enter) { System.Windows.Forms.Sendkeys.Send("{tab}"); } |
||||||||
注意 | Form1.Designer.cs这个系统自动生成代码的文件中,有一句this.Controls.Add()代码,this代表当前的窗体对象,这句代码的含义是将控件对象添加到窗体的控件集合中,这样控件才能在窗体上显示出来。 | ||||||||
Label 标签 |
常用属性 | Image(在标签上显示的图像) Text(在标签上显示的文本) 标签(Label):用于显示用户不能编辑的文本或图像。我们常使用它对窗体上的其他各种控件进行标注或说明 |
|||||||
TextBox文本框 | 常用属性 | MaxLength(指定可以在文本框中输入的最大字符数) Multiline(表示是否可在文本框中输入多行文本) PasswordChar(指示在作为密码框时,文本框中显示的字符,而不是实际输入的文本) ReadOnly(指定是否允许编辑文本框中的文本) Text(与文本框关联的文本) 文本框(TextBox)用于获取用户输入的信息或向用户显示文本。 |
|||||||
规范 | 用户可能在输入时无意多输入了空格,因此需要调用Trim()方法进行去空格处理。 为了提高程序的运行效率,同时避免出现不必要的错误,在判断字符串是否为空字符串(字符串内没有内容)时,推荐使用string.Empty |
||||||||
ComboBox组合框 | 常用属性 | Items(组合框中的项) DropDownStyle(定义组合框的风格,指示是否显示列表框部分,是否允许用户编辑文本框部分,选项DropDownList可防止用户修改选项。) Text(与组合框关联的文本) SelectedIndex(当前选定项目的索引号,列表框中的每个项都有一个索引号,从0开始) SelectedItem(获取当前选定的项) 组合框(ComboBox)它结合了文本框和列表框控件的特点,允许用户在组合框内键入文本或从列表中进行选择。 |
|||||||
数据绑定 |
数据绑定所需属性: this.cboGrade.ValueMember = "GradeId"; this.cboGrade.DisplayMember = "GradeName"; this.cboGrade.DataSourse = ds.Tables["Grade"]; //通过设置DataSource属性指定cboGrade的数据源是数据集中名为"Grade"的数据表,将Grade表中的主键GradeId作为ValueMember属性的值,GradeName则是DisplayMember属性的值。此处有个小技巧,先设置ValueMember和DisplayMember属性,再设置DataSource属性,可减少程序调整次数,增加程序运行效率。 如果想在绑定了数据的ComboBox中添加"全部"一项,可在绑定年级数据代码前添加如下代码实现。 DataRow row = ds.Tables["Grade"].NewRow(); row["GradeId"] = -1; row["GradeName"] = "全部"; ds.Tables["Grade"].Rows.InsertAt(row,0); //InsertAt是在特定位置插入,Add是在最后一行追加 经验:访问DataRow中的各列时,既可以使用字段名称,也可以使用下标。如: row[0] = -1; |
||||||||
ComboBoxItems 组合框集合对象 |
常用属性和方法 |
属性:
|
|||||||
Button 按钮 |
常用属性 | Enable(布尔值,表示控件是否可用。True表示可用,false表示不可用,如果控件不可用,运行后显示为灰色) Text(按钮上显示的文本) TextAlign(按钮上文本的对齐方式) 按钮(Button)允许用户通过单击来执行操作。 |
|||||||
规范 | 控件命名要遵循一定的规范,比较通用的规范是:控件类名的缩写+有含义的英文单词。例如,Button控件的缩写是btn,那么“登录”按钮就可以命名为btnLogin。 | ||||||||
事件处理 | 事件处理含义 | Windows的这种通过随时响应用户触发的事件,做出相应的处理叫做事件驱动机制。 | |||||||
事件参数 | private
void btnCancel_Click(object sender,EventArgs e){} 每个事件传入的参数都是这两个: sender是事件源,表示是谁发生了这个事件,比如在这个事件中,事件源就是按钮。不同的控件肯能会共用同一个事件处理方法,我们可以通过sender得到发生事件的控件,这需要进行强制类型转换。 e叫做事件参数(EventArgs)对象,不同的事件会有不同的事件参数。 从代码得知,事件处理方法的方法名是根据控件名生产的,因此在生成事件处理方法之前,应该先为控件指定一个有意义的名字,增加代码的可读性。 |
||||||||
MessageBox 消息框 |
Show()方法 | 在WinForms中,消息框是一个MessageBox对象。那么,创建消息框就需要使用MessageBox的Show()方法。我们常用的消息框有以下四种类型。 最简单的消息框,如: MessageBox.Show(要显示的字符串); 带标题的消息框,如: MessageBox.Show(要显示的字符串,消息框的标题); 带标题、按钮的消息框,如: MessageBox.Show(要显示的字符串,消息框的标题,消息框按钮); 带标题、按钮、图标的消息框,如: MessageBox.Show(要显示的字符串,标题,消息框按钮,消息框图标); Show()方法的返回值是DialogResult类型,其中定义了消息框可能返回的值,使用"."运算符获得某种返回值。 注意:以上的方法参数必须按照对应顺序传入。 |
|||||||
MenuStrip 菜单栏 |
常用属性 | Name(代码中菜单对象的名称) Items(在菜单中显示的项的集合) Text(与菜单相关联的文本) 利用菜单栏控件可以轻松地创建Windows中的菜单,在菜单中可以添加菜单项(MenuItem)组合框(ComboBox)、文本框(TextBox)。 |
|||||||
MenuItem 菜单项 |
常用属性和事件 |
属性:
|
|||||||
ToolStrip工具栏 | 常用属性 | ImageScalingSize(工具栏中的项显示的图像大小) Items(在工具栏上显示的项的集合) 使用工具栏控件(ToolStrip):可以创建功能非常强大的工具栏,工具栏控件中可以包括按钮(Button)、标签(Label)、下拉按钮(DropDownButton)、文本框(TextBox)、组合框(ComboBox),可以显示文字、图片或文字加图片 |
|||||||
ToolStripItem 工具栏项 |
常用属性和事件 |
属性:
|
|||||||
RadioButton 单选按钮 |
常用属性和事件 |
属性:
|
|||||||
GroupBox 分组框 |
常用属性 | 分组框(GroupBox):用于为其他控件提供可识别的分组。我们通常使用分组框按功能细分窗体,可以通过设置Text属性设置分组框上显示的标题。 | |||||||
Panel 面板 |
常用属性 | 面板(Panel):它的功能和分组框类似,都是用来将控件分组的。唯一的不同是面板没有标题,但可以显示滚动条 | |||||||
GroupBox和Panel的区别 | GroupBox 用于逻辑地组合一组控件,如RadioButton和CheckBox控件,显示一个框架,框架上有一个标题。 Panel 用于包含多个控件,以便将这些控件编为一组,方便操作这些控件。 |
||||||||
Anchor 属性 |
WinForms中为控件提供了Anchor属性,只要设置控件的Anchor属性可以使窗体控件在改变窗体大小时,与所设置的边缘距离保持不变,可以实现与窗体一起动态调整控件的大小。 | ||||||||
Dock 属性 |
除了让控件能够跟随窗体动态调整大小,有的时候我们还想让控件始终保持在窗体的边缘,或者填充窗体。Dock的意思是停靠的使用。 | ||||||||
创建MDI应用程序 | 为什么使用MDI | 回想一下,我们是怎样使用Windows中的“记事本”的?当我们打开了一个记事本文件之后,如果还想在这个窗口再打开一个记事本文件,就会被询问是否保存现在的记事本文件,然后新的记事本文件打开了,而原来的就会关掉。也就是说,在一个记事本窗口中只能打开一个文件,如果要打开另外一个文件,要么把现在整个文件关掉,要么就再打开一个记事本窗口,这种应用程序我们把它叫做单文档界面(SDI)应用程序。 | |||||||
什么是MDI | 在Microsoft
Excel中,我们可以同时打开多个Excel文档,而不需要新打开一个Excel窗口。这种应用程序我们把它叫做MDI(多文档界面)应用程序。MDI由两种窗口组成:父窗口和子窗口。父窗口可以包括菜单等,是最外面的窗口,父窗口可以包含很多子窗口。在父窗口中往往还有一个“窗口”菜单,在其中可以随意切换打开的子窗口 MDI有以下特点: 1、启动一个MDI应用程序时,首先显示父窗体。 2、它是应用程序中所有其他窗口的容器。 3、每个应用程序界面都只能有一个MDI父窗体。 4、在任何指定的时间都可以打开多个子窗体。 5、任何MDI子窗体都不能移出MDI框架区域。 6、关闭MDI父窗体则自动关闭所有打开的MDI子窗体。 |
||||||||
如何创建MDI | 1、设置父窗体:将父窗体的IsMDIContainer属性设置为true。 2、设置子窗体:在调用打开子窗体的Show()方法前,在代码中将子窗体的MdiParent属性设置为this。示例代码: FrmStudent frmStudent = new FrmStudent(); frmStudent.MdiParent = this; frmStudent.Show(); 3、将菜单控件的MdiWindowListItem属性设为“窗口”菜单项。 |
||||||||
ImageList 图像列表 |
常用属性 | Images(存储在图像列表中的所有图像) ImageSize(图像列表中图像的大小) TransparentColor(被视为透明的颜色) ColorDepth(获取图像列表的颜色深度) 图像列表控件(ImageList)是含有图像对象的集合,可以通过索引或关键字引用该集合中的每个对象。ImageList控件不能独立使用,只能来为Windows窗体中的其他控件提供图像。在图像列表中存储的图像大小都相同,供其他控件引用。使用ImageList控件,可以一次性地将有关的全部图像保存到该控件中,建立图像集合,使编写的代码引用单一的图像目录,以节省开发时间。 Images中存放的图像就像存放在数组中一样,通过Count属性可以获得Images中图像的个数。每个图像都有一个索引值,从0开始,使用Images[索引值],可以定位到一个图像。通常,ImageList控件所包含的图像可以被ListView、TreeView和ToolStrip控件使用。 |
|||||||
经验 | 先设置ColorDepth、ImageSize属性的值,再添加图片。反之,将不能更改这两个属性的值。 | ||||||||
ListView 列表视图 |
常用属性和方法 |
属性:
|
|||||||
五种视图模式 | 大图标:View.LargeIcon 小图标:View.SmallIcon 列表:View.List 详细信息:View.Detail 平铺:View.Tile |
||||||||
实现向ListView控件中添加数据,示例代码 |
下面的代码创建了ListViewItem对象“C盘”。构造函数的第一个参数指定了项的文本,第二个参数设置了项图标在ImageList控件中的图像索引位置。 ListViewItem itemC = new ListViewItem("C盘",0); //下面的代码是执行Add()方法向lvMyComputer控件中添加有关"C盘"项以及子项"类型"、"总大小"和"可用空间"。 //向项中添加子项 itemC.SubItems.Add("本地磁盘"); itemC.SubItems.Add("15.6GB"); itemC.SubItems.Add("1.86GB"); //将项添加到ListView中 lvMyComputer.Items.Add(itemC); 要注意:在调用Add()方法之前,先要创建Item对象,然后通过调用SubItems子项对象的Add()方法依次为各个子项赋值。
//创建ListView的项 ListViewItem itemE = new ListViewItem("E盘",2); //向项中添加子项 itemE.SubItems.AddRange(new string[]{"本地磁盘","40.9GB","1.6GB"}); //将项添加到ListView中 lvMyComputer.Items.Add(itemE);
|
||||||||
ContextMenuStripItem 快捷菜单 |
常用属性和事件 |
属性:
|
|||||||
PictureBox 图片框 |
常用属性 | Image(图片框显示的图像) SizeMode(指定如何处理图片的位置和控件大小) 图片框控件(PictureBox)用于显示位图、GIF、JPEG等格式的图片或者图标。 |
|||||||
Timer 计时器 |
常用属性、事件和方法 |
属性:
|
|||||||
DataGridView 数据网格视图控件 |
主要属性 | 数据网格视图控件(DataGridView)是WinForms中的一个很强大的控件,在DataGridView中还可以直接修改和删除数据,就像操作Excel表格一样方便。DataGridView控件能够以表格的形式显示数据,可以设置为只读,也可以允许编辑数据。要想指定DataGridView显示哪个表的数据,只需要设置它的DataSource属性,使用一行代码就能实现。 属性: Columns(包含的列的集合) DataSource(DataGridView的数据源) ReadOnly(是否可以编辑单元格) |
|||||||
技巧 | DataGridView对象.AutoGenerateColumns = false;//防止数据库的数据列为控件自动添加列 | ||||||||
DataGridView 的列 |
主要属性 | 通过Columns属性,还可以设置DataGridView中每一列的属性,包括列的宽度、列头的文字,是否为只读、是否冻结、对应数据表中的哪一列等。 属性: DataPropertyName(绑定的数据列的名称) HeaderText(列标题文本) Visible(指定列是否可见) Frozen(指定水平滚动DataGridView时列是否移动) ReadOnly(指定单元格是否为只读) |
|||||||
TreeView 树状控件 |
主要属性和事件 |
树状控件(TreeView)用于以节点形式显示文本或数据,这些节点按层次结构的顺序排列。例如,Windows资源管理器左边窗格所包含的目录和文件是以树状视图排列。
|
|||||||
TreeViewNode | 主要属性 | 属性: Text(节点上的文字) ImageIndex(节点默认的图像索引。如果不设置,将保持与TreeView的设置相同) SelectedImageIndex(节点选中时图像的索引。如果不设置,将保持与TreeView的设置相同) Level(节点在树中的深度,从0开始) Nodes(当前节点包含的子节点的集合) ParentNode(当前节点的父节点) |
|||||||
应用 | 要向TreeView添加节点,必须存在根节点。如果不存在根节点,首先点击"添加根"按钮添加一个根节点。选择根节点或其他子节点,单击"添加子级"按钮,可添加其他子节点。每添加一个节点,应为该节点设置Name属性,Text属性。 为了使窗体丰富、美观,可以在TreeView控件每个节点的提示信息前显示小图标,这些小图标来自于ImageList控件。只需要通过ImageList属性将TreeView控件与illcons控件关联,然后,为每个节点设置ImageIndex属性和SelectedImageIndex属性,用来指定收缩时显示的图标和展开后显示的图标即可。 获取选中的树节点:TreeView对象.SelectedNode |
||||||||
SplitContainer 拆分器 |
简介 | SplitContainer控件是把三个控件组合在一起,其中有两个面板控件(Panel),在它们之间有一个拆分器。用户可以用鼠标移动拆分器,重新设置面板的大小。在重新设置面板大小时,面板上的控件页可以随之重新设置大小。在Windows中,资源管理器就使用了SplitContainer控件。资源管理器的左面板包含文件的树状视图,右面板包含文件夹内容的列表视图。用户在拆分器上移动鼠标时,光标就会改变,此时可以移动拆分条。 SplitContainer控件可以包含任意控件,包括布局面板和其他SplitContainer控件,可以利用创建非常复杂、专业化程度很高的窗体。 |
|||||||
DataView 动态视图 |
简介 | DataView为我们提供了DataTable的动态视图,并可以对动态生成的视图中的数据进行排序、筛选等操作。它最重要的任务是运行WinForms控件进行数据绑定。 一个DataSet中可以有多个DataTable,一个DataTable可以动态生成多个DataView。 C#语言中,DataView位于System.Data命名空间。创建DataView的方法有两种:可以使用DataView构造函数,也可以创建对DataTable的DefaultView属性的引用。 DataView构造函数的参数可以为空,也可以采用DataTable作为单个参数,还可以同时采用DataTable与筛选条件、排序条件和行状态筛选器作为参数。 |
|||||||
主要属性 | Table(用于获取或设置源DataTable) Sort(获取或设置DataView的一个或多个排序列以及排序顺序) RowFilter(获取或设置用于筛选在DataView中查看哪些行的表达式) Count(在应用RowFilter后,获取DataView中的行数) |
||||||||
语法 | DataView
数据视图名 = new DataView(DataTable对象); 或 DataView 数据视图名 = DataTable对象.DefaultView; 如果使用不采用任何参数的构造函数来创建DataView对象,那么在设置Table属性之前,将无法使用DataView。 |
||||||||
数据筛选示例 | 与数据库查询语句中WHERE子句的作用类似,DataView的RowFilter属性可以设置查询条件,能够过滤掉DataTable中不符合查询条件的数据。如,筛选姓"李"的学生并显示在DataGridView中的代码如下所示。 DataView dv = new DataView(dt.Tables["Student"]); dv.RowFilter = " StudentName like '李%'"; dgvList.DataSource = dv;//将数据视图作为数据源 |
||||||||
数据排序示例 | DataView的Sort属性类似于数据库查询语句中ORDER
BY子句的后面部分,用来指定排序的条件。例如,按学生姓名以降序方式排序的代码如下所示。 DataView dv = new DataView(dt.Tables["Student"]); dv.Sort = " StudentName desc"; dgvList.DataSource = dv;//将数据视图作为数据源 |
||||||||
经验 | 当创建DataView对象时,以构造函数的参数形式提供的任何初始排序或筛选条件可以实现最佳性能。如果先创建了没有指定排序或筛选条件的DataView对象,再设置Sort、RowFilter属性,会使索引至少生成两次:一次是创建DataView时,另一次是在修改任何排序或筛选属性时。 在开发中,如果需要对DataGridView展示的数据进行动态筛选或排序,我们最好使用DataTable的DefaultView(默认视图)属性来得到DataTable的视图,这样,可以减少实例化DataView对象的步骤。 |