使用C#开发数据库应用程序

第一章 用Hello ACCP.NET快速热身(一)

1-1.进入C#世界

a.第一个C#程序

(1)新建项目【项目:project】 (2)生成解决方案【生成:build,解决方案:solution】 (3)调试【调试:debug】 b.认识控制台应用程序文件夹结构

Program.cs .cs作为扩展名 HelloACCP.exe 是编译后生成的文件,可以直接执行 经验:视图-解决方案资源管理器 也可以使用快捷键Ctrl+Alt+L 工具-选项-项目和解决方案-总是显示解决方案

c.认识C#程序 (1)namespace关键字 (2)using关键字 (3)class关键字 (4)Main方法 (5)关键代码 语法: static void Main(string[] args){} static int Main(string[] args){} static void Main(){} static int Main(){} 这四种Main()方法都是对的,我们可以根据需要自己选择,代码模板自动生成的是第一种。

对比: 组织代码的方式:C#使用命名空间(namespace),java使用包(package) 引入命名空间或包的关键字:C#使用using,java使用import 程序入口:C#使用Main有4种形式,java使用main有一种形式

1-2.C#中的变量和运算符

a.C#中的数据类型 Java C# int int float float String string boolean bool 注意:C#中布尔类型的关键字与java不同,使用bool,C#中字符串数据类型是小写的。 b.C#中变量的命名 语法: 访问修饰符 数据类型 变量名称; 组成:52个英文字母(A-Z,a-z) 10个数字(0-9) 下划线(_) 除此之外不能含有其他的字符。 开头:只能以字母或下划线开头 不能使用的:不能是C#中的关键字 c.C#中的运算符

算术运算符 + - * / % -- 比较运算符 > < >= <= == != 条件运算符 ?: 赋值运算符 = += -= *= /= %= 逻辑运算符 && || ! 1-3.C#中的注释

C#的行注释和块注释与Java是完全相同的,分别使用//和/*..*/,但文档注释与java中的略有不同,使用"///",且文档注释的每一行都以"///"开头。

1-4.Console类 a.向控制台输出 语法: 方式一:Console.WriteLine(); 方式二:Console.WriteLine(); 方式三:Console.WriteLine("格式字符串",变量列表); 注意:第一种和第二种方式的用法与Java中System.out.println();方法的用法相同.第三种方式可是C#中的新东西. 例如: string course="C#"; Console.WriteLine("我的课程名称是:{0}",course); b.从控制台输入 语法: Console.WriteLine(); 例如: string name=Console.ReadLine(); int age=int.Parse(Console.ReadLine()); 扩展:float.Parse(); double.Parse(); int.Parse();这个必须是字符串的数字 如:"120" c.简单综合应用 using System; using System.Collections.Generic; using System.Text;

namespace HelloACCP { ///<summary> ///此示例演示向控制台输出学员信息 ///</summary> class Program { static void Main(String[] args) { string name1;//第一个学员姓名 string name2;//第二个学员姓名 int age1;//第一个学员年龄 int age2;//第二个学员年龄

//输入第一个学员信息 Console.WriteLine("请输入第一个学员的姓名:"); name1=Console.ReadLine(); Console.WriteLine("请输入第一个学员的年龄:"); age1=int.Parse(Console.ReadLine()); //输入第二个学员信息 Console.WriteLine("请输入第二个学员的姓名:"); name2=Console.ReadLine(); Console.WriteLine("请输入第二个学员的年龄:"); age2=int.Parse(Console.ReadLine());

//输出学员信息 Console.WriteLine("第一个学员的姓名"+name1+",年龄"+age1+"岁"); Console.WriteLine("第二个学员的姓名"+name2+",年龄"+age2+"岁"); } } } 经验:教你一招快速输入 输入cw+Tab+Tab,就出来Console.WriteLine();了! 1-5.C#中的条件判断 a.if结构 语法: if结构 if(表达式) { //代码块 }

if-else结构 if(表达式) { //代码块1 } else { //代码块2 }

多重if结构 if(表达式1) { //代码块1 } else if(表达式2) { //代码块2 } else { //代码块3 } b.switch结构 语法: Java中 C#中 swtich() switch() switch() { { { case 常量表达式1; case 常量表达式1; case 常量表达式1; 语句1; 语句2; case 常量表达式2; break;//可以没有 break;//必须有 语句2; case 常量表达式1; case 常量表达式2; break;//必须有 语句2; 语句2; break;//可以没有 break;//必须有 ... ... ... default: default: default: 语句n; 语句n; 语句n; break;//必须有 break;//必须有 } } } c.常见错误 经验: (1)改正错误,往往从最上面的一条错误信息开始 (2)为了方便定位,我们需要VS显示行号 工具-选项-文本编辑器-C# 右边的显示-行号

第二章 用Hello ACCP.NET快速热身(二)

2-1:C#中的循环语句

a.基本循环语句 (1)while循环 语法: while(条件表达式){ //代码块 } (2)Do-While循环 语法: do { //代码块 }while(条件表达式); (3)for循环 语法: for(表达式1;表达式2;表达式3) { //代码块 } (4)foreach循环 语法: foreach(类型 元素(局部变量) in 集合或者数组) { // 代码块 } 例如: using System; using System.Collections.Generic; using System.Text;

namespace HelloACCP { ///<summary> ///此操作演示如何使用foreach循环 ///</summary> class Program { static void Main(String[] args) { Console.WriteLine("请输入一个字符串 :");//输入提示 string line=Console.ReadLine();//从控制台读入字符串 //循环输出字符串中的字符 foreach(char c in line) { Console.WriteLine(c); } Console.ReadLine(); } } } 注意:任意的循环 相互使用都叫做二重循环 内层循环结束后,才能进行外层循环! b.VS调试技巧 (1)设置断点(断点:breakpoint) (2)监视变量值 (3)单步跟踪(步:step) F5-开始调试 Shift+F5-停止调试 F9-设置或删除断点 F10-单步执行 2-2:二重循环

a.循环进阶 例如: using System; using System.Collections.Generic; using System.Text;

namespace HelloACCP { ///<summary> ///此程序演示二重循环应用 ///</summary> class Program { static void Main(String[] args) { int i,j;//循环变量 int sum=0;//总分 int average;//总分 int score;//输入的分数

//外层循环控制逐个计算每个班级 for(i=0;i<3;i++) { sum=0;//总分清0,重新计算 Console.WriteLine("\n请输入第{0}个班级的成绩",i+1); //内层循环计算每个班级的总分 for(j=0;j<4;j++) { Console.Write("第{0}个学员的成绩:",j+1); score=int.Parse(Console.ReadLine()); sum=sum+score; } average=sum/4;//计算平均分 Console.WriteLine("第{0}个班的平均分为:{1}分",i+1,average); } Cnosole.ReadLine(); } } } b.流程控制进阶 (1)continue语句 (2)break语句 (3)二重循环continue和break语句对比 c.常见错误 循环结构和条件出错! 2-3:C#中的数组 a.C#中的一维数组 (1)声明 语法: 数据类型[] 数组名; 例如:int[] arrya; (2)指定数组大小 例如:int[] array; array=new int[5];//创建一个含有5个元素的整形数组 (3)初始化 例如:int[] array=new int[5]{0,1,2,3,4};//创建一个含有5个元素的整形数组 int[] array=new int[]{0,1,2,3,4};//省略数组长度 int[] array={0,1,2,3,4};//省略new (4)获取数组长度 通过:"数组名.Length" 例如: int[] array=new int[5]{0,1,2,3,4}; for(int i=0;i<array.Length;i++) { Console.WriteLine(array[i]); } 注意:与java同样,是通过下标进行访问,在C#中我们把下标称为索引. b.常见错误 注意:C#允许在初始化的同时指定数组长度,但是数组初始值的数目必须与数组的长度完全一样. 例如: using System; using System.Collections.Generic; using System.Text;

namespace HelloACCP { ///<summary> ///此示例演示声明和初始化一维数组时的错误 ///</summary> class Program { static void Main(String[] args) { int[] array=new int[5]{0,1};//声明 并初始化一维数组 foreach(int i in array)//输出数组中的所有元素 { Console.WriteLine(i); } Console.ReadLine(); } } } 注意:此示例是错误的哈!!!(*^__^*) 嘻嘻……

2-4:冒泡排序 注意:(1)数组 长度 (2)外层 外循环次数 (3)内层 内循环次数 数组 N 外 N-1 内 N-1-i 例如: using System; using System.Collections.Generic; using System.Text;

namespace HelloACCP { ///<summary> ///此程序演示二重循环实现冒泡排序 ///</summary> class Program { static void Main(String[] args) { int[] scores=new int[5];//成绩数组 int i,j;//循环变量 int temp;//临时变量 //读入成绩 Console.WriteLine("请输入5个学员的成绩:"); for(i=0;i<5;i++) { Console.WriteLine("请输入5个学员的成绩:",i+1); scores[i]=int.Parse(Console.ReadLine());//类型转换 }

//开始排序-使用冒泡排序 for(i=0;i<scores.Length-1;i++)//控制比较多少轮 { //将最大的元素交换到最后 for(j=0;j<scores.Length-1-i;j++) { if(scores[j]>scores[j+1]) { //交换元素 temp=scores[j+1]; scores[j+1]=temp; } } } //排序后输出 Console.WriteLine("排序后的成绩为:"); for(i=0;i<scores.Length;i++) { Console.Write("{0}\t",scores[i]); } Console.ReadLine(); } } } 经验:冒泡排序快速记口诀(升序): N个数字来排序,两两相比小靠前 外层循环N-1,内层循环N-1-i 如果要降序排序,只要把程序中的大于号换成小于号就行了。

外层循环对应轮数 内层循环对应次数 第三章 用Hello ACCP.NET快速热身(三)

3-1:C#中的命名空间 例如: //using System; //using System.Collections.Generic; //using System.Text;

namespace HelloACCP { ///<summary> ///此示例演示命名空间 ///</summary> class Program { static void Main(String[] args) { System.Console.WriteLine("Hello ACCP.NET"); } } } 3-2:自定义方法

a.定义方法 语法: 访问修饰符 返回类型 方法名(参数列表) { //方法的主体 } (1)访问修饰符 (2)方法的返回类型 (3)方法名 (4)参数列表 (5)方法的主体 b.向方法中传递参数 (1)值传递 例如: using System; using System.Collections.Generic; using System.Text;

namespace HelloACCP { ///<summary> ///此示例演示使用方法计算税后的工资 ///</summary> class Program { static void Main(String[] args) { int pay;//税前工资 float taxRate=0.1f;//税率 float afterTax;//税后工资 pay=int.Parse(Console.ReadLine());

//调用方法计算税后工资 afterTax=GetPay(pay,taxRate); Console.WriteLine("税前工资{0},税后工资{1}",pay,afterTax); Console.ReadLine(); } //此方法根据税前工资计算税后工资 private static float GetPay(int pay,float taxRate) { float afterTax;//税后的工资 if(pay<=1600)//低于1600不缴税 { afterTax=pay; } else { afterTax=pay-(pay-1600)*taxRate; } return afterTax; } } } 注意: Java C# import using 包(对应硬盘上的一组文件夹) 命名空间(不对应物理文件夹) 一种组织代码的文件 唯一标识文件 (2)按引用传递参数 例如: using System; using System.Collections.Generic; using System.Text;

namespace HelloACCP { ///<summary> ///此示例演示按引用传递参数交换两个数 ///</summary> class Program { static void Main(String[] args) { int num1,num2; Console.WriteLine("请输入两个数字"); num1=int.Parse(Console.ReadLine()); num2=int.Parse(Console.ReadLine());

Console.WriteLine("交换前两个数的分别为:{0}和{1}",num1,num2); //交换两个数的值 Swap(ref num1,ref num2);

Console.WriteLine("交换后两个数的分别为:{0}和{1}",num1,num2); Console.ReadLine(); } //交换两个数的方法 private static void Swap(ref int num1,ref int num2) { int temp;//中间变量 temp=num1; num1=num2; num2=temp;

} } } c.常见错误 例如: using System; using System.Collections.Generic; using System.Text;

namespace HelloACCP { ///<summary> ///此示例演示按引用传递参数交换两个数 ///</summary> class Program { static void Main(String[] args) { int num1,num2; Console.WriteLine("请输入两个数字"); num1=int.Parse(Console.ReadLine()); num2=int.Parse(Console.ReadLine());

Console.WriteLine("交换前两个数的分别为:{0}和{1}",num1,num2); //交换两个数的值 Swap(num1,num2);

Console.WriteLine("交换后两个数的分别为:{0}和{1}",num1,num2); Console.ReadLine(); } //交换两个数的方法 private static void Swap(ref int num1,ref int num2) { int temp;//中间变量 temp=num1; num1=num2; num2=temp;

} } } 注意:同一个类里面,方法如果是静态的直接使用类名.方法名 若果不是static ,则需创建对象再调用 3-3:IDE使用技巧进阶 选中代码的时候,点击右键选择重构-提取方法,就会自动生成 如上面的那个Swap()方法 3-4:C#中的String类

a.常用的字符串处理方法 bool Equals(string value) 比较两个字符串是否相等,最终返回true或false,与"=="的作用是相同的 int Compare(string strA,string strB) 比较两个字符串的大小关系,最终返回大于0或小于0的数 int IndexOf(string value) 获取与value字符串相匹配的索引,找到value,就返回索引,否则,就返回-1 string Join(string separator,string[] value) 把数组中value中的每个字符串用指定的分隔符separator连接,返回连接后的字符串 string [] Split(char separator) 用指定的分隔符separator分割字符串,返回分割后的字符串组成的数组 string SubString(int startIndex,int length) 从指定位置startIndex开始检索长度为length的子字符串 string ToLower() 获得字符串的小写形式 string ToUper() 获得字符串的大写形式 string Trim() 去掉字符串两端的空格 b.Format方法 例如: string nam="超超"; Console.WriteLine("我的名字是{0},我的年龄是{1}",name,18); 语法: string myString=string.Format("格式字符串",参数列表); 例如:string myString=string.Format("{0}乘以{1}等于{2}",2,3,2*3); 2乘以3等于6

3-5:在C#中进行类型转换

a.简单的类型转换 (1)隐式类型转换 注意:对应数值类型,任何类型A,只要取其值范围完全包含在类型B的取值范围内,就可以隐式转换为类型B。 也就是说,int类型可以隐式转换为float,double类型,float类型可以隐式转换为double类型,很好理解哈,(*^__^*) 嘻嘻…… (2)显示类型转换 注意:与隐式类型转换相反,当要把取值范围大的类型转换为取值范围小的类型时,就需要显示转换。 b.数值类型与字符串之间的转换 (1)字符串转换为数值型 例如: int.Parse(string); float.Parse(string); double.Parse(string); (2)数值类型转换为字符串 例如: int age=18; string myage=age.ToString(); c.使用convert类进行转换 Convert.ToInt32() 转换为整型(int型) Convert.ToSingle() 转换为单精度浮点型(float型) Convert.ToDouble() 转换为双精度浮点型(double型) Convert.ToString() 转换为字符串类型(string型) d.常见错误 注意:Parse()方法只用于将字符串转换为其他数据类型,如果传入的参数为其他类型,则会出现以下情况 double money=20.53; int pay=int.Parse(money); 错误原因:Parse()方法不接受string类型以外的参数。

第四章 第一个Window程序

4-1:第一个Windows应用程序

a.创建第一个Windows应用程序 (1)打开VS编辑器 (2)文件-新建-项目 (3)项目类型选择"Visual C#" (4)模板选择"Windows应用程序" b.认识Windows应用程序文件夹结构 查看解决方案资源管理器 例如: using System; using System.Collections.Generic; using System.Text;

namespace HelloACCP { ///<summary> ///应用程序的入口点 ///</summary> class Program { static void Main(String[] args) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDeault(false); Application.Run(new Form1());//关键,程序运行的 } } } c.认识窗体文件 (1)partial关键字 partial是部分的意思,这是.NET Framework2.0引入的一个新特性-分布类 在C#中,为了方便代码的管理和编辑,使用partial关键字可以将同一个类的代码分开放在多个文件夹中,每个文件都是类的一部分代码。 比如,必须两把钥匙同时用,才能开启门,为了安全 partial关键字,在编译时,VS就会识别出来,并把Form1.cs和Form1.Designer.cs合并成一个类来进行处理,这就是partial的作用,就是将一个类标识为分布类。 (2)Form类【Form是.NET Framework定义好的一个最基本的窗体类,具有一些窗体最基本的属性和方法。冒号表示继承】 例如:public partial class Form1:Form 4-2:认识窗体

a.窗体的重要属性 属性: Name 窗体对象的名字,用以在代码中进行标识 BackColor 窗体的背景色 BackgroundImage 窗体的背景图像 FormBorderStyle 窗体显示的边框样式,有7个可选取的值,默认是Sizable MaximizeBox 确定窗体标题栏的右上角是否有最大化框,默认为true ShowInTaskbar 确定窗体是否出现在Windows任务栏中,默认为true StartPosition 确定窗体第一次出现时的位置 Text 窗体标题栏中显示的文本 TopMost 指示窗体是否始终显示在此属性为设置为true的所有窗体之上,默认为false WindowState 确定窗体的初始可视状态,包括Normal(普通),Maximized(最大化),Minimized(最小化),默认值为Normal b.窗体的重要事件 事件: Load 窗体加载事件,窗体加载时发生 MoseClick 鼠标单击事件,当用户单击窗体时发生 MouseDoubleClick 鼠标双击事件,当用户双击窗体时发生 MouseMove 鼠标移动事件,当鼠标移过窗体时发生 KeyDown 键盘按下事件,在首次按下某个键时发生 KeyUp 键盘释放事件,在释放键时发生 例如: namespace MyForm { public partial class Form1:Form { public Form1() { InitializeComponent(); } private void Form1_MouseMove(object sender,MouseEventArgs e) { } } } 函数,构造方法无返回值 类型与类同名【如上所示:】 4-3:使用窗体控件

a.使用菜单条 Name 代码中菜单对象的名称 Items 在菜单中显示的项的集合 Text 与菜单相关联的文本 Name 窗体对象的名称 Text 窗体标题栏显示的文字 WindowState 窗体出现时是最大化的(Maximized) 例如: //用户选择"退出"菜单项时,退出应用程序 private void tsmiExit_Click(object sender,EventArgs e) { Application.Exit();//退出应用程序的方法 } 规范: 菜单条和菜单项命名: 为菜单设置Name属性时,加前缀ms,如:msUser。为菜单项设置Name属性时,加前缀tsmi,如:tsmiAddStudentUser 、tsmiExit等. b.使用基本控件 (1)标签【Lable】 属性:Image将在标签上显示的图像 Text在标签上显示的文本 (2)文本框(TextBox) 属性 MaxLenth 指定可以在文本框中输入的最大字符数 Multiline 表示是否可以在文本框中输入多行文本 PasswordChar 指示在作为密码框时,文本框中显示的字符,而不是实际输入的文本 ReadOnly 指定是否允许编辑文本框中的文本 Text 与文本框相关联的文本 (3)按钮【Button】 属性 Text 按钮上显示的文本 TextAlign 按钮上文本的对齐方式 事件 Click 单击按钮时发生 (4)单选按钮【RadioButton】 属性 Checked 指示单选按钮是否以选中 Text 单选按钮显示的文本 事件 Click 单击单选按钮时发生 (5)列表框【ListBox】 属性 Items 列表框中所有的项 Text 当前选定的文本 SelectedIndex 当前选定项目的索引号,列表框中的每个项都有一个索引号,从0开始 SelectedItem 获取当前选定的项 (6)组合框【ComboBox】 属性 Items 组合框中的项 DropDownStyle 定义组合框的风格,指示是否显示列表框部分,是否允许用户编辑文本框部分 Text 与组合框相关联的文本 SelectedIndex 当前选定项目的索引号,列表框中的每个项都有一个索引号,从0开始 SelectedItem 获取当前选定的项 (7)分组框【GroupBox】 (8)面板【Panel】 规范: 每个控件都有一个Name属性,用以在代码中表示该对象。我们每拖放到窗体上的一个控件,首先要为控件命名。通常加的前缀:Lable为lbl,TextBox为txt, Button为btn,RadioButton为rdo,ComboBox为cbo等等。 例如: //"取消"按钮的Click事件处理程序 private void btnCancle1_Click(object sender,EventArgs e) { this.Close();//关闭当前窗体 } using System; using System.Collections.Generic; using System.Text;

namespace HelloACCP { ///<summary> ///修改运行的窗体 ///</summary> class Program { static void Main(String[] args) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDeault(false); Application.Run(new AddStudentForm());//修改此方法设置运行的窗体 } } } c.实现窗体间的跳转 (1)创建窗体对象 被调用的窗体类 窗体对象名=new 被调用的窗体类; (2)显示窗体 窗体对象名.Show(); 例如: //用户选择"新增学员用户"菜单项时,出现创建学员用户窗口 private void tsmiNewStudent_Click(object sender,EventArgs e) { //创建窗体对象 AddStudentForm addStudentForm=new AddStudentForm(); addStudentForm.Show();//显示创建用户窗体 } 4-4:使用MessageBox对象

a.显示消息框 例如: MessageBox.Show(要显示的字符串); MessageBox.Show(要显示的字符串,消息框的标题); MessageBox.Show(要显示的字符串,消息框的标题,消息框按钮); MessageBox.Show(要显示的字符串,标题,消息框按钮,消息框图标); b.消息框的返回值 如:DialogResult.OK;//用户单击了"确定"返回的值 例如: //验证是否输入了信息 private void btnLogin_Click(object sendar,EventArgs e) { if(txtLoginId.Text=="") { DialogResult result; result=MessageBox.Show("请输入用户姓名","输入提示",MessageBoxButtons.OKCancel,MessageBoxIcon.Information); if(result==DialogResult.OK) { MessageBox.Show("你选择了确定按钮"); } else { MessageBox.Show("你选择了取消按钮"); } } }

第五章 用控件进行快速开发

5-1:排列窗体上的控件 a.对齐 (1)选择你要对齐的控件 (2)在VS的菜单中,选择“格式”-“对齐” b.使用Anchor (1)选择要锚定的控件 (2)在"属性"窗口中,单击Anchor属性右边的箭头,显示编辑器 (3)在显示的十字形上选择或清除控件锚定的边 (4)单击Anchor属性名,关闭编辑器。 经验:一次锚定多个控件,按住Ctrl键选择多个控件,然后再设置Anchor属性,可以一次锚定多个控件。 锚定的作用:设置控件对于窗体的摸个边缘的距离保持不变,也就是说窗体一起动态调整控件的大小,这是每个控件都有的属性。 c.使用Dock (1)选择要停靠的控件 (2)在"属性"窗口中,单击Dock属性右侧的箭头,显示编辑器 (3)设置停靠方式 为什么要用停靠? 除了让控件能够跟随窗体动态调整大小,有的时候我们还想让控件始终保持在窗体的边缘,或者填充窗体。比如我们常见的记事本,它的菜单 总是在窗体的最上边,而它的文本输入区域总是填充了窗体的剩余部分。

5-2:创建多文档界面应用程序(MDI)

a.为什么使用MDI 比如:记事本 如果想在一个窗口中打开多个文件,就要使用MDI(多文档界面)应用程序。 b.什么是MDI 比如:在Microsoft Excel中,我们可以同时打开多个Excel文档,而不需要新开一个Excel窗口,这种应用程序我们称为MDI(多文档界面); c.如何创建MDI (1)创建MDI【设置父窗体:将父窗体的IsMDIContainer属性设为true。设置子窗体:在调用打开子窗体的Show()方法前,在代码中将子窗体的MdiParent属性设为this】 例如: //用户单击菜单项时,出现创建学员用户窗口 private void tsmiNewStudent_Click(object sender,EventArgs e) { //创建窗体对象 AddStudentForm addStudentForm=new AddStudentForm(); addStudentForm.MdiParent=this; addStudentForm.Show();//显示创建学员用户窗体 } (2)为父窗体添加子窗体列表【在父窗体中添加一个菜单Name(tsmiWindows),添加一个"窗口"菜单项,将菜单控件的MdiWindowListItem属性设为"窗口"菜单项(tsmiWindows)】

5-3:使用WinForms高级控件 a.使用工具条控件和状态条控件 工具条和状态条的主要属性 ImageScalingSize 工具条或状态条中的项显示的图像的大小 Items 在工具条或状态条上显示项的集合

工具条或状态条上的按钮和标签的主要属性和事件 属性 DisplayStyle 设置图像和文本的显示方式,包括显示文本、图像、文本和图像或什么都不显示 Image 按钮/标签上显示图片 Text 按钮/标签上显示的文本

事件 Click 单击按钮/标签时,触发该事件 使用:(1)设置工具条 (2)设置状态条 b.使用选项卡控件 属性 MultLine 是否可以显示多行选项卡 TabPages 包含的选项卡页的集合 SelectedIndex 当前所选选项卡页的索引值

c.使用图片框、图像列表、计时器控件 图片属性 Image 图片框显示的图像 SizeMode 指定如何处理图片的位置和控件的大小

图像列表的属性 Images 存储在图像列表中的所有图像 ImageSize 图像列表中图像的大小 TransparentColor 被视为透明的颜色

计时器的属性 Interval 事件发生的频率,以毫秒为单位 Enable 是否定时引发事件 计时器的事件 Tick 每当指定间隔发生的事件

计时器的方法 Start 启动计时器 Stop 停止计时器 例如: using System; using System.Collections.Generic; using System.Text;

namespace HelloACCP { ///<summary> ///About窗体 ///</summary> public partial class AboutForm:Form { int index=0;//图片框的索引 public AboutForm() { InitializeCompontent(); }

//计时器的事件处理方法,定时变换图片框中的图片 private void timer_Tick(object sender,EventArgs e) { //如果当前显示的图片索引没有最大值就继续增加 if(index<ilAnimatino.Images.Count-1) { index++; } else { //否则从第一个图片开始显示,索引从0开始 picAnimation.Image=ilAnimation.Images[index]; } }

//图片框的单击事件处理方法,单击是关闭窗体 private void picOK_Click(object sendar,EventArgs e) { this.Close(); } } } d.显示模式窗体 例如: //"关于考试管理系统"菜单项的Click事件处理 private void tsmiAbout_Click(object sender,EventArgs e) { AboutForm aboutForm=new AboutForm(); aboutForm.ShowDialog();//打开"关于"窗体,显示为模式窗体 } 5-4:用户输入验证

例如: //单击"登陆"按钮时,验证用户的输入 private void btnLogin_Click(object sender,EventArgs e) { //调用用户验证方法,根据返回值确定是否通过验证 if(ValidateInput()) { MessageBox.Show("验证成功"); } else { MessageBox.Show("验证失败"); } } 5-5:窗体的数据传递 具体,亲查询P137页

第六章 用ADO.NET连接数据库

6-1:ADO.NET概述

a.ADO.NET简介 ADO.NET可以把从数据源检索到的数据保存在本地的一个叫做"数据集"的地方,这样应用程序直接操作本地的数据就行了, 数据源就可以给更多的应用程序提供服务。这就是ADO.NET的断开连接模型。 b.ADO.NET的主要组件 (1).NET Framwork数据提供程序是专门为数据处理以及快速地只进、只读访问数据而设计的组件。使用它,我们可以连接到数据库、执行命令和检索结果,直接对数据进行操作。 (2)DataSet是专门为独立于任何数据源的数据访问而设计的。使用它,我们可以不必直接和数据库打交道,可以大批量的操作数据,也可以将数据绑定到控件上。

6-2:使用Connection对象

a.认识Connection对象 属性 ConnectionString 用于连接数据库的连接字符串 方法 Open 使用ConnectionString属性所指定的设置打开数据库连接 Close 关闭与数据库的连接 连接数据库主要分为3步: (1)定义连接字符串 Data Source=服务器名;Initial Catalog=数据库名;User ID=用户名;Pwd=密码 string connString="Data Source=.;Initial Catalog=pubs;User ID=sa"; (2)创建Connection对象 SqlConnection connection=new SqlConnection(connString); (3)打开与数据库的连接 connection.Open(); 在这三步中,第一、二步也可以调换,可以先创建Connection对象,再设置它的ConnectionString属性,如: SqlConnection connection=new SqlConnection(connString); string connString="Data Source=.;Initial Catalog=pubs;User ID=sa"; connection.ConnectionString=connString; b.连接数据库实例 例如: using System; using System.Collections.Generic; using System.Text;

namespace HelloACCP { ///<summary> ///本实例演示打开和关闭数据库连接 ///</summary> public partial class AboutForm:Form { int index=0;//图片框的索引 public AboutForm() { InitializeCompontent(); }

//测试打开数据库的操作 private void btnTest_Click(object sender,EventArgs e) { //数据库连接字符串 string connString="Data Source=.;Initial Catalog=MySchool;User ID=sa"; //创建Connection对象 SqlConnection connection=new SqlConnection(connString);

//打开数据库连接 connection.Open(); MessageBox.Show("打开数据库连接成功");

//关闭数据库连接 connection.Close(); MessageBox.Show("关闭数据库连接成功"); } } } 注意:为了使用SQL Server.NET数据提供程序,我们在程序的开头增加了一条引用命名空间的语句using System.Data.SqlClient;

6-3:异常处理

a.如何处理异常 语法: try { //包含可能出现异常的代码 } catch { //处理异常的代码 }

比如: try { conn.Open(); //其它操作 conn.Close(); } catch(Exception ex) { //错误处理代码 }

try { conn.Open(); //其它操作 } catch(Exception ex) { //错误处理代码 } finally { conn.Close(); } b.处理数据库操作异常实例 详细请查询P155页

6-4:使用Command对象

a.认识Command对象 Command对象的主要属性和方法 属性 Connection Command对象使用的数据库连接 CommandText 执行的SQL语句 方法 ExecuteNonQuery 执行不返还行的语句,如update等 ExecuteReader 执行查询命令,返回DataReader对象 ExecuteScalar 返回单个值,如执行count(*)

使用Command对象,必须有一个可用的Connection对象,使用Command对象的步骤包括: (1)创建数据库连接 (2)定义执行的SQL语句 (3)创建Command对象 (4)执行Command对象的某个方法执行命令 b.查询数据库实例 例如: using System; using System.Collections.Generic; using System.Text; using System.Data.SqlClient;//SQL Server.NET数据库提供程序命名空间

namespace HelloACCP { ///<summary> ///本实例演示打开和关闭数据库连接 ///</summary> public partial class AboutForm:Form { int index=0;//图片框的索引 public AboutForm() { InitializeCompontent(); }

//打开数据库连接,查询学员记录数量 private void btnTest(object sender,EventArgs e) { //创建Connection对象 string connString="Data Source=.;Initial Catalog=MySchool;User ID=sa"; SqlConnection connection=new SqlConnection(connString);

int num=0;//学员信息的数量 string message="";//弹出的结果信息 //查询用的SQL语句 string sql="select count(*) from Student";

try { conn.Open();//打开数据库连接 //创建Command对象 SqlCommand command=new SqlCommand(sql,connection); //执行SQL语句 num=(int)command.ExecuteScalar();

message=string.format("Student表中共有{0}条学员信息",num); MessageBox.Show(message,"查询结果",MessageBoxButtons.OK,MessageBoxIcon.Information); } catch(Exception ex) { //错误处理代码 MessageBox.Show(ex.Message); } finally { //关闭数据库连接 conn.Close(); } } } } c.常见错误 (1)没有打开数据库或关闭数据库连接 using System; using System.Collections.Generic; using System.Text; using System.Data.SqlClient;//SQL Server.NET数据库提供程序命名空间

namespace HelloACCP { ///<summary> ///本实例演示打开和关闭数据库连接 ///</summary> public partial class AboutForm:Form { int index=0;//图片框的索引 public AboutForm() { InitializeCompontent(); }

//打开数据库连接,查询学员记录数量 private void btnTest(object sender,EventArgs e) { try { //创建Command对象 SqlCommand command=new SqlCommand(sql,connection); //执行SQL语句 num=(int)command.ExecuteScalar();

message=string.format("Student表中共有{0}条学员信息",num); MessageBox.Show(message,"查询结果",MessageBoxButtons.OK,MessageBoxIcon.Information); } catch(Exception ex) { //错误处理代码 MessageBox.Show(ex.Message); } finally { //关闭数据库连接 conn.Close(); } } } } (2)ExecuteScalar()方法的返回值没有进行类型转换 try { connection.Open();//打开数据库连接 //创建Command对象 SqlCommand command=new SqlCommand(sql,connection); //执行SQL语句 num=(int)command.ExecuteScalar();

message=string.format("Student表中共有{0}条学员信息",num); MessageBox.Show(message,"查询结果",MessageBoxButtons.OK,MessageBoxIcon.Information); } 6-5:综合实例 详细请查看P163页

第七章 用ADO.NET查询和操作数据库

7-1:查询数据【注意:修改或删除必须得有条件】

a.认识DataReader对象 DataReader对象的主要属性和方法 属性 HasRows 是否返回了结果,结果返回true或false FieldCount 当前行中的列数 方法 Read 前进到下一行记录,结果返回true或false Close 关闭DataReader对象 b.如何使用DataReader对象 (1)创建Command对象 (2)调用Command对象的ExecuteReader()方法创建DataReader对象 如:SqlDataReader dataReader=command.ExecuteReader(); (3)使用DataReader的Read()方法逐行读取数据 如:dataReader.Read(); (4)读取当前行的某列的数据 如:(string)dataReader["StudentName"]; (5)关闭DataReader对象,调用它的Close()方法 如:dataReader.Close(); c.常见错误 例如: SqlDataReader reader=command.ExecuteReader(); string name=(string)reader["name"]; 应修改为: SqlDataReader reader=command.ExecuteReader(); if(reader.Read()) { string name=(string)reader["name"]; }

例如: SqlDataReader reader=command.ExecuteReader(); if(reader.Read()) { string name=(string)reader["name"]; } command.CommandText=newSql; SqlDataReader newReader=command.ExecuteReader(); 应添加 reader.Close();//释放连接对象 7-2:操作数据

7-3:控件进阶 a.ListView控件 ListView控件的主要属性 属性 Columns "详细信息"视图中显示的列 FullRowSelect 当选中一项时,它的子项是否同该项一起突出显示 Items ListView中所有项的集合 MultiSelect 是否允许选择多项 SelectedItems 选中的项的集合 View 指定显示5种视图中的哪一张视图 事件 MouseDoubleClick 鼠标双击事件 方法 Clear() 移除ListView中的所有项 b.ContextMenuStrip控件 菜单项(MenuItem)的主要属性和事件 DisplayStyle 指定是否显示图像和文本 Image 显示在菜单项上的图像 Text 显示在菜单项上的文本 事件 Click 单击事件,单击菜单项时发生

7-4:综合实例 详细请查看P185页

a.查询数据综合实例 (1)创建查询学员用户窗体SearchStudentForm (2)查询数据 b.操作数据综合实例 (1)添加右键菜单 (2)处理"非活动"菜单项的Click事件 (3)处理"删除"菜单项的Click事件

7-5:操作数据库小结

a.查询操作 (1)查询单个值 (2)查询若干条记录 b.非查询操作

第八章 用DataGridView显示和操作数据库

8-1:DataSet对象

a.认识DataSet对象 数据集就相当于一个临时仓库。 b.如何创建DataSet 语法: DataSet 数据集对象=new DataSet("数据集的名称字符串"); 例如: DataSet myDataSet=new DataSet(); DataSet myDataSet=new DataSet("MySchool");

8-2:DataAdapter对象

a.认识DataAdapter对象 DataAdapter(数据适配器)属于.NET数据提供程序,所以不同类型的数据库需要使用不同的数据适配器。详细请看P203页 DataAdapter对象的重要属性和方法 属性 SelectCommand 数据库检索数据的Command对象 方法 Fill 向DataSet中的表填充数据 Update 将DataSet中的数据提交到数据库 b.如何填充数据集 语法: SqlDataAdapter 对象名=new SqlDataAdaper(查询用的SQL语句,数据库连接); 使用步骤: (1)创建数据库连接对象(Connection对象) (2)创建从数据库查询数据用的SQL语句 (3)利用上面创建的SQL语句和Connection对象创建DataAdapter对象 (4)调用DataAdpter对象的Fill()方法填充到数据集。 c.如何保持数据集中的数据 (1)使用SqlCommandBuilder对象生成更新用的相关命令 (2)调用DataAdapter对象的Update()方法 语法: DataAdapter 对象.Update(数据集对象,"数据表名称字符串"); 例如: SqlCommandBuilder builder=new SqlCommandBuilder(dataAdapter); dataAdapter..Update(dataSet,"Teacher"); 经验: SqlCommandBuilder 只操作单个表,也就是说,我们创建DataAdapter对象时,使用的SQL语句只能从一个表里面查数据,不能进行联合查询。

8-3:DataGridView控件

a.认识DataGridView控件 DataGridView控件的主要属性 属性 Columns 包含的列的集合 DataSource DataGridView的数据源 ReadOnly 是否可以编辑单元格 DataPropertyName 绑定的数据列的名称 HeaderText 列标题文本 Visible 指定列是否可见 Frozen 指定水平滚动DataGridView的列是否移动 ReadOnly 指定单元格是否为只读 AllowUserToAddRows 是否允许用户增加行 false AllowUserToDeletRows 是否允许用户删除行 false MultiSelect 是否允许同时选择多行 false selectionMode 选择模式 FullRowSelect

b.如何使用DataGridView显示数据 (1)添加窗体的控件 (2)设置DataGridView的属性和个列的属性 (3)指定DataGridView的数据源 c.如何保存修改后的数据 (1)增加"保存修改"按钮 (2)编写事件处理方法 d.常见错误 (1)不使用SqlCommandBuilder直接调用Update()方法 (2)利用DataGridView显示数据集中的表时,没有为它的列设置DataPropertyName属性

8-4:综合实例 详细请看P214页 (1)创建窗体,设计窗体界面 (2)设置窗体中DataGridView的属性 (3)填充数据集,显示数据 (4)将修改后的数据提交到数据库 (5)实现按性别筛选功能 8-5:ADO.NET小结

DataReader适用于:只读取查询结果;节省内存,提高性能。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Windows Community

Windows Community Toolkit 4.0 - DataGrid - Part01

在上面一篇 Windows Community Toolkit 4.0 - DataGrid - Overview 中,我们对 DataGrid 控件做了一个概...

1182
来自专栏Google Dart

AngularDart Material Design 滑块 顶

可以通过使用鼠标拖动滑块或使用键盘来控制滑块。 在LTR中,向左/向下箭头键将值减1,向上/向右键增加1,向上翻页增加10%(向上舍入),向下翻页减少10%(向...

1432
来自专栏大内老A

Enterprise Library Policy Injection Application Block 之二: PIAB设计和实现原理

在前面一篇文章中,我对Enterprise Library中的PIAB (Policy Injection Application Block)作了简单的介绍。...

2196
来自专栏企鹅号快讯

python案例-爬取大学排名

一个好玩的爬虫 明天就要考试了,就是不想复习,就想去写代码,学习编程!2018,第一炮。 ? 技术路线:request-bs4 程序结构: 1.从网上获取大学排...

2725
来自专栏跟着阿笨一起玩NET

运行时自定义PropertyGrid显示属性项目

在PropertyGrid所显示的属性内容包括属性分类(Category)及组件属性,

1912
来自专栏大内老A

集成EntLib实现ASP.NET MVC的异常处理[续篇]

在《集成EntLib实现ASP.NET MVC的异常处理》我们实现采用EntLib的Exception Handling Application Block(E...

2029
来自专栏岑玉海

hbase源码系列(九)StoreFile存储格式

从这一章开始要讲Region Server这块的了,但是在讲Region Server这块之前得讲一下StoreFile,否则后面的不好讲下去,这块是基础,Re...

4015
来自专栏iOSer成长记录

OpenGL ES(二) 三角形

1513
来自专栏三流程序员的挣扎

Flutter 学习记2 - 首个应用

void main() 是入口方法,=> 用于单行方法,就是函数签名和函数体间的连接符号,感觉作用和 Kotlin 的单行函数体用 = 类似。既然这样,把代码修...

1421
来自专栏林德熙的博客

win10 uwp 使用 Geometry resources 在 xaml

经常会遇到在 xaml 使用矢量图,对于 svg 的矢量图,一般都可以拿出来写在 Path 的 Data ,所以可以写为资源,但是写出来的是字符串,如何绑定 G...

662

扫码关注云+社区

领取腾讯云代金券