委托的使用(使用委托实现窗体互相操作)
今天我们就来说说委托。首先什么是委托没呢,简单来说就是可以可以将一个方法当作参数可以传递的特殊类。我们来看一下百度百科对委托的定义:委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用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 }
所有的代码就是这样的,我能写的就是这些代码的实现,太过理论性的东西不是太会总结,有什么指正请贴在评论区,我会相继改进。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库