第一章:初识Windows程序
1.1:第一个wondows程序
1.1.1:认识windows程序
Form1.cs:窗体文件:程序对窗体编写的代码一般都存放在这个文件(还有拖动控件时的操作和布局,还有设置一般的属性) F4:跳到设置属性的界面 F7:跳到逻辑代码文件
From.Designer.cs:窗体设计文件:一般拖动控件自动生成的文件(很少修改)
From.resx:资源文件:配置图片等资源。
Program.cs: 主程序文件:包含main方法的程序入口,如果要改执行的窗体直接run后面的文件名
Public partial class Form1:Form
{
//这个相当于partial是部分意思,,他继承了Form文件的所有属性和方法(:表示继承)
}
属性 |
说明 |
Name |
窗体对象的名称,用来在代码中标识 |
BackColor |
窗体的背景颜色 |
BackgroundImage |
窗体的背景图片 |
FormBorderStyle |
窗体边框的样式 |
MaximinzeBox |
窗体是否最大化 |
ShowIntaskBar |
窗体是否出现Windows任务栏 |
StartPosition |
窗体第一次出先的位置 |
Text |
窗体标题栏显示的文本 |
TopMost |
Xz显示在某个窗体之上 |
WindowState |
窗体的初始化状态 包括MaxMinzed(最大化) Minmized(最小化) |
方法 |
说明 |
Close() |
关闭窗体 |
Show() |
显示窗体 |
ShowDiaLog() |
模式化窗体 (如果打开了,只有关闭了此窗体,其他窗体才能操作) |
Hide() |
隐藏窗体 |
1.1.3:基本控件
标签(label):用于显示不能编辑的文本或图像 ,常用来在窗体上的其他控件做标注或说明
属性 |
说明 |
Image |
在标签上显示的图片 |
Text |
在标签上显示的文本 |
文本框(TextBox)用于获得用户输入的信息和用户显示的文本
MaxLength |
指定可以在文本框输入的最大字符 |
Multiline |
表示是否可以在文本框输入多行文本 |
PasswordChar |
输入的字符可以用一个符号或者什么来替换(属性值可以是*,输入实际的就可以隐藏) |
ReadOnly |
指定是否可以编辑(只读) |
Text |
与文本框关联的文本 |
组合框(ComboBox):先当于下拉框和文本框的结合体。可以输入文本或进行选择
Items |
组合框的项 |
DropDownStyle |
组合框的风格 一般(DropDownList)只能下拉 |
Text |
与组合框关联的文本 |
SelectedIndex |
当前选中的索引(下标),从0开始 (返回int类型) |
SelectedItem |
获取选中的项,返回object类型,返回选中项的值 |
事件 |
说明 |
Click |
单击事件 |
SelectedIndexChanged |
选中项后发生的事件 |
按钮(button):用户通过点击来进行操作
Endable |
返回bool类型的值,控件是否可用 |
Text |
按钮上显示的文本值 |
TextAlign |
按钮上文本的对齐方式 |
事件 |
说明 |
Click |
点击事件 |
1.2:事件的处理
1.单击要创建处理的控件(双击直接完成,然后跳转,直接写代码)
2:在属性找到事件的标志(闪电)
3:双击要处理的事件
4:编写处理的逻辑代码 (This:代表当前窗体)
1.3:增强窗体的友好性
1.3.1:Messagebox消息框(返回的是一个DiaLogresult类型的值)
语法:MessageBox.Show(显示的提示字符串,消息的标题,消息框的按钮,消息框图片)
例子:
- ·DiaLogResult result=MessageBox.Show( “确定要退出吗?”,”操作提示”,messageBoxButtons.YesNo, MessageBoxIcon.Question );
If(result==DialogResult.yes)
{
This.Close();
}
1.3.3:窗体体的跳转
语法:
按钮下的事件
先确定即将跳转的窗体的名字:
FrmADminMain(跳转的窗体) frmAmdin =new FrmADminMain(); //创建一个窗体对象
FrmAmdin.Show(); //显示此窗体
This.Hide(); //隐藏当前窗体
1.3.4:窗体间的数据传递
在即将跳转的(下一个)窗体申明一个空的字符串 String name=string.Empty
在(本)窗体的 代码
FrmADminMain(跳转的窗体) frmAmdin =new FrmADminMain(); //创建一个窗体对象
frmAmdin.name=textuserName.text,trim(); //把这边的文本的值传递给下一个窗体的name属性
FrmAmdin.Show(); //显示此窗体
This.Hide(); //隐藏当前窗体
第二章:构建良好的windows程序
2.1:使用菜单栏和工具栏
2.1.1:菜单栏的控件MenuStrip
属性 |
说明 |
Name |
代码中菜单对象的名称 |
Items |
在菜单中显示的集合 |
Text |
与菜单相关的文本 |
菜单项的主要属性
属性 |
说明 |
Name |
代码中菜单项的名称 |
DropDownItems |
在子菜单中显示的项的集合 |
text |
与菜单项相关的文本 |
事件 |
说明 |
Click |
点击事件 |
Application Exit(); //退出程序方法
This.close() //退出当前窗体方法
分割线的做法:减号(-),回车
快捷键:(&A-Z)
2.1.3:使用工具栏控件ToolStrip
工具栏的属性
属性 |
说明 |
ImageScalingsize |
工具栏显示图片的大小 |
Items |
工具栏的项的集合 |
工具栏上面的按钮和标签的主要属性和事件
DisplayStyle |
图像和文本的显示方式,包括文本,图片,和什么都不显示 |
Image |
按钮或标签的图片 |
Imagescaling |
是否调整按钮或标签上的图片大小 |
text |
显示的文本 |
TextImageRelation |
按钮和图片的显示相对位置 |
Click |
点击事件 |
2.2:使用windows的基本控件
2.2.1:使用窗体的基本控件
单选按钮(radiobutton):选择的项的集合
Checked |
指示是否被选中(Radio.checked==true)表示已选中 |
Text |
按钮上的文本 |
事件 |
|
Click |
点击事件 |
分组框(GroupBox)和panel容器
GroupBox |
Panel |
用于逻辑上一组控件 |
为了易于操作,把多个控件放在一起 |
日期控件(DataTimePicker):功选择日期的控件
属性 |
说明 |
Maxdate |
取得的最大日期 |
Mindate |
取得的最小日期 |
Value |
日期的值(相当于Text) |
Format |
用于设置格式 |
2.2.2:排列窗体的控件
Anchor:如果锚定了 ,各边距就会不会改变(选中深灰),一直保持此距离,与某条边
Dock:停靠 在那一边 (Fill是填充窗体的空余部分)
2.2.3:创建MDI应用程序
概念:同时打开多个窗体,但是不会打开多个程序 有一个父窗体,几个子窗体
步骤:
在父窗体的IsMdiContaner设置为true, 表示他是一个父窗体了
在(按钮)跳转的时候
FrmEdit frm = new FrmEdit();
frm.MdiParent=this; //他的父窗体就是这个窗体
frm.show();
2.3:组合框comboBox控件
Count |
获得集合中的数目 |
DropDownStyle |
设置组合框的样式 一般:GropDownlist(只能下拉) |
IsreadOnly |
H获取指定能够修改集合的值 |
Item |
集合中指定的索引项 |
Add() |
向组合框添加项 |
Clear() |
清除所有项 |
Remove() |
从组合框中移除指定项 |
例:CboGrade.items.Add(“一年级”); //添加
CboGrade.selectedIndex=0; //默认选择第一项(坐标为0)
第三章:使用listview控件展示数据
3.1:图像列表控件
3.1.1:图像列表控件Imagelist
使用场景:为多个控件或则窗体提供的一部分图片
属性 |
说明 |
Images |
储存的所有图片的复数 |
ImageSize |
图片的大小 |
transparentColor |
被视为透视的颜色 |
ColorDepth |
获取图片列表的颜色深度 |
3.2:列表视图控件(listView控件)
说明:用于创建项windows资源管理器的用户界面,有大图标(LargeIcon)小图标:(smallIcon)
列表(List)详细信息(Detail)平铺(Tile)
Columns |
详细信息中显示的 列头(上面) |
FullRowselect |
当选择一项时,他的子项全部一起选中(一行) |
Items |
Listview的项的集合 |
MuiliSelect |
是否允许选泽多项 |
Selected Intems |
选中项的集合 |
View |
指定listview的显示模式 |
LargeimageList |
绑定设置显示大图标时的图片 |
SmallImageList |
绑定设置显示小图标时的图片 |
事件 |
说明 |
MouseDoubleClick |
双击事件 |
方法 |
|
Clear() |
清除listview项 |
设置大小图表模式的代码:大:this.lvcomputer.view=view.largeIcon
:
小:this.lvcomputer.view=view.smallIcon
3.3:contextMenuStrip控件
说名:快捷菜单:又叫上下文菜单
属性 |
说明 |
DisPlayStyle |
指定是否显示图片和文本 |
Image |
显示在菜单项的图片 |
Text |
显示 在菜单项的文本 |
Click |
单击事件 |
向listView中添加数据
ListviewItms Items=new listviewitems(new stirng[] { “主项(第一个项)”, “子项“, “子项”, },图片的坐标(2) );. //添加图片的坐标
第四章:实现windows程序的数据更新
4.1:枚举
4.1.1:使用枚举的好处:可以避免不合理的赋值
定义枚举类型:访问修饰符 enum 枚举名{ 值1,值2 }
1:枚举的类
例:public enum Genders
{
男,女 //定义枚举类
}
2:另一个类
Public class Student
{
public Genders studentGender; //定义枚举属性
Pubicl void Show( “我的性别是:“+ studentGender ); //显示方法
}
3:有main方法的类
Student student=new Student(); //创建对象
Student.studentGender=Genders.男;
Stuent.Show(); //调用显示方法
4.3:使用windows高级控件
4.3.1:图片框控件(PictureBox)
用于显示一张图片的控件
属性 |
说明 |
Image |
图片框显示的图片 |
SizeMode |
指定如何处理图片的位置和大小 |
4.3.1:计时器(Timer)控件
可以控制每隔一定的事件触发一次事情 事件(Tick事件)
属性 |
说明 |
InterVal |
事情触发的频率,一般以毫秒为单位 |
Endabled |
是否启用事件 |
事件 |
|
Tick |
指每隔一段时间发生的事情 |
Start() |
启用计时器 |
Stop() |
停止计时器 |
Int index=0;
例子:Tmrabout_Tick
{
If(index<this.ilimages.images.count-1)
{
Index++;
}else
{
Index=0;
}
This.pbAbout(此图片框控件).Image=this.ilimages.images[index];
}
模式窗体:FrmAbout,frmAbout=new FmAbout();
frmABout.ShowLog();
第五章:实现windows的数据绑定
5.1:DataSet对象
5.1.1:DataSet(数据集)对象
说明:相当于一个零时仓库,吧程序要用的数据零时存放在数据集里面,。不需要与数据库连接,可以直接在数据集里面读取数据,也可以先对数据集的数据进行修改,然后提交到数据库里面 (数据集独立于任何数据库,不会直接和数据库打交道)
5.1.2:创建DataSet数据集
位置:位于System.Data包下面
语法:DataSet dataset=new DataSet(); //创建对象
5.2:DataAdapter(适配器):对象
(相当于货车):
DataAdapter:属性和方法
SelectCommand |
从数据库检索Command对象 |
方法 |
说明 |
FILL() 填充数据集 |
向DataSet中的表填充数据 |
UPDate() 修改后提交到数据集 |
向DataSet中的数据提交数据库 |
语法:
DataSet dataset=new DataSet();
sqlDataApater 对象 =new SqlDataApater ( sql语句,数据库连接的connection对象 );
调用dataAdapter的对象Fill方法填充数据到数据集。
语法:dataApter.Fill( 数据集对象(dataSet),“数据表的名称(table)” );
整体步骤:
DataSet dataset=new DataSet();
String str=“select * from Student”;
SqlConnection connection=new sqlCOnnection( 连接的字符串 );
sqlDataApater 对象 =new SqlDataApater ( sql语句,数据库连接的connection对象 );
dataApter.Fill( 数据集对象(dataSet),“数据表的名称(table)” );
绑定(网格视图):this.dataGridView.DataSoure = ds.tables[“table”]; //绑定是的是网格视图
绑定(下拉框):this.cboGrade.DataSoure=ds.table[“table”]; //下拉框的数据源
This.CboGrade.ValueMember=”GradeId”; //绑定隐藏的值(可能会做后续处理)
This.cboGrade.DispiayMember=”GradeName”; / /绑定显示出来的值(用户选择)
5.3:数据绑定
5.3.1:comboBox数据绑定
属性 |
说明 |
DataSource |
数据源 |
DisplayMember (选中显示值,Cbo.Text==?) |
获取显示在用户界面的值 |
ValueMember (选中隐藏值,(cbo.selectedValue==?)) |
隐藏的值(实际值),查找时可以做为条件,应为是主键 |
绑定(下拉框(comboBox)):this.cboGrade.DataSoure=ds.table[“table”]; //下拉框的数据源
This.CboGrade.ValueMember=”GradeId”; //绑定隐藏的值(可能会做后续处理)
This.cboGrade.DispiayMember=”GradeName”; / /绑定显示出来的值(用户选择)
插入一行新的:语法:
:DataRow row=ds.Tables[“Grade”].Newrow(); //创建一行新的
row[“GradeId”]=-1; //第一列的值是编号: 为-1
row[“GradeName”]=”全部”; //第二列的值是年级名称:为全部
ds. Tables [“Grade”].Rows.InsertAt(row,0); //把这一行插入到数据集的Grade表的行中 第一行(坐标0)
5.4:DataGridView控件
概念:数据网格视图控件:可以直接删除,修改数据,如果要显示那个表的数据,直接设置DataSource的属性:表示数据源
属性 |
说明 |
AutoGeneerrateColumns |
设置DataGirdView是否自动创建列 |
Columns |
列的集合(列头集合),网格视图的头部 |
DataSource |
DataGirdView的数据源 |
ReadOnly |
是否只读(可以编辑) |
DataGirdView各列的属性 |
|
ColumnType |
列的类型 |
DataPropertyName |
绑定数据列的名称 (必须与数据库的列名一样) |
HeaderText |
列的标题文本(列头) |
Visible |
指定列是否可见 |
FroZen |
指定水平滚动,列是否可以移动 |
ReadOnly |
指定单元格是否可读 |
Selected |
DataGirdView必用属性:
AllowUsertoAddRows |
(DataGirdView)可以取消掉默认展示出来的多余一行 |
AutoSizeColumnSMode 值为:Fill(填满) |
选择是否自动调整列的宽度 |
ColHeaderVisvile |
是否显示列头 |
Cloumns |
列的集合 |
ContextMEnuStirp |
绑定快捷菜单 |
MultiSelect 一般:false |
是否可以多行选中 |
ReadyOnly |
只读 |
RowsHeaderVisible 一般:false |
行头是否可见 |
SelectionMode 一般:FullRowSelect:整行选中 |
如何选择单元格 |
Visible |
指定改控件是否可见 |
AutoGenerateColumns |
是否自动创建列 默认:true |
dgvStudentInfo.SelectedRows.count;
当对网格视图进行操作的时候,需要先判断一下选中的行的个数是否大于0,才进行操作
对数据库进行修改操作()
SqlCommandBuilder:只能操作一个表的内容
接着上面的操作,修改 , 先直接双击修改表中的内容,然后保存(保存按钮事件中的代码如下:)
SqlCommandBuilder builder=new SqlCommandBUilder(adapter);
Adapter.Update(ds.”Student”);
数据网格视图(DataGirdView):的值获取:一般是Value:应为只有网格才有单元格所以:当只能选择一行的时候: dgvStudent.selectedCells[0] .Value; 获取第一个选择的单元格的内容;
DgvStudent.selectedRows[0].Cells[0].Value;
列表视图(listView):获取值一般:Text结尾:
listView.SelectedItems[0].Text; //这个是获取主项的值(第一个项的值)
listView.SelectedItems[0].SubItems[0].Text; // 获取第一个子项的值(也就是第二个,应为主项在第一个)
listView.SelectedItems[0].SubItems[1].Text; // 获取第二个子项的值(也就是第三个,应为主项在第一个)
第六章:数据的筛选和排序
6.1:TreeView控件
6.1.1:认识Treeview控件
概念:树形控件(TreeView)用于以节点形式显示文本和数据,这些节点按层次结构的顺序排列。
Tree的属性和事件
属性 |
说明 |
Nodes |
TreeView中的所有根节点 |
ImagesList |
存放TreeView中节点的图像 |
ImageIndex |
节点默认的图片索引 |
SelectedImagesIndex |
节点选中的图像的索引 |
SelectedNode |
当前选中的父节点 |
事件 |
说明 |
AfterSelect |
选中节点的事件 |
TreeNode(节点)的属性和事件
Text |
节点上的文字 |
ImageIndex |
节点默认的图像索引,不设置会与Tree一样 |
SeletedImageIndex |
节点选中的图片索引 |
Level |
节点的深度(从0开始) |
Nodes |
当前节点包含的子节点集合 |
ParentNode |
当前节点的父节点 |
Tag |
当前节点可以设置的隐藏值(可以用来做标记)当做条件判断 |
SelectNode.parent.Text; |
当前的父节点的文本 |
selecNode.Tag |
得到选中节点设置的隐藏值 |
Select.Text |
选中的节点的文本 |
Splitcontainer |
拆分器(把一个窗体拆开) |
6.2:Dataview
6.2.1:认识DataView
DataView:为我们提供了动态视图,并对动态生成的视图进行排序,筛选,它的主要任务就是运行Windows控件的进行数据绑定。
DataView,DataSet,DataTable:关系
l 一个DataSet中可以有多个DataTable,一个DataTable可以生成多个DataView视图
l 创建DataView对象语法:
DataView 数据视图名=new DataView(DataTable对象)
DataView dataview=new DataView(dataset.Tables[“Student”])
DataView的常用属性
Table |
用于获取设置源的DataTable |
Sort |
把DataView生成的数据排序(dv.sort=””;)(相当于Oder by) |
RowFilter |
获取或设置筛选条件(相当于Where) 只不过要先创建dv.RowFilter=stirng.format(“ ”,num); |
Count |
在应用RowFilter后,获取DataView的行数 |
最后别忘记了绑定数据源:dgvStudentInfo.DataSource=dv;
(就是这个数据网格视图的数据源就是用数据表创建的这个数据视图)
6.3:在DataGridView中实现删除操作
步骤:
1:先判断一下选中的行数是否大于0:DgvStudentInfo.SelectedRows.COUNT>0;
2:先获取选中的行的主键列的值(唯一的):SelectedRows[0].Cells[“StudentNo”].values;
3:编写Sql语句实现删除操作 注意:(如果有多表关联,先删子表,再删主表,而且两个sql语句可以写在一起,先删除的在前面,中间用分好隔开 )
DataGirdView必用属性:
AllowUsertoAddRows |
(DataGirdView)可以取消掉默认展示出来的多余一行 |
AutoSizeColumnSMode 值为:Fill(填满) |
选择是否自动调整列的宽度 |
ColHeaderVisvile |
是否显示列头 |
Cloumns |
列的集合 |
ContextMEnuStirp |
绑定快捷菜单 |
MultiSelect 一般:false |
是否可以多行选中 |
ReadyOnly |
只读 |
RowsHeaderVisible 一般:false |
行头是否可见 |
SelectionMode 一般:FullRowSelect:整行选中 |
如何选择单元格 |
Visible |
指定改控件是否可见 |
AutoGenerateColumns |
是否自动创建列 默认:true |
// 考点
String connStr = "Data Source=.;Initial Catalog=MySchool;User ID=sa;Password=sa";
public void BindTeacherInfo()
{
this.dgvTeacherInfo.AutoGenerateColumns = false; //不自动添加列
this.dgvTeacherInfo.Columns["colGradeId"].Visible = false; //隐藏列
//0.准备sql语句
StringBuilder sb = new StringBuilder();
sb.Append(" select id,name,age,teachYear,g.gradeId,gradeName from Teacher as T ");
sb.Append(" inner join Grade as G ");
sb.Append(" on G.GradeId=T.gradeId");
//1.获得连接对象
SqlConnection conn = new SqlConnection(connStr);
//2.创建数据适配器
SqlDataAdapter adapter = new SqlDataAdapter(sb.ToString(),conn);
//adapter.SelectCommand = new SqlCommand(sql,conn);
//3.创建数据集
DataSet ds = new DataSet();
//4.填充数据
if(ds.Tables["Teacher"]!=null){
ds.Tables["Teacher"].Clear();
}
adapter.Fill(ds,"Teacher");
//5.绑定数据源
this.dgvTeacherInfo.DataSource = ds.Tables["Teacher"].DefaultView;
}