当前位置:首页 > 技能相关 > C#与C++ > 正文内容

C# 多窗口相互传递信息的实现方式(委托 delegate)

admin2年前 (2023-01-11)C#与C++2990 修订时间:2023-01-11 09:01:14

要在多窗口之间传递数据,可以使用委托的形式实现,以下是具体的实现方式:

一、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。

 您阅读本篇文章共花了: 

免责声明
本站内容均为博客主本人日常使用记录的存档,如侵犯你的权益请联系:lifei@zaiheze.com 546262132@qq.com 沟通删除事宜。本站仅带访问端口形式使用,已杜绝搜索引擎爬取。

扫描二维码推送至手机访问。

版权声明:本文由LIFEI - blog发布,如需转载请注明出处。

本文链接:http://www.lifeiai.com/?id=276

分享给朋友:

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。