云南爱因森软件职业学院继续教育学院网络技术系教师:张宗杰
1
C#程序设计
一、C#介绍
C#是微软公司发布的一种面向对象的、运行于.NETFramework之上的高级程序设计语言。
1995年,SUN公司正式推出了面向对象的开发语言Java,并提出了跨平台、跨语言的概
念后(writethecodeonceandrunitanywhere),Java就逐渐成为了企业级应用系统开发的首
选工具,而且使得越来越多的基于C/C++的应用开发人员转向了从事基于Java的应用开发。
Java的先进思想使其在软件开发领域大有山雨欲来风满楼之势。
很快,在众多研发人员的努力下,微软也推出了自己基于Java语言的编译器VisualJ++,
VisualJ++在最短的时间里由1.1版本升到了6.0版本。这决不仅仅是数字上的变化,集成在
VisualStudio6.0中的VisualJ++6.0的确有了质的变化,不但虚拟机(JVM)的运行速度大大
加快,而且增加了许多新特性,同时支持调用WindowsAPI,这些特性使得VisualJ++成为强
有力的Windows应用开发平台,并成为业界公认的优秀Java编译器。
不可否认,VisualJ++具有强大的开发功能,但其主要运用在Windows平台的系统开发中,
SUN公司认为VisualJ++违反了Java的许可协议,即违反了Java开发平台的中立性,因而,对
微软提出了诉讼,这使得微软处于极为被动的局面。
就在人们认为微软的局面不可能再有改观的时候,微软却另辟蹊径,决定推出其进军互
联网的的庞大计划——.NET计划,和该计划中旗帜性的开发语言——C#。
微软的.NET是一项非常庞大的计划,也是微软今后几年发展的战略核心,“在任何时间、
任何地点,采用相应的设备以获取所需的信息”的梦想并非一朝一夕能实现的。Visual
Studio.NET则是微软.NET的技术开发平台,其重要性可见一斑,而C#就集成在VisualStudio.NET
中。
需要提醒大家,脱离了.NET平台而单纯去讲C#是没有太大意义的,所以我们必须先了解
一些.NET平台开发的基础知识,才能更深入了解C#的特性。
.NET框架的核心是基于XML的跨平台跨语言的信息交换,基于此种平台将十分有助于我
们开发Internet分布式应用程序。
基于.NET的Web应用开发主要是使用ASP.NET,ASP.NET可以使用任何一种.NET支持的
语言编写,而其中C#可以提供脚本语言所无法提供的强大功能,使用C#编写ASP.NET的Web
应用程序在未来将成为Windows平台上Web开发的最佳选择。
了解了一些.NET平台开发的基础知识后,下面让我们再来结合.NET看看C#的一些绝技:
云南爱因森软件职业学院继续教育学院网络技术系教师:张宗杰
2
1、快速应用开发(RAD)功能
支持快速开发(Rapidapplicationdevelopment)可以说是目前开发语言最为重要的一大功
能,也正是C/C++的致命伤。网络时代应用系统的开发必须按照网络时代的速度来进行,支
持快速开发可以使得开发人员的开发效率倍增,从而使得他们可以从繁重的重复性劳动中解
放出来。
C#的RAD功能主要表现在例如垃圾收集、指代等众多特性上。垃圾收集机制将减轻开发
人员对内存的管理负担,而指代功能更是可以让开发者不经过内部类就调用函数。利用C#的
这些功能,可以使开发者通过较少的代码来实现更强大的应用程序,并且能够更好地避免错
误发生,从而缩短了应用系统的开发周期。
2、语言的自由性
用C#编写的程序能最大程度地和任何支持.NET的语言互相交换信息。能够继承和使用任
何语言所编写的程序可以称得上是知识的继承,这样做的好处是节省了大量的工作,你不必
把COBOL等语言强行改成另一种语言,.NET让各种语言真正地互相交流了。
C#和其他.NET语言有着最好的协作,这点对开发人员非常重要。全球从事编写软件的人
当中,大约有50%以VisualBasic作为基本的编程工具,在跨入.NET编程时代的时候,这些人
轻松地使用了.NET的VB开发Web上的应用程序,想想以后你可以和你的那些只懂VB的同
事真正在一起共同开发.NET的应用程序时,还有比这更让人轻松和高兴的事情吗?
3、强大的Web服务端组件
在C#的Web编程中,最让人兴奋的是Web服务端的组件,它们不仅包括传统组件,还
包括那些能够自动连接五花八门服务的可编程组件,你可以用C#编写自己的服务器端组件,
服务器端组件和标准的HTML提供的服务自然是不一样的,使用它们可以更自由、更容易地
进行数据绑定。不久,那些视频服务器组件也很快会出现,有了这些强大的组件,我们可以
设计出功能更加强劲的企业级分布式应用系统。
4、支持跨平台
随着互联网应用程序的应用越来越广,人们逐渐意识到由于网络系统错综复杂,使用的
硬件设备和软件系统各不相同,开发人员所设计的应用程序必须具有强大的跨平台性。C#编
写的应用程序就具有强大的跨平台性,这种跨平台性也包括了C#程序的客户端可以运行在不
同类型的客户端上,比如PDA、手机等非PC装置。
5、与XML的融合
云南爱因森软件职业学院继续教育学院网络技术系教师:张宗杰
3
由于XML技术真正融入到了.NET和C#之中,C#的编程变成了真正意义的网络编程,甚
至可以说.NET和C#是专为XML而设计,使用C#的程序员可以轻松用C#内含的类来使用XML
技术。就这方面而言,目前C#提供给了程序员更多的自由和更好的性能来使用XML。
6、对C++的继承
C#继承并保留了C++强大的功能,例如,C#保留了类型安全的检测和重载功能,C#还提
供了一些新功能取代了一些原来的ANSIC预处理程序的功能,提高了语言的类型安全等安全
性。
二、数据类型、表达式、变量
本节课将介绍c#语言的表达式,类型和变量。
C#定义变量的方法:数据类型变量名字
注意:定义的变量必须赋初值才能使用。
C#语言的简单类型包含布尔类型和三种数值类型:整型,浮点型和小数。
1、整数类型
类型占用的字节数范围
sbyte1-128~127
byte10~255
short2-32768~32767(也叫Int16)
ushort20~65535(也叫UInt16)
int4-2147483648~2147483648(也叫Int32)
uint40~4294967295(也叫UInt32)
long8-9223372036854775808~9223372036854775807(也叫Int64)
ulong80~18446744073709551615(也叫UInt64)
2、浮点数
类型精度
float7位(也叫Single)
double15~16位(也叫Double)
3、字符数据类型
云南爱因森软件职业学院继续教育学院网络技术系教师:张宗杰
4
char,一个字符变量在内存中占两个字节。
字符变量的定义形式如下:
charc1,c2;
可用下面语句对c1、c2赋值:
c1=’a’;
c2=’b’;
一些常用的C#字符操作方法
4、字符串
字符串是任何一个应用程序使用得最多的类型之一。字符串的值是由一对双引号括起来
的字符序列。
如:
strings1;//定义一个字符串变量s1
strings2="HelloWorld!";//定义一个字符串变量s2,并进行初始化
5、布尔类型
bool,值只有两个true和false。
如:
boolx=true;
booly=false;
云南爱因森软件职业学院继续教育学院网络技术系教师:张宗杰
5
三、顺序、选择、循环结构
1、顺序结构
按一定顺序解决问题、代码按顺序书写,程序按顺序执行,程序结构称为顺序结构。
如:(1)计算两个数的和。
步骤为:输入两个数,计算他们的和,输出他们的和。
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespacecha1
{
classProgram
{
staticvoidMain(string[]args)
{
inta,b,sum;
Console.WriteLine("请输入数字,按回车输入下一个");
a=Convert.ToInt32(Console.ReadLine());//将输入的字符转换成数字
b=Convert.ToInt32(Console.ReadLine());//将输入的字符转换成数字
sum=a+b;
//将数字转换成字符输出,两种方法
Console.WriteLine("计算的结果为:{0}",sum.ToString());
//Console.WriteLine("计算的结果为:{0}",Convert.ToString(sum));
//Console.WriteLine("{0}+{1}={2}",a.ToString(),b.ToString(),sum.ToString());
Console.Read();//起到暂停显示输出结果的作用
}
}
}
说明:
(1)C#中赋值用=,判断两个变量是否相等用==,加法用+,减法用-,除法用/,乘法用
,求余数用%,并且(and)用&&,或者(or)用||
云南爱因森软件职业学院继续教育学院网络技术系教师:张宗杰
6
2、选择结构
if…elseif…else
依据特定条件解决问题、根据条件编写相应的处理代码,程序根据条件选择执行相应的
代码,执行过程依据条件产生分支,这种程序的结构称为选择结构。
如:(1)分段函数求解
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespacech2
{
classProgram
{
staticvoidMain(string[]args)
{
intx,result;
Console.WriteLine("请输入一个数字并按回车:");
x=Convert.ToInt32(Console.ReadLine());
result=0;//给变量result赋初值,否则会检测不通过
if(x>0)
{
result=xx+1;
}
elseif(x==0)//C#中判断是否相等是用两个等号(SQLServer只用一个),一个等
号代表赋值
{
result=0;
}
elseif(x<0)
{
result=xx-1;
}
Console.WriteLine("计算后的结果是:{0}",result);
Console.Read();
}
云南爱因森软件职业学院继续教育学院网络技术系教师:张宗杰
7
}
}
3、循环结构
通过重复特定的操作步骤解决问题、程序执行过程中多次重复特定代码,该程序结构称
为顺序结构。
C#提供的循环语句包括for、while、do……while和foreach,这里只讲述for语句和while
语句,其他的请参考相关书籍。
如:(1)计算1+2+3+……+20
用for语句:
for(变量初始化;循环终止条件;变量的变化)
{
//循环体
}
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespacech3
{
classProgram
{
staticvoidMain(string[]args)
{
inti,sum;
sum=0;
for(i=1;i<=20;i++)
{
sum=sum+i;
}
Console.WriteLine("计算的结果是:{0}",sum);
Console.Read();
}
}
}
云南爱因森软件职业学院继续教育学院网络技术系教师:张宗杰
8
用while语句
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespacech3
{
classProgram
{
staticvoidMain(string[]args)
{
inti,sum;
sum=0;
i=1;
while(i<=20)
{
sum=sum+i;//(1)
i=i+1;//(2),(1)和(2)的顺序交换后结果不一样(注意顺序结构的使用方法)
}
Console.WriteLine("计算的结果是:{0}",sum);
Console.Read();
}
}
}
注:由于时间问题,数组在这里就不讲解了,感兴趣的同学请参考相关书籍。
四、方法(函数)
由于C#是面向对象的程序设计语言(请参考相关书籍学习面向对象的程序设计),所有
函数在C#中叫做方法。
定义方法的原因:重复使用同一个操作,而不用去重复写这个操作的代码。
方法的定义:
1、无返回值的
(1)publicvoid方法的名称()
(2)publicvoid方法的名称(数据类型变量名称)
(2)publicvoid方法的名称(数据类型变量名称,数据类型变量名称……)
2、有返回值的
云南爱因森软件职业学院继续教育学院网络技术系教师:张宗杰
9
(1)public要返回的数据类型方法的名称()
(2)public要返回的数据类型方法的名称(数据类型变量名称)
(2)public要返回的数据类型方法的名称(数据类型变量名称,数据类型变量名称……)
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespacech4
{
classProgram
{
//定义一个没有返回值并且没有参数的方法,实现从1加到10
publicvoidGetSum()
{
inti,sum;
sum=0;
for(i=1;i<11;i++)
{
sum=sum+i;
}
Console.WriteLine(sum.ToString());
}
//定义一个有返回值且没有参数的方法,实现从1加到11
publicintGetSum1()
{
inti,sum;
sum=0;
for(i=1;i<=11;i++)
{
sum=sum+i;
}
returnsum;//因为定义的sum是int型的,所以返回的数据类型必须是int的
}
//定义一个有返回值且有参数的方法,实现判断用户输入的两个数是否相等,相等返回true,
否则返回false
publicboolGetSum2(intx,inty)
{
boolresult;
result=false;
if(x==y)
{
result=true;
}
云南爱因森软件职业学院继续教育学院网络技术系教师:张宗杰
10
else
{
result=false;
}
returnresult;
}
staticvoidMain(string[]args)
{
Programps=newProgram();//通过类去调用定义的方法
intx,a,b;
boolresult;
Console.WriteLine("没有返回值的方法的值是:");
ps.GetSum();
Console.WriteLine("有返回值的方法的值是:");
x=ps.GetSum1();
Console.WriteLine(x.ToString());
Console.WriteLine("请输入两个数判断是否相等,按回车输入下一个数字:");
a=Convert.ToInt32(Console.ReadLine());
b=Convert.ToInt32(Console.ReadLine());
result=ps.GetSum2(a,b);
if(result==true)
{
Console.WriteLine("相等");
}
else
{
Console.WriteLine("不相等");
}
Console.Read();
}
}
}
五、常用控件介绍
任何控件都有属性、方法和事件。简单的说事件指单击或双击它会产生什么效果。在这
里只介绍常用的几个控件,其余控件的用法请参考相关书籍。
1、窗体
窗体常用的属性有Name,Text,Size,MaxiMizeBox,MiniMizeBox
其他属性在VisualStudio的属性面板中都能找到,并且有中文提示。
云南爱因森软件职业学院继续教育学院网络技术系教师:张宗杰
11
常用的方法有方法Close(),Hide(),Show()
常用的事件有Load()
实例:新建一个窗体,设置其名称为myFist并没有最大化按钮,并且标题栏显示“我的
第一个windows程序”,在该窗体启动时,自动弹出第二个新建的窗体。
注:由于篇幅和演示问题,请参考给出的该实例的代码和视频。
2、标签(Label)控件
该控件用于显示你要在窗体上显示的文本,常用的属性是Text和Name。
3、按钮(Button)控件
Button控件常用属性和事件如下:
属性Text事件Click
实例:设计如下图所示的窗体,单击某个按钮显示相应的颜色。
注:由于篇幅和演示问题,请参考给出的该实例的代码和视频。
4、文本框(TextBox)控件
常用属性和事件如下:
属性Text,MaxLength,ReadOnly,PasswordChar,MultiLine,ScrollBars,Name
事件TextChanged
实例:设计一个如下图所示的应用程序,实现计算用户输入的数字的和。
云南爱因森软件职业学院继续教育学院网络技术系教师:张宗杰
12
注:由于篇幅和演示问题,请参考给出的该实例的代码和视频。
5、单选按钮(RadioButton)控件
常用属性和事件如下:
属性Text,Checked
事件CheckedChanged,Click:
注:一个组内的单选按钮只能有一个被选中。
实例:设计一个如下图所示的应用程序,选择某个按钮后显示相应的颜色。
注:由于篇幅和演示问题,请参考给出的该实例的代码和视频。
6、多选框(CheckBox)控件
CheckBox控件常用属性和事件如下:
属性Text:多选框控件旁边的标题。
云南爱因森软件职业学院继续教育学院网络技术系教师:张宗杰
13
属性Checked:布尔变量,为true表示多选框被选中,为false不被选中。
事件Click:单击多选框控件时产生的事件。
事件CheckedChanged:多选框控件有被选中和不被选中两种状态,该事件是多选框状态
改变时产生的事件。
实例:设计一个如下图所示的应用程序,选择好后显示你的爱好。
注:由于篇幅和演示问题,请参考给出的该实例的代码和视频。
7、下拉列表组合框(ComboBox)控件
常用属性、事件和方法如下:
属性DropDownStyle,Items,MaxDropDownItems,Sorted,SelectedItem,SelectedIndex
事件SelectedIndexChanged
实例:设计一个如下图所示的应用程序,选择好后弹出对话框显示你的爱好。
注:由于篇幅和演示问题,请参考给出的该实例的代码和视频。
8、菜单
云南爱因森软件职业学院继续教育学院网络技术系教师:张宗杰
14
实例:设计一个应用程序,单击菜单中的某项,弹出对应的窗体。
注:由于篇幅和演示问题,请参考给出的该实例的代码和视频。
六、C#操作SQLServer
1、配置SQLServer的连接字符串
定义一个字符串的变量。
stringcon="server=(local);uid=sa;pwd=10086;database=爱因森";
/
server表示要连接的SQLServer服务器的名称或者IP地址
uid表示登录SQLServer的账户
pwd表示该账号的密码
database表示要连接的数据库
/
2、SqlConnection
要使用该类,必须添加如下的命名空间:
usingSystem.Data.SqlClient;
该类用于连接到SQLServer上,使用方法如下:
stringcon="server=(local);uid=sa;pwd=201215;database=爱因森";
SqlConnectionmycon=newSqlConnection(con);
mycon.Open();
3、SqlDataAdapter
该类一般与DataSet结合起来使用。必须添加如下两个命名空间:
usingSystem.Data.SqlClient;
云南爱因森软件职业学院继续教育学院网络技术系教师:张宗杰
15
usingSystem.Data;
实例1:把院系的信息绑定到下拉列表中(用到的下拉列表控件名称叫comboBox3)
publicvoidBindYX()
{
stringsql="selectfrom院系orderby编号desc";
stringcon="server=(local);uid=sa;pwd=201215;database=爱因森";
SqlConnectionmycon=newSqlConnection(con);
mycon.Open();
SqlDataAdaptermyda=newSqlDataAdapter(sql,mycon);
DataSetds=newDataSet();
myda.Fill(ds,"院系");
comboBox3.DisplayMember="院系名称";
comboBox3.ValueMember="编号";
comboBox3.DataSource=ds.Tables[0].DefaultView;
}
获取下拉列表中值的方法:
(1)获取编号comboBox3.SelectedValue.ToString()
(2)获取院系名称comboBox3.Text.ToString()
实例2:把职工的信息显示在界面上
显示数据用到DataGridView控件。(用到的数据显示控件名称叫dataGridView1)
publicvoidShowTeacher()
{
stringsql="selectfrom显示教师信息";//从视图中查找
云南爱因森软件职业学院继续教育学院网络技术系教师:张宗杰
16
stringcon="server=(local);uid=sa;pwd=201215;database=爱因森";
SqlConnectionmycon=newSqlConnection(con);
mycon.Open();
SqlDataAdaptermyda=newSqlDataAdapter(sql,mycon);
DataSetds=newDataSet();
myda.Fill(ds,"显示教师信息");
dataGridView1.DataSource=ds.Tables[0].DefaultView;
}
创建视图的代码如下:
createview显示教师信息(职工编号,姓名,性别,职称,职务,所在院系)
as
select教师.职工编号,教师.姓名,教师.性别,教师.职称,教师.职务,院系.院系名称
from教师,院系where院系.编号=教师.所属院系
4、SqlCommand
用于实现insert、delete和update操作。
要使用该类,必须添加如下的命名空间:
usingSystem.Data.SqlClient;
三者的操作一样,只是SQL语句不一样,在这里只做insert的讲解。
实例:添加职工信息,如下图所示
云南爱因森软件职业学院继续教育学院网络技术系教师:张宗杰
17
privatevoidbutton2_Click(objectsender,EventArgse)//添加按钮的操作
{
stringcon="server=(local);uid=sa;pwd=201215;database=爱因森";
stringtid=textBox1.Text.ToString().Trim();//获取用户输入的职工编号
stringtname=textBox2.Text.ToString().Trim();//获取用户输入的职工姓名
stringsex="";
stringzc=comboBox1.Text.ToString();//获取用户选择的职称
stringzw=comboBox2.Text.ToString();//获取用户选择的职务
stringyx=comboBox3.SelectedValue.ToString();//获取用户选择的院系
intyx_id=Convert.ToInt32(yx);//将用户选择的院系编号转换成数值型
intresult;
//获取用户选择的职工性别
if(radioButton1.Checked==true)
{
sex="男";
}
if(radioButton2.Checked==true)
{
sex="女";
}
stringsql="insertinto教师values(''"+tid+"'',''"+tname+"'',''"+sex
+"'',''"+zc+"'',''"+zw+"'',''"+yx_id+"'')";
if(tid.Length>0&&tname.Length>0)//判断职工编号和姓名是否输入了,大于0
表示有数据,否则表示文本框的值为空
云南爱因森软件职业学院继续教育学院网络技术系教师:张宗杰
18
{
SqlConnectionmycon=newSqlConnection(con);
mycon.Open();
SqlCommandcmd=newSqlCommand(sql,mycon);
result=cmd.ExecuteNonQuery();//接收SQLServer返回的受影响的行数
if(result>0)
{
MessageBox.Show("添加成功","信息提示",MessageBoxButtons.OK,
MessageBoxIcon.Information);}
else
{
MessageBox.Show("添加失败","信息提示",MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
else
{
MessageBox.Show("请输入职工编号或者职工姓名","信息提示",
MessageBoxButtons.OK,MessageBoxIcon.Warning);
}
}
说明:(1)用文本框.Length>0可判断该文本框是否为空。
(2)文本框.Focus()可将光标移到该文本框上。
5、SqlDataReader
从SQLServer中读取满足条件的行,一般与SqlCommand一起使用。
要使用该类,必须添加如下的命名空间:
usingSystem.Data.SqlClient;
实例:检测职工编号是否已经存在
云南爱因森软件职业学院继续教育学院网络技术系教师:张宗杰
19
privatevoidbutton1_Click(objectsender,EventArgse)
{
stringcon="server=(local);uid=sa;pwd=201215;database=爱因森";
stringtid=textBox1.Text.ToString().Trim();//获取用户输入的职工编号
stringsql="select职工编号from教师where职工编号=''"+tid+"''";
SqlConnectionmycon=newSqlConnection(con);
mycon.Open();
SqlCommandcmd=newSqlCommand(sql,mycon);
SqlDataReadermyread=cmd.ExecuteReader();
if(myread.Read())
{
MessageBox.Show("该职工编号已经存在了","信息提示",MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
else
{
MessageBox.Show("该职工编号不存在","信息提示",MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
}
到此,C#与SQLServer的操作基本完成了。其实C#与数据库的操作,就是上面所讲实
例的使用,只是不同的项目中处理事件的逻辑不一样,要考虑的因素很多,但基本的操作不
变。
上述实例中,还有很多的不完善之处,如没有处理与SQLServer连接异常的操作(可用
try?catch语句)。对软件开发感兴趣的同学,请自己参考相关书籍和资料自学吧。
|
|