使用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适用于:只读取查询结果;节省内存,提高性能。
使用C#开发数据库应用程序的更多相关文章
- 使用Dapper.Contrib 开发.net core程序,兼容多种数据库
关于Dapper的介绍,我想很多人都对它有一定的了解,这个类似一个轻型的ORM框架是目前应用非常火的一个东西,据说各方面的性能都不错,而且可以支持多种数据库,在开始介绍这个文章之前,我花了不少功夫来学 ...
- SQL 横转竖 、竖专横 (转载) 使用Dapper.Contrib 开发.net core程序,兼容多种数据库 C# 读取PDF多级书签 Json.net日期格式化设置 ASPNET 下载共享文件 ASPNET 文件批量下载 递归,循环,尾递归 利用IDisposable接口构建包含非托管资源对象 《.NET 进阶指南》读书笔记2------定义不可改变类型
SQL 横转竖 .竖专横 (转载) 普通行列转换 问题:假设有张学生成绩表(tb)如下: 姓名 课程 分数 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 ...
- Dapper.Contrib 开发.net core程序,兼容多种数据库
Dapper.Contrib 开发.net core程序,兼容多种数据库 https://www.cnblogs.com/wuhuacong/p/9952900.html 使用Dapper.Contr ...
- 微信小程序(八)-项目实例(原生框架 MINA转云开发)==03-云开发-数据库
云数据库 云数据库开发文档:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/database.html 1.新建云数据库( ...
- 报表引擎API开发入门— EJB程序数据源
我们前面讲了几个数据源,今天我们来讲一下EJB数据源,这篇讲完我们数据源这部分就讲完了.数据连接不需要直接访问数据库,而是使用EJB做为数据源.FR通过定义程序数据集使用EJB的相关类获取到EJB数据 ...
- iOS开发数据库篇—SQLite简单介绍
iOS开发数据库篇—SQLite简单介绍 一.离线缓存 在项目开发中,通常都需要对数据进行离线缓存的处理,如新闻数据的离线缓存等. 说明:离线缓存一般都是把数据保存到项目的沙盒中.有以下几种方式 (1 ...
- iOS开发数据库篇—SQL
iOS开发数据库篇—SQL 一.SQL语句 如果要在程序运行过程中操作数据库中的数据,那得先学会使用SQL语句 1.什么是SQL SQL(structured query language):结构化查 ...
- Android开发数据库三层应用-DataSnap
Android开发数据库三层应用-DataSnap http://www.2ccc.com/news/Html/?1517.html 核心提示:我觉得Delphi最强大的的功能之一就是开发数据库三层应 ...
- 【转】使用NetBeans和Eclipse开发PHP应用程序
[51CTO独家特稿]各位用户如果单独看NetBeans和Eclipse的市场占有率,你可能会认为使用其中任何一种IDE开发PHP应用程序都没有 问题,例如: 1.NetBeans:一款开源的集成开发 ...
随机推荐
- BZOJ 3878 【AHOI2014】 奇怪的计算器
题目链接:奇怪的计算器 如果没有溢出的话,所有的标记都可以在线段树上直接维护,所以一棵线段树就解决问题了. 现在有了溢出,怎么办呢? 发现就算溢出了,各个元素的相对大小关系也是不变的.所以,如果一开始 ...
- WARNING: Configuration 'compile' is obsolete and has been replaced with 'implementation' and 'api'.
点击报错信息中的app, 按照提示,修改compile 为 implementation 再次同步即可 结果
- Mysql 强行Kill 连接
BEGIN ; ; ; DO KILL @Temp; ; END WHILE ; END
- Python open操作文件
操作文件 # coding=utf-8 支持中文 """ China Japan France England """ f = open(& ...
- art-template
art-template 输出 标准语法 {{value}} {{data.key}} {{data['key']}} {{a ? b : c}} {{a || b}} {{a + b}} 原始语法 ...
- winfrom 动态添加控件,以及删除
private void btnadd_Click(object sender, EventArgs e) { int fileCount = 0; ...
- Python splinter 环境搭建
今天无意间看到了splinter. Splinter是一个使用Python开发的开源Web应用测试工具.它可以帮你实现自动浏览站点和与其进行交互. Splinter对已有的自动化工具(如:Seleni ...
- jq 折面板+tab切换(自己封装的插件哦!!)
如上图所示的一个折面板效果+tab切换:最重要的js代码如下: 对于布局简单介绍下: hot_wrap_li 这个是带箭头的横条: Arrow 这个是箭头的div:hot_wrap_li_wrap 这 ...
- spring cloud: zuul(四): 正则表达式匹配其他微服务(给其他微服务加版本号)
spring cloud: zuul(四): 正则表达式匹配其他微服务(给其他微服务加版本号) 比如我原来有,spring-boot-user微服务,后台进行迭代更新,另外其了一个微服务: sprin ...
- LeetCode--042--接雨水(java版)
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 ...