使用委托实现多窗口数据传递
C#中委托的声明方式:
<权限修饰符> delegate <返回值类型> <委托名称>(参数1,参数2,...);
例如要声明一个无返回值,传入参数为String类型的委托,声明方式如下:
public delegate void My_Delegate(String str);
委托的实例声明:
<权限修饰符> <委托名称> <委托实例名称>(参数1,参数2,...);
例如我们要生成一个My_Delegate委托实例,其格式应该如下:
public My_Delegate my_delegate;
程序实例:
主窗体类:
//主窗体
public delegate void sendMessage(String str);//声明主窗体的委托
public sendMessage mainSender; //实例化主窗体的委托
子窗体类:
public delegate void sendMessage(String str); //声明子窗口中的委托
public sendMessage subSender; //实例化子窗口中的委托
将委托与被委托的函数进行绑定:
<委托实例名称> = new <委托名称>(<委托函数>);
<委托实例名称> += new <委托名称>(<委托函数>);
程序中(Form1的构造函数)的实例:
fm2.subSender += new Form2.sendMessage(this.setText); //子窗体委托绑定到主窗体的setText函数
this.mainSender += new sendMessage(fm2.subWinSetText); //主窗体委托绑定到子窗体的subWinSetText函数
通常委托实例的声明和实例化(即与指定的函数绑定)是写在一起的,这里我们分开写。也就是先在两个窗体类中进行委托和委托实例的声明,然后在主窗体(Form1)的构造函数中执行委托和委托函数进行绑定。
注意:由于要在多窗口之间传递数据,必须使委托和委托实例能够在另一个类中被调用,因此委托的声明和委托实例的权限修饰符必须使用public。
程序源码
主窗体:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public delegate void sendMessage(String str);//声明主窗体的委托
public sendMessage mainSender; //实例化主窗体的委托
public Form1()
{
InitializeComponent();
Form2 fm2 = new Form2(); //实例化子窗体类
/*将委托与事件绑定*/
fm2.subSender += new Form2.sendMessage(this.setText); //子窗体委托绑定到主窗体的setText函数
this.mainSender += new sendMessage(fm2.subWinSetText);//主窗体委托绑定到子窗体的subWinSetText函数
fm2.Show();
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
mainSender(textBox1.Text);//当主窗体的textBox1被编辑时,调用主窗体的委托
}
void setText(String str)
{
textBox1.Text = str;
}
}
}
子窗体:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form2 : Form
{
public delegate void sendMessage(String str); //声明子窗口中的委托
public sendMessage subSender; //实例化子窗口中的委托
public Form2()
{
InitializeComponent();
}
public void subWinSetText(String str)
{
textBox1.Text = str;
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
subSender(textBox1.Text); //当子窗体中的textBox1被编辑时,调用子窗体的委托
}
}
}
程序效果图
当我们更改主窗体(Form1)的TextBox内容时,子窗体(Form2)的TextBox内容也会跟随改变。更改子窗体(Form2)的TextBox内容时,主窗体(Form1)的TextBox内容也会跟随改变。因此,程序实现了两个不同窗体之间TextBox的数据传递。