委托的使用(使用委托实现窗体互相操作)

      今天我们就来说说委托。首先什么是委托没呢,简单来说就是可以可以将一个方法当作参数可以传递的特殊类。我们来看一下百度百科对委托的定义:委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

  委托的定义与实例化。

  委托的定义语法如下:

    访问修饰符 delegate 返回值类型 委托名称(参数1, 参数1, 参数n);

   我们来看一个定义的实例。使用委托实现两个数的最大值

    首先定义一个委托,

delegate int Max(int one, int two);

    然后我们就开始实现

复制代码
 1  class Prpgram
 2     {
 3         public static int IntMax(int a, int b)
 4         {
 5             if (a > b)
 6             {
 7                 return a;
 8             }
 9             else
10             {
11                 return b;
12             }
13         }
14 
15         static void Main(string[] args)
16         {
17             Max max = new Max(IntMax);//这里实现了把函数IntMax()当作了参数来使用
18             int c = max(2, 3);
19             Console.Write("比较大的数是:" + c.ToString());
20 
21 
22         }
23     }
复制代码

  接下来我们就开始我们今天的主题了,使用委托实现窗体互相操作。

  需求分析:有两个窗体,班级信息维护和创建班级信息窗体,点击新增班级按钮出现创建班级信息页面,返回按钮返回班级信息维护页面。

  返回后班级信息维护页面进行一次刷新,添加的信息显示在dataGridView控件中。

  我们先建立一个解决方案添加班级信息项目。然后添加两个winform页面。页面的样式如下:

  

建立班级信息表

  

复制代码
1 CREATE TABLE [dbo].[ClassInf] (
2     [Id]        BIGINT        NOT NULL,
3     [ClassYear] INT           NOT NULL,
4     [ClassName] NVARCHAR (20) NOT NULL,
5     [ClassAbbr] NVARCHAR (20) NULL,
6     [Number]    INT           NOT NULL,
7     [Teacher]   NVARCHAR (50) NOT NULL,
8     PRIMARY KEY CLUSTERED ([Id] ASC)
9 );
复制代码

接着我们就要开始定义委托了。如下的是定义的委托和需要实现的功能。

复制代码
 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Data.SqlClient;
 6 using System.Text;
 7 using System.Threading.Tasks;
 8 using System.Windows.Forms;
 9 
10 namespace Delegate
11 {
12     //委托定义 添加委托列表窗体刷新数据 
13     public delegate void QueryStudentDelegate();
14     //这个页面是创建班级信息的实现代码。
15     public partial class Form1 : Form
16     {
17         //委托实例化
18         public QueryStudentDelegate queryDelegate;
19 
20         public Form1()
21         {
22             InitializeComponent();
23         }
24         string str = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=E:\C#\Delegate\Delegate\SchoolStu.mdf;Integrated Security=True";
25         public int addClass(long id, int classYear, string classname, string classabbr, int number, string teachername)
26         {
27             int i = 0;
28             try
29             {
30                 SqlConnection conn = new SqlConnection(str);
31                 string Sqlstr = string.Format("insert into ClassInf([Id],[ClassYear],[ClassName],[ClassAbbr],[Number],[Teacher])
                  values('{0}','{1}',N'{2}',N'{3}','{4}',N'{5}')
", //这里出现的N是因为添加信息的时候数据库对于中文不识别,N可以进行格式转换 32 id,classYear,classname,classabbr,number,teachername); 33 conn.Open(); 34 SqlCommand cmd = new SqlCommand(Sqlstr,conn); 35 i = (int)cmd.ExecuteNonQuery(); 36 conn.Close(); 37 38 } 39 catch(Exception e) 40 { 41 Console.WriteLine(e.Message); 42 } 43 finally 44 { 45 // 46 } 47 return i; 48 } 49 private void button1_Click(object sender, EventArgs e) 50 { 51 long stuId = Convert.ToInt64(textBox1.Text.Trim()); 52 int classYear = Convert.ToInt32(textBox2.Text.Trim()); 53 string name = textBox3.Text.Trim(); 54 string abbr = textBox4.Text.Trim(); 55 int num = Convert.ToInt32(textBox5.Text.Trim()); 56 string teacher = textBox6.Text.Trim(); 57 int iRet = addClass(stuId, classYear, name, abbr, num, teacher); 58 if (iRet > 0) 59 { 60 MessageBox.Show("插入数据成功!"); 61 } 62 else 63 { 64 MessageBox.Show("插入数据有误!"); 65 } 66 } 67 68 private void button2_Click(object sender, EventArgs e) 69 { 70 this.queryDelegate(); 71 this.Close(); 72 } 73 } 74 }
复制代码

第二个页面的功能代码如下:

复制代码
 1  //使用委托实现窗体互相操作
 2     public partial class FrmInf : Form
 3     {
 4         string str = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=E:\C#\Delegate\Delegate\SchoolStu.mdf;Integrated Security=True";
 5    
 6         public FrmInf()
 7         {
 8             InitializeComponent();
 9         }
10 
11         private void FrmInf_Load(object sender, EventArgs e)
12         {
13             GetClassInfo();
14             ClassDataBind();
15         }
16 
17         public DataSet GetClassInfo()
18         {
19             DataSet ds = new DataSet();
20             SqlConnection conn = new SqlConnection(str);
21             string sqlStr = "select [Id],[ClassYear],[ClassName],[ClassAbbr],[Number],[Teacher]from ClassInf ";
22             conn.Open();
23             SqlDataAdapter ad = new SqlDataAdapter(sqlStr, conn);
24             ad.Fill(ds);
25             return ds;
26         }
27 
28         public void ClassDataBind()
29         {
30             dataGridView1.DataSource = GetClassInfo().Tables[0];
31         }
32 
33         private void button1_Click(object sender, EventArgs e)
34         {
35             Form1 frmadd = new Form1();
36             frmadd.queryDelegate = ClassDataBind;
37             frmadd.Show();
38 
39         }
40     }
复制代码

所有的代码就是这样的,我能写的就是这些代码的实现,太过理论性的东西不是太会总结,有什么指正请贴在评论区,我会相继改进。

 

 

 

    

posted @   第八种格调的男人  阅读(222)  评论(0编辑  收藏  举报
编辑推荐:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示