C# 多窗口相互传递信息的实现方式(委托 delegate)
要在多窗口之间传递数据,可以使用委托的形式实现,以下是具体的实现方式:
一、Form 1 声明委托与实例化
C#中委托的声明方式:
<权限修饰符> delegate <返回值类型> <委托名称>(参数1,参数2,...);
实例化委托声明方式:
<权限修饰符> <委托名称> <委托实例名称>(参数1,参数2,...);
示例代码:
声明一个无返回值,传入参数为String类型的委托
//声明主窗体的委托 public delegate void sendMessage(String str); //实例化主窗体的委托 public sendMessage mainSender;
二、声明Form 1 的用于委托的事件
声明用于委托绑定的事件:
void setText(String str) { textBox1.Text = str; }
三、Form 2 重复上述步骤
这里只操作Form 2 窗口,可以操作其他多个窗口。接下来,如Form 1一样声明实例化委托,并创建用于委托绑定的事件:
//声明子窗口中的委托 public delegate void sendMessage(String str); //实例化子窗口中的委托 public sendMessage subSender; public void subWinSetText(String str) { textBox2.Text = str; }
四、在Form 1 中实例化 Form 2 ,并将委托与被委托函数进行绑定
窗体实例化的声明方式:
将委托与被委托的函数进行绑定的声明方式
<委托实例名称> = new <委托名称>(<委托函数>); <委托实例名称> += new <委托名称>(<委托函数>);
示例代码:
public Form1() { //窗口创建时默认存在,不要删除 InitializeComponent(); //实例化窗体类 Form2 fm2 = new Form2(); //Form2 实例化对象的subSender窗体委托绑定到Form1的setText函数 fm2.subSender += new Form2.sendMessage(this.setText); //Form1窗体中的mainSender委托绑定到Form2实例化对象的subWinSetText函数 this.mainSender += new sendMessage(fm2.subWinSetText); //显示实例化窗体 fm2.Show(); }
五、具体使用
在Form1 中使用mainSender()事件(任意位置使用),str会被传递到Form2窗体的textBox2.text中
mainSender("str");
在Form2 中使用subSender()事件(任意位置使用),str2会被传递到Form1窗体的textBox1.text中
subSender("str2");
六、拓展
C# 如下情况:
打开程序主窗体,并不可见,同步打开登录窗体,登录效验成功后传递登录用户名与账号信息至主窗体,显示主窗体
部分实现代码:
修改上述步骤四代码如下
public Form1() { InitializeComponent(); Form2 fm2 = new Form2(); fm2.subSender += new Form2.sendMessage(this.setText); this.mainSender += new sendMessage(fm2.subWinSetText); //隐藏当前窗体 this.Visible = false; //以SowDialog()方式打开登录窗体 login.ShowDialog(); //以下步骤会在登录窗体关闭后,再执行,这是ShowDialog()的特性 this.Visible = true; }
注意:因多窗口之间传递数据,须使委托和委托实例能够在另一个类中被调用,因此声明的委托和委托实例的权限修饰符须使用Public。