C#WinForm基础编程

Posted teayear

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#WinForm基础编程相关的知识,希望对你有一定的参考价值。

C#WinForm基础编程

视频课:https://edu.51cto.com/course/20906.html

第一章:C#基础入门

单词:int, byte,short,long,float,double,char,boolean,string,date,form,console,write,writeLine,read,text,if,else,switch,name,parse

第一节:数据类型和变量

一、数据类型:

基本数据类型

int,byte,short,long

float,double

char

boolean

扩展数据类型

String,Date…所有定义的类型

Form1 f1=new Form1();

二、声明变量:

数据类型 变量名;int a;

数据类型 变量名=变量值; int a=9; String name=“张无忌”; “name”,“Form1”

字符串的值必须用双引号包裹:“ ”,注意无论什么变量一旦被双引号包裹,都将变成对应的字符串而失去原来的意义。

int a;
a = 8;
a = 78;
string b = "东方不败";
char c = 'n';
double num = 56.5;

bool d = true;
bool e = false;
int f;
f = a;
Console.WriteLine(a);
Console.Read();//仅仅是利用读取方法让程序暂停,能够看到窗口结果。
变量赋值:

​ int a=9;

​ int b=a;

是将变量a中的值9复制一份赋值给另一个变量b,变量a中仍然保留原来的值9;

变量命名:

首字母必须是字母、$、下划线_,后面可以跟字母、下划线、数字,不能有特殊字符(&%^#),语言的保留字不能用来命名变量,string ,int,if ,else,true,false,double。。。

第二节:运算符:

一、算术运算符:

  • / % + - * ++ –
f = a + num * 5;
int u = a % 5;
int a=9;
Console.WriteLine(a++);
Console.WriteLine(++a);

示例1: 4大碗面,8元一碗;2小碗面,5元一碗;3盘小菜,12每盘;问没人均摊多少?

int bigCount = 4, litCount = 2, caiCount = 3;
double bigPrice = 8, litPrice = 5, caiPrice = 12;
double sum = bigCount * bigPrice + litCount * litPrice + caiCount * caiPrice;
double avg = sum / (bigCount + litCount);
Console.WriteLine(avg);
Console.Read();

二、比较运算符

== > < >= <= !=

int a = 7,b=6;
bool test = a >= b;
Console.Write(test);
Console.Read();

C# 宿舍管理系统 https://edu.csdn.net/course/detail/27107

第二章:判断

第一节:if条件判断

if,switch

一、单个if-else

​ if(条件)

​ 代码功能

​ else

​ 另一种代码功能

示例1:输入一个学生成绩,如果大于等于90分,师傅说给你个武林秘籍,否则,面壁思过

Console.WriteLine("请输入令狐冲的Java成绩");
string sc = Console.ReadLine();//等待用户的窗口输入
double score = double.Parse(sc);//将字符串转化为double类型的值
if (score >= 90)

     Console.WriteLine("奖励《葵花宝典》");
else

     Console.WriteLine("面壁思过");

Console.ReadLine();
if(txt_num2.Text=="0")
	txt_result.Text="除数不能为0";

登录界面判断用户名和密码是否正确

string username = txt_username.Text;
String pass = txt_pass.Text;
if (username == "admin" && pass == "1234")

     //MessageBox.Show("用户名密码正确", "成功提示");
     FmMain fm=new FmMain();//创建主窗体
     fm.Show();//显示主窗体
     this.Hide();//让当前登录窗体隐藏

else

     MessageBox.Show("用户名或密码错误","提示");

退出系统:需要在主窗体的FormClosed事件中添加:Application.Exit();

二、多重if-else

语法:

if(条件1)

​ 语句1;

else if(条件2)

​ 语句2;

else

​ 语句3;

判断学生成绩的等级
Console.WriteLine("请输入令狐冲的Java成绩");
string sc = Console.ReadLine();
double score = double.Parse(sc);
if (score >= 90)

    Console.WriteLine("优秀");

else if(score>=75)

    Console.WriteLine("良好");
else if (score >= 60)

    Console.WriteLine("及格");
else

     Console.WriteLine("不及格");

Console.Read();
string str=txt_score.Text;
double score=double.Parse(str);
if(score>=90)
	lab_level.Text="优秀";
else if(score>=75)
	lab_level.Text="良好";
else if(score>=60)
	lab_level.Text="及格";
else
	lab_level.Text="不及格";

二元表达式:

变量=表达式?结果1:结果2;

int b = 9;
/* string a;
if (b > 7)

    a = "你好";
else

    a = "你渣";
*/
string a = b>7?"你好":"你渣";
Console.WriteLine(a);
Console.Read();

三、switch结构

语法:

switch(表达式)
	case 常量1:
		语句;
		break;
	case 常量2:
		语句;
		break;
	default
		语句

示例3:输入学生的考试名次,第一名:武林盟主,第二名:武当掌门,第三名:峨眉掌门,第四名:逐出师门

string mingci=txt_mingci.Text;
switch(mingci)
	case "第一名":
		MessageBox.Show("武林盟主","比赛结果");
		break;
	case "第二名":
		MessageBox.Show("武当掌门","比赛结果");
		break;
	case "第三名":
		MessageBox.Show("峨眉掌门","比赛结果");
		break;
	default:
		MessageBox.Show("逐出师门","比赛结果");
		break;

示例4:输入年份和月份,判断该月有多少天

Console.WriteLine("请输入年份");
int y=int.Parse(Console.ReadLine());
Console.WriteLine("请输入月份");
int m=int.Parse(Console.ReadLine());
switch(m)
	case 1:
	case 3:
	case 5:
	case 7:
	case 8:
	case 10:
	case 12:	
		Console.WriteLine("有31天","月天数计算");
		break;
	case 4:
	case 5:
	case 9:
	case 11:
		Console.WriteLine("有30天","月天数计算");
		break;
	case 2:
		if(y%4==0&&y%100!=0||y%400==0)
			Console.WriteLine("有29天","月天数计算");
		else
			Console.WriteLine("有28天","月天数计算");	
		
		break;
	default:
		Console.WriteLine("你输错了","警告");
		break;

四、强制类型转换:

int a=9;

double b=a;

double c=888.6;

int d=(int)c;//强制类型转换

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RwyEySc0-1672665634017)(assets\\1545207092425.png)]

string h=“123”;

//int n=(int)h;//不同类型之间不能进行强制转换

int n=int.Parse(h);

double n=double.Parse(h);

类型转换的流向图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KcFU3Q7J-1672665634019)(assets\\1545207180681.png)]

视频课:https://edu.csdn.net/course/detail/27107

第三章:循环

什么是循环?

条件:条件成立

循环的操作,

语法

while(条件)

​ 循环操作

第一节:while循环

示例1:从1加到100

 int i = 1,sum=0;
 while (i <= 100)
 
      sum += i;
      i++;
 
 Console.WriteLine(sum);
 Console.Read();

示例2:循环输入一组学生成绩,求总成绩,当输入成绩为-1时候停止输入。

double sum = 0,score = 0;
while (score != -1)

   Console.WriteLine("请输入学生成绩");
   String sco=Console.ReadLine();
   score = double.Parse(sco);
   if (score != -1)
   
       sum += score;
   

Console.WriteLine("学生总成绩是:"+sum);

示例2:循环输入一组学生成绩,求总成绩和平均成绩

double sum = 0,score = 0,i=0;
while (score != -1)

   Console.WriteLine("请输入学生成绩");
   String sco=Console.ReadLine();
   score = double.Parse(sco);
   if (score != -1)
   
       sum += score;
	   i++;
   

Console.WriteLine("学生总成绩是:"+sum);
Console.WriteLine("学生平均成绩是:"+sum/i);

第二节:do-while循环

语法:

do

​ 循环操作

while(条件);

示例3:节目彩排

 string ans = "";
 do
 
     Console.WriteLine("欧阳锋弹吉他");
     Console.WriteLine("岳不群跳街舞");
     Console.WriteLine("张无忌拉提琴");
     Console.WriteLine("小尼姑行不行?");
     ans = Console.ReadLine();
  while (ans == "不行");
 Console.WriteLine("彩排结束");

第三节:for循环

语法:

for(变量的初始化 ; 条件判断 ; 变量的变化)

​ 循环操作

示例4:从1+…+100

double sum = 0;
for(int i=1;i<=100;i++)

    sum += i;

Console.WriteLine("1+...+100="+sum);

示例5:实现以下效果

请输入一个数字:
6
0+6=6
1+5=6
2+4=6
3+3=6
4+2=6
5+1=6
6+0=6
Console.WriteLine("请输入一个数字");
int num = int.Parse(Console.ReadLine());
for(int i=0,j=num ;i<=num ; i++, j--)

    Console.WriteLine(i+"+"+j+"="+num);

第四节:continue和break

continue是继续进行下一次循环的意思,不管continue后面有多少语句都不再执行,而是回到循环条件,进行下一次循环。

示例:6:说数字游戏,输出1~100之间的数字,不能输出明7和暗7

for(int j = 1; j <= 100; j++)

    if (j % 10 == 7 || j / 10 == 7 || j % 7 == 0)
    
        continue;
    
    Console.Write(j+"\\t");

Console.ReadLine();

break是结束循环,调到循环结尾,执行之后的代码。

练习:

1、输出从1~100之间能被3整除的数

2、输出从1~100之间的素数

3、输出9*9乘法表

5、猜数游戏,随机给出一个1~100之间的数,给5次机会,每次猜数后给出提示:大了还是小了,猜对后输出成功。获得随机数:

Random rand=new Random(); rand.Next(1,100);

6.编写程序,输出10000—30000中能同时被3、5、7、23整除的数及个数。

7.编写程序,求100—999中的“水仙花”数(也叫阿姆斯特朗数)及个数。(注:若3个数其各个位数字立方和等于该数本身,即为水仙花数,如153=1+125+27,则153是一个“水仙花”数。)

8.编写程序,求2—999中的同构数(也叫自守数)及其个数。(正整数n若是它平方数的尾部,则称n为同构数。例如:5的平方数是25,且5出现在25的右侧,那么5就是一个同构数。)

9.输出1—999中能被3整除且至少有位数字是5的所有整数及其个数。

10.从键盘输入两个正整数m和n,找出它们的最小公倍数。

11.输出Fibonacci数列1,1,2,3,5,8,13,…中前32项的值。

作业:讲解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6A7Ned7G-1672665634020)(E:\\政通路\\课堂笔记\\S1\\C#课堂笔记\\assets\\image-20200905091805558.png)]

思路:

不要背代码,第一步:观察九九乘法表有9行;有9列;

第一步能不能把九九乘法表的问题,给分解成先输出9行;

第四章:数组

定义:一组连续的内存空间,保存一组同类型的数据,数组有编号(下标)

第一节:数组的声明和遍历

数据类型[] 数组名称=new 数据类型[5];

数据类型[] 数组名称=new 数据类型[5]数组的元素;

一、数组的声明和遍历

示例1:

int[] arr=new int[6];
string[] names=new string[4]"王重阳","李逵","张无忌","张三丰";
arr[0] = 6;
// arr[6] = 88;     数组下标越界
//arr[2]="令狐冲";   整型数组只能装整型值
//Console.WriteLine(names[5]);    数组下标越界
//names.Length 数组长度属性:Length
for(int i = 0; i < names.Length; i++)   //遍历数组中的每一个元素

      Console.WriteLine(names[i]);

数组一旦创建完毕,它的长度是不能改变的,数组的下标从0开始。最大下标是数组的长度减一。

二、数组的比较大小

示例:2:求学生成绩的最高分(最低分、平均分)

double[] scores = new double[]  89, 58, 99, 100, 110, 66, 95, 78, 45.6, 98.6, 88 ;
double max = scores[0]; //让数组的第一个元素站到擂台上
for (int i = 1; i < scores.Length; i++)

    if (scores[i] > max)//将数组中后面的元素依次和擂台上的数进行比较,
    
        max = scores[i];//比擂台上数字大的站到擂台上
    

Console.WriteLine("学生的最高成绩是:"+max);

三、查找数组中的元素

示例3:查找指定的数值在数组中的位置

int[] arr = new int[] 4,6,8,9,2,11,33,46 ;
Console.WriteLine("请输入要查找的数");
string str=Console.ReadLine();
int num = int.Parse(str);
int index = -1;
for(int i = 0; i < arr.Length; i++)

    if (num == arr[i])
    
        index = i;
        break;
    

if (index != -1)

    Console.WriteLine("你要找的数字"+num+"在下标为"+index+"的位置");
else

    Console.WriteLine("没有找到你要的数"+num);

四、数组的删除

示例4:从数组中删除给出的数字

int[] arr = new int[] 8,6,9,5,73,11,56,87 ;
Console.WriteLine("请输入你要删除的元素");
int num = int.Parse(Console.ReadLine());
int index = -1;
for(int i = 0; i < arr.Length; i++)

    if (num == arr[i])//查找要删除的元素
    
        index = i;
        break;
    

if (index != -1)

    for(int j = index; j < arr.Length-1; j++)//注意j是要小于arr.length-1;
    
        arr[j] = arr[j + 1];//将从删除位置开始的数组元素依次前移
    
    arr[arr.Length - 1] = 0;//将数组最后一个元素置成0
else

    Console.WriteLine("没有你要删除的元素");

 ///
for(int i = 0; i < arr.Length; i++)

    Console.Write(arr[i]+"\\t");

示例5:在顺序数组中插入一个数,要求插入后仍然保持数组的升序排列。

int[] arr = new int[]  10, 20, 30, 40, 50, 60 ,0;
Console.WriteLine("请输入要插入的数字");
int num = int.Parse(Console.ReadLine());
int index = arr.Length-1 ;
for(int i = 0; i < arr.Length; i++)

    if (arr[i] > num)
    
         index = i;
         break;
    

for(int j = arr.Length - 2; j >= index; j--)

   arr[j + 1] = arr[j];

arr[index] = num;
for (int i = 0; i < arr.Length; i++)

    Console.Write(arr[i] + "\\t");

视频课:https://edu.51cto.com/course/20906.html

第五章:类和对象

什么是对象

描述一个对象:

姓名:欧阳锋

性别:男

家住:深圳

。。。。属性;

弹吉他;

跳街舞;

。。。。能力

欧阳锋外传——封装

对象:是组成世界万物的具体个体
类:是有相同特点的个体的抽象概念

第一节:创建类和对象

创建类:
class Person

    public string name;
    public string sex;
    public int age;
    public void intro()
    
        Console.WriteLine("我是:"+name+"性别:"+sex+",今年"+age+"岁了");
    

创建对象:
Person p = new Person();
p.name = "令狐冲";
p.sex = "男";
p.age = 8;
Console.WriteLine(p.name);
p.intro();

在图形界面造人

string name = txtName.Text;
string sex = txtSex.Text;
int age = int.Parse(txtAge.Text);
Person per = new Person();
per.name = name;
per.sex = sex;
per.age = age;
per.intro();
构造方法:

构造方法是创建该类对象的方法,如果类中没有构造方法,系统会给一个默认(无参数)的构造方法

构造方法的结构是:public 类名()

一个类中一般需要有两个构造方法,一个是空参数(默认)的构造方法,一个是带参数的构造方法。

   public Person()  

   public Person(string name, string sex, int age)
   
       this.name = name;//this代表当前类的对象
       this.sex = sex;
       this.age = age;
   
 Person p = new Person("张无忌","男",12);
 Console.WriteLine(p.name);
 p.intro();

第二节:定义一般方法

方法的种类

方法分类:

一、无参数无返回值
 public void intro()
 
       Console.WriteLine("我是:"+name+"性别:"+sex+",今年"+age+"岁了");
 
二、有参数无返回值
public void playGame(int level)

    if (level > 10)
    
        Console.WriteLine("打败boss");
    else
    
        Console.WriteLine("game over");
      

三、无参数有返回值
public int getRandom()

     Random ran = new Random();
     return ran.Next(0,100);            

调用:

 Student stu = new Student("王宗月","男",20);
 stu.intro();
 stu.playGame(50);
 int num=stu.getRandom();
 Console.WriteLine("随机数是:"+num);
 Console.Read();
四、有参数有返回值
public double plus(double num1,double num2)

    return num1 + num2;

方法调用:

 Person per = new Person();
 double n1 = double.Parse(txtNum1.Text);
 double n2 = double.Parse(txtNum2.Text);
 double result=per.plus(n1,n2);
 MessageBox.Show(""+result,"计算结果是:");

五、类的完整代码:

class Person

    public string name;
    public string sex;
    public int age;
    public void intro()//无参数无返回值
    
        Console.WriteLine("我是:"+name+"性别:"+sex+",今年"+age+"岁了");
    

    public void playGame(int level)//无参数有返回值
    
        if (level > 10)
        
            Console.WriteLine("打败boss");
        else
        
            Console.WriteLine("game over");
          

    

    public double plus(double num1,double num2)//有参数有返回值
    
        return num1 + num2;
    

    public string say()//无参数有返回值
    
        return "欢迎你来到我家";
    

    public Person() //默认构造方法

    public Person(string name, string sex, int age)//带参数的构造方法
    
        this.name = name;
        this.sex = sex;
        this.age = age;
    

练习:1)编写狗类的代码并创建对象进行测试;2)编写手机类代码并测试;

class Dog

   	public string name;
	public string sex;
	public int age;
	public string color;

    public Dog()  
    public Dog(string name,string sex,int age,string color)
    
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.color = color;
    

    public void eat(string food)
    
        Console.WriteLine("狗狗"+name+"在吃"+food);
    

    public string seeDoor(string who)
    
        if (who == "生人")
        
            return "旺旺";
        
        else
        
            return "摇尾巴";
        
    

测试代码:

Dog dog = new Dog("花花","母",2,"白色");
dog.eat("肉骨头");
string res=dog.seeDoor("生人");
Console.WriteLine(res);

电话的类代码:

class Phone

	public string brand;
    public double price;
    public string type;
    public Phone()  
    public Phone(string brand,double price,string type)
    
        this.brand = brand;
        this.price = price;
        this.type = type;
    
	public void listenMusic()
    
        Console.WriteLine(brand+type+"手机在播放音乐");
    

    public double comp(double num1,double num2,string opt)
    
        if (opt == "+") return num1 + num2;
        if (opt == "-") return num1 - num2;
        if (opt == "*") return num1 * num2;
        if (opt == "/") return num1 / num2;
        return 0;
    

    public void call(string phoneCode)
    
        Console.WriteLine("给"+phoneCode+"号码打电话");
    

    public string reportTime()
    
        return DateTime.Now.ToString();
    

手机测试代码:

Phone p = new Phone("华为",4560,"荣耀T-5");
p.listenMusic();
Console.WriteLine(p.reportTime());
p.call("13526985241");
Console.WriteLine(p.comp(6.5,5.9,"*"));

第三节:系统常用类ArrayList (集合)

        ArrayList list = new ArrayList();
        list.Add(new Person("任我行", "男", 58));//向集合中添加元素
        list.Add(new Person("任盈盈", "女", 18));
        list.Add(new Person("令狐冲", "男", 18));
        list.Add(new Person("东方不败", "不男不女", 18));
        list.Add(new Person("岳不群", "不男不女", 48));
		Console.writeLine(list.Count);//打印集合中元素的数量
        list.RemoveAt(3);//删除索引位置为3 的元素
        list.Insert(2,new Person("鹿晗","女",23));//在指定索引位置插入元素
        
        foreach (Person per in list)
        
            Console.WriteLine(per.name+":"+per.sex+":"+per.age);
        
        list.Clear();//清空集合中所有的元素

第四节:ListBox和combobox控件的使用

两者都有集合items属性,是用来装内容的,其本质是ArrayList集合,添加ListBox组件将items添加名字等字符串,实现如下效果,点击按钮将ListBox中的所有项添加到comboBox中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Eoxh0ier-1672665634021)(assets\\1547022928672.png)]

1、单个添加的代码

欢迎按钮代码:

string name = txtName.Text;
MessageBox.Show("欢迎你:"+name,"提示");

将文本框内容单个添加到LIstBox中的按钮的代码:

string name = txtName.Text;
listNames.Items.Add(name);
txtName.Text = "";

将ListBox中内容单个添加到comboBox中的代码:

string name = (string)listNames.SelectedItem;
cobName.Items.Add(name);
cobName.SelectedIndex = 0;
listNames.Items.RemoveAt(listNames.SelectedIndex);
2、将ListBox中选中的所有项一起移动到comboBox中的代码
foreach(string item in list.Items)//将ListBox集合中所有的元素遍历

    cob.Items.Add(item);//将遍历的每一个集合元素添加到comboBox集合中

cob.SelectedIndex = 0;//让comboBox集合中默认选中第一个元素
list.Items.Clear();//清空ListBox集合中所有元素

改变ListBox中的selectionMode属性为multiSimple让ListBox中的选项可以多选。

foreach(string sel in list.SelectedItems)//遍历ListBox中选中元素的集合

    cob.Items.Add(sel);//将选中元素添加到comboBox中

cob.SelectedIndex = 0;
while (list.SelectedItems.Count > 0)

    list.Items.Remove(list.SelectedItems[0]);//从ListBox大集合Items中删除选中集合中的每一个元素,因为删除后集合会自动前移,所以只需要删除第一个元素即可。

第三节:类的静态属性和方法—static

Person per=new Person();

per.intro();

类的属性或方法一旦定义了静态:static,该变量就不能被实例对象访问,只能通过类名直接访问。

示例1:

    class Student
    
        public string name;
        public string sex;
        public int age;
        public static string className;
    public Student(string name,string sex,int age)
    
        this.name = name;
        this.sex = sex;
        this.age = age;
    

    public void intro()
    
        Console.WriteLine("我是:"+name+",性别"+sex+",今年"+age+"岁"+"在"+className);
    

    public static void testc()
    
        Console.WriteLine("nihao helloworld");
    

调用的时候

        Student stu3 = new Student("周钦荣", "男", 20);
        //stu3.className = "java2班";//这样调用是不行的
        Student.className="java3班";
        Student.testc();
类的ToString()方法:
override
public string ToString()

     return "我是:"+name + ":性别" + sex + ":年龄" + age;

控制台输出:窗体程序需要在项目中右键—【属性】—【输出类型】—【控制台应用程序】

string name = txtName.Text;
int age = int.Parse(txtAge.Text);
string sex = radMan.Checked ? "男" : "女";
Person per = new Person(name, sex, age);
Console.WriteLine(per);

第六章:winform界面

第一节:名词解释

partial:部分的,指目前创建的类为部分类,只有当两个partial类合在一起才能起到应有的作用:

Form:窗体类,其中Form1 : Form是继承的意思

第二节:窗体的属性

name : btn_plus,txt_num1

text: 界面上显示的文本

backgroundimage: 添加背景图片

FormBorderStyle: FixedSingler,定义边界可否改变

maxinimizeBox: 最大化按钮

StartPosition:窗体起始位置

WindowState:窗体初始化的状态,最小化、一般状态、最大化状态

获得文本框的值:txt_num1.Text

转换成数字:int.Parse(txt_num1.Text);double.Parse(txt_num1.Text)

第三节:窗体的事件

click;load;FormClosing; keyDown;

第四节:常用控件

Button

TextBox

RadioButton

DateTimePicker

dateTimePicker1.Value = DateTime.Parse(“2010-10-29”);

Panel布局面板,Dock属性

三元表达式:

变量=表达式?第一个值:第二个值;

 /*if (radMan.Checked == true)
 
      sex = "男";
 
 else
 
      sex = "女";
 */
  //string sex = radMan.Checked?"男":"女";
 MessageBox.Show(radMan.Checked ? "男":"女");

Timer和PictureBox

示例:实现Tomcat动画,原理就是在PictureBox中每间隔100毫秒加载一次图片,让图片框中显示动画效果。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8odOs8i3-1672665634025)(assets\\1551430051109.png)]

代码:

private void btn_start_Click(object sender, EventArgs e)

     timer1.Start();

int count = 0;
private void timer1_Tick(object sender, EventArgs e)

    picbox.Image = Image.FromFile("angry/angry_"+count+".jpg");//获得文件中的图片
    count++;
    if (count > 25)
    
        count = 0;
    

private void button1_Click(object sender, EventArgs e)

    timer1.Stop();

第五节:消息对话框

MessageBox.Show(“内容信息”,“标题”,MessageBoxButton.YesNo,MessageBoxIcon.Question);

MessageBox的返回值:DialogResult.OK;Cancel;Yes;No

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qd2yx96N-1672665634027)(assets\\1551421875230.png)]

  DialogResult res= MessageBox.Show("你真的要退出程序么?","提示", 
  								MessageBoxButtons.YesNo,MessageBoxIcon.Question);
  if (res == DialogResult.Yes)
  
      e.Cancel = false;
  
  else
  
      e.Cancel = true;
  

第五节:菜单

1、固定菜单:MenuStrip

2、右键菜单:ContextMenuStrip

第四节:界面传值

要打开的窗体代码

public partial class Form2 : Form

    public string name;//在要打开的页面中声明一个共有的变量用来接收数据
    public Form2()
    
        InitializeComponent();
    

    private void Form2_Load(object sender, EventArgs e)//窗体加载事件
    
        labName.Text = name;//将接收到的数据在labName标签上显示
    

第一个窗体中打开第二个窗体的代码

Form2 form = new Form2();
form.name = txtName.Text;//将本窗体文本框的文本值赋值给要打开窗体的共有属性name
form.Show();

第五节:运行指定窗体

测试或练习时经常要直接运行某一个窗体,如果从菜单处一级级打开太麻烦,可以直接修改主程序代码来完成。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YqSQJcOv-1672665634028)(assets\\1551419630842.png)]

修改Main中最后一句代码:Application.Run(new Form1());将Run()中的窗体换成要运行的窗体就可以了。

第六节:主从窗体

主窗体的isMdiContainer属性设置成true,在打开子窗体的代码中,设置子窗体的MdiParent=this;

Form2 fm = new Form2();
fm.Show();
fm.MdiParent = this;

视频课:https://edu.51cto.com/course/20906.html

第七章:连接数据库

第一节:ADO.NET的结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H8KIEpxy-1672665634030)(assets\\1551491971415.png)]

数据库访问的顺序:

1)建立数据库连接

2)打开数据库连接

3)编写SQL语句

4)创建SQL命令对象SQLCommand

5)执行SQL命令

6)关闭数据库连接

示例1:添加班级信息

string constr="server=localhost;userid=root;password=root; database=school";
mysqlConnection conn = new MySqlConnection(constr);//创建数据库连接对象
conn.Open();//打开连接对象
string className = txtClassName.Text;
string createDate = txtCreateDate.Text;
string sql =string.Format("insert into classes(className,createDate) values('0','1')",className,createDate);
MySqlCommand command = new MySqlCommand(sql,conn);//根据sql命令和数据库连接创建数据库命令对象
int count=command.ExecuteNonQuery();//执行数据库的非查询命令
if (count > 0)//如果返回值(影响的行数)大于0,提示录入成功

    MessageBox.Show("班级录入成功");

conn.Close();//关闭数据库连接

第二节:DataSet结构

1)数据集合的作用:是在内存中建立起一个临时的数据仓库,可以对其进行操作并同步到底层数据库。

2)数据集结构:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oVU4eVax-1672665634032)(assets\\1551507101167.png)]

3)使用DataTable

有行和列的集合:Columns和Rows,

Rows就是查询获得的数据表中的每一行数据集合,集合就可以通过索引或下标访问,例如:通过Rows【1】【“班级名称” 】获得该数据,

Columns是表格中列的集合,通过Columns【“身份证号码”】来获得指定的列对象

4)DataGridView

常用属性:

DataSource:数据源,可以设置某一个DataTable即可

SelectionMode:是表格的选择模式,一般选择FullRowSelect

MultiSelect:是否可以多选

ReadOnly:是否只读

添加该控件后顺手把它的这几个选项如图选定,一般不在表格中进行添加和修改操作。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rR0T4U3K-1672665634033)(assets\\1551505590554.png)]

示例2:数据查询

查询使用数据适配器MySQLDataAdapter,用法和MySqlCommand相同,该适配器可以填充一个内存中的表格DataTable对象,然后让dataGradView的数据源(DataSource)指向该表格。

string connstr = "server=localhost;userid=root;password=root; database=school";
MySqlConnection conn = new MySqlConnection(connstr);
string sql ="select buildId 宿舍楼编号,buildName 宿舍楼名称 from building ";//查询宿舍楼的所有信息
MySqlDataAdapter adapter = new MySqlDataAdapter(sql,conn);//创建数据适配器
DataTable dt = new DataTable();//创建内存中数据表格
adapter.Fill(dt);//使用适配器将查询后的数据填充到内存的数据表中
dgvBuild.DataSource = dt;//将dataGradView的数据源指向内存中的数据表

示例3:数据库通用代码

class DBHelper

   public static string constr = "server=localhost;user id=root; password=root; database=school";
   public static MySqlConnection getConnection()
   
       MySqlConnection conn = new MySqlConnection(constr);
       conn.Open();
       return conn;
   

   public static void close(MySqlConnection conn)
    
        if (conn != null)
        
            conn.Close();
            conn = null;
        
    

    public static int update(string sql)
    
        MySqlConnection conn = getConnection();        
        MySqlCommand command = new MySqlCommand(sql, conn);
        int count = command.ExecuteNonQuery();
        conn.Close();
        return count;
    

    public static DataTable query(string sql)
    
        MySqlConnection conn = getConnection();                 
        DataTable dt = new DataTable();
        MySqlDataAdapter adapter = new MySqlDataAdapter(sql,conn);
        adapter.Fill(dt);
        return dt;
    

示例3:使用通用类的方法完成添加和查询

string className = txtClassName.Text;
string createDate = dtpCreateClasses.Text;
string sql = string.Format()"insert into classes(className,createDate) values('0','1')",className,createDate);
DBHelper.update(sql);
sql = "select classId 班级编号,className 班级名称,createDate 开班日期 from classes order by classId desc";
DataTable dt = DBHelper.query(sql);
dgvClass.DataSource = dt;

示例4:使用通用方法完成向comboBox中添加班级信息

string sql = "select classId,className from classes";
DataTable dt = DBHelper.query(sql);
//MessageBox.Show(dt.Rows[0]["className"].ToString()); 
foreach(DataRow row in dt.Rows)
//rows是dataTable的行的集合,可以通过下标来访问	
     combDormType.Items.Add(row["className"].ToString());
//某一行中有sql中查询的字段信息可以通过dt.Rows[i]["字段名"]来访问
combDormType.SelectedIndex = 0;//设置下拉框默认选中第一个选项

示例5:将班级对象加入到comboBox中

创建Classes类

class Classes

    public int classId;
    public string className;

    public Classes(int classId,string className)
    
        this.classId = classId;
        this.className = className;
    
    public Classes()  

    override//表示该方法是覆盖父类的方法,用来显示该类的对象
    public string ToString()
    
        return className;
    

示例6:改造加入comboBox的代码,将classes对象加入到comboBox中

DataTable dt = DBHelper.query("select * from classes");
foreach(DataRow row in dt.Rows)

    Classes cla = new Classes((int)row[0],row[1].ToString());
    combClass.Items.Add(cla);//将classes对象放入到组合框中

combClass.SelectedIndex = 0;

示例7:测试comboBox中选中的对象的classId和className 数据,在comboBox的selectedIndexChange事件中执行如下代码:

Classes cla = (Classes)combDormType.SelectedItem;
MessageBox.Show(cla.classId+":"+cla.className);

视频课:https://edu.51cto.com/course/20906.html

第八章:数据修改

数据修改不能直接像录入一样在界面填入数据,只能先查询出数据,选定某条数据后点击修改按钮,将该条数据显示在一个类似于录入界面的窗体中再进行修改,修改过的数据再点击确定最后修改到数据库,需要的话再刷新查询数据。

一、查询出班级数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-95yqwsiF-1672665634034)(assets\\1545980685501.png)]

二、点击修改按钮、创建修改窗体

示例 1:

string classId = dgvClass.SelectedRows[0].Cells[0].Value.ToString();//获得表格中选中的第一行的第一个单元的值,付给classId;
FmClassUpdate fcu = new FmClassUpdate();
fcu.classId = classId;//给FMClassUpdate窗体中的classId属性赋值
fcu.ShowDialog();//以模态窗体的形式显示修改窗体
fcu.MdiParent = this.MdiParent;//将修改窗体的父窗体设置为主窗体

三 、在修改窗体的load事件中根据传进来的classId查询班级信息,并将班级信息填入相应的组件中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mu3h6TYX-1672665634035)(assets\\1545980731301.png)]

string sql = "select className,createDate from classes where classId="+classId;
DataTable dt = DBHelper.query(sql);
txtClassName.Text= dt.Rows[0]["className"].ToString();//给文本框赋值成查询的班级名称
dtpClassDate.Value =(DateTime)dt.Rows[0]["createDate"];

四、在修改窗体中点击修改按钮

string sql = string.Format("update classes set className='0', createDate='1'  where classId=2",txtClassName.Text,dtpClassDate.Text , classId);
int count = DBHelper.update(sql);
if (count > 0)

    Close();
else

    MessageBox.Show("修改错误","提示");

五、学生入住

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U0g24v1P-1672665634036)(assets\\1545980598202.png)]

界面中按照班级查询出要入住的学生,在左侧选定要进入的宿舍,选定入住的学生(多选)点击入住完成操作,如果选中的人数大于可以入住的空位,则要提示人数太多,

//获得左边选中宿舍的编号,注意宿舍编号列是隐藏的在第一位cells[0]
string dormId = dgvDorm.SelectedRows[0].Cells[0].Value.ToString() ;
string stuId = "";
string sql = "";
//获得目前该宿舍中已经入住的人数,以便判断选中的学生人数是否超过该宿舍的额定人数
sql = "select count(*) dormCount from student where fk_dormId="+dormId;
DataTable dtCount = DBHelper.query(sql);
//Console.WriteLine(dtCount.Rows[0]);
int dormCount =int.Parse( dtCount.Rows[0].ToString());
//查询该宿舍最多能住的人数
sql = "select perCount from dorm,dormType where  fk_dormTypeId=typeId and dormId="+dormId;
DataTable dtPerCount = DBHelper.query(sql);
int perCount = (int)dtPerCount.Rows[0];
if (perCount - dormCount >= dgvStudent.SelectedRows.Count)

     for(int i = 0; i < dgvStudent.SelectedRows.Count; i++)
     //将选中的学生逐个加入到选定的宿舍(修改学生的宿舍外键为该宿舍的)
           stuId = dgvStudent.SelectedRows[i].Cells["编号"].Value.ToString();
           sql = string.Format("update student set fk_dormId=0 where stuId=1",dormId,stuId);
           DBHelper.update(sql);
      
      //将该宿舍中已经有的学生显示到dgvDormStudent表格中
      sql = "select stuId 学生编号,stuName 学生姓名 from student where fk_dormId="+dormId;
      DataTable dt = DBHelper.query(sql);
      dgvDormStudent.DataSource = dt;
      btnStuQuery_Click(sender, e);//调用学生查询按钮的方法
else

      MessageBox.Show("宿舍住不下这么多人,请重新选择!","提示");

学生按条件查询,如果没有输入条件则按照所有的查询

public void queryStudent()

    string sql = "select stuId, stuName 姓名,student.sex 性别,idcard 身份证,telPhone 电话,city 城市,className 班级,dormName 宿舍 from student join classes on classId=fk_classId left join dorm on fk_dormId=dormId";
    if (txtName.Text != "")
    
         sql += string.Format(" and stuName like '%0%'", txtName.Text);
    
    if (txtClassName.Text != "")
    
         sql += string.Format(" and className like '%0%'", txtClassName.Text);
    
    if (txtCity.Text != "")
    
         sql += string.Format(" and city = '0'", txtCity.Text);
    
    dgvStudent.DataSource = DBHelper.query(sql);
    dgvStudent.Columns["身份证"].Width = 200;//让身份证那一列宽度加大
    dgvStudent.Columns["stuId"].Visible = false;//让学生编号列隐藏

if (perCount - dormCount >= dgvStudent.SelectedRows.Count)

for(int i = 0; i < dgvStudent.SelectedRows.Count; i++)
//将选中的学生逐个加入到选定的宿舍(修改学生的宿舍外键为该宿舍的)
stuId = dgvStudent.SelectedRows[i].Cells[“编号”].Value.ToString();
sql = string.Format(“update student set fk_dormId=0 where stuId=1”,dormId,stuId);
DBHelper.update(sql);

//将该宿舍中已经有的学生显示到dgvDormStudent表格中
sql = “select stuId 学生编号,stuName 学生姓名 from student where fk_dormId=”+dormId;
DataTable dt = DBHelper.query(sql);
dgvDormStudent.DataSource = dt;
btnStuQuery_Click(sender, e);//调用学生查询按钮的方法
else

MessageBox.Show(“宿舍住不下这么多人,请重新选择!”,“提示”);

学生按条件查询,如果没有输入条件则按照所有的查询

public void queryStudent()

    string sql = "select stuId, stuName 姓名,student.sex 性别,idcard 身份证,telPhone 电话,city 城市,className 班级,dormName 宿舍 from student join classes on classId=fk_classId left join dorm on fk_dormId=dormId";
    if (txtName.Text != "")
    
         sql += string.Format(" and stuName like '%0%'", txtName.Text);
    
    if (txtClassName.Text != "")
    
         sql += string.Format(" and className like '%0%'", txtClassName.Text);
    
    if (txtCity.Text != "")
    
         sql += string.Format(" and city = '0'", txtCity.Text);
    
    dgvStudent.DataSource = DBHelper.query(sql);
    dgvStudent.Columns["身份证"].Width = 200;//让身份证那一列宽度加大
    dgvStudent.Columns["stuId"].Visible = false;//让学生编号列隐藏

以上是关于C#WinForm基础编程的主要内容,如果未能解决你的问题,请参考以下文章

C# winform dataGridView 里下拉列表,用写代码的方式绑定数据,班级一列要显示为下拉列表

暑假零基础C++编程第二期免费班来啦,快来报名吧~

小型学生报道管理系统总结

用C语言编写宿舍管理查询系统

c语言设计,编程实现学生基本信息管理程序

WinForm基础