[非提问]C#利用事件完成两个窗体的传值

jeffreyljc 2008-06-26 05:22:55
窗体间的传值有很多方法,最简单的就是设置所有权方法。不过利用事件也是一种方法。顺便学习下事件.
1,建立两个窗体,Form1和Form2.Form1上有一个BUTTON控件,用于show出Form2.还有一个lable控件,用于看效果.form2上只有一个button控件,用于触发事件.
2,form1代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace test
{
public partial class Form1 : Form
{

public Form1()
{
InitializeComponent();


}

private void button1_Click(object sender, EventArgs e)
{//单击该按钮时SHOW出第二个窗体
Form2 fm2 = new Form2();
fm2.myevent += new Form2.mydelegate(gengxin);//在SHOW出窗体的同时订阅FORM2的事件,调用gengxin()方法.
fm2.ShowDialog();
}
public void gengxin() //用于修改label的方法
{
this.label1.Text = "改了吗";
}
}

3,Form2代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace test
{
public partial class Form2 : Form
{

public delegate void mydelegate();//定义一个委托
public event mydelegate myevent;//定义上诉委托类型的事件


public Form2()
{
InitializeComponent();

}

private void button1_Click(object sender, EventArgs e)
{
//在单击该窗体上的按钮时触发事件
if(myevent!=null)
{
myevent();
}
}
}
}
}

4,对事件了解不深,希望大家指教!
...全文
1142 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangfengyi 2010-03-12
  • 打赏
  • 举报
回复
public event mydelegate myevent;//定义上诉委托类型的事件
Form2中这一句出错
[找不到类型或命名空间名称“mydelegate”(是否缺少 using 指令或程序集引用?)]
zhanggd614 2009-05-11
  • 打赏
  • 举报
回复
学习
zhang_run 2009-03-07
  • 打赏
  • 举报
回复
谢过...
haohaohuai 2009-02-10
  • 打赏
  • 举报
回复
再次崇拜,因为之前我一个办法都没有找到!
haohaohuai 2009-02-10
  • 打赏
  • 举报
回复
感谢楼主,我找这个写法找了好久了!崇拜哈
tianbian_man 2008-09-19
  • 打赏
  • 举报
回复
mark
wjp_116 2008-06-29
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 pp_shy 的回复:]
也可以把委托中的参数写成:
public delegate void mydelegate(object sender, myEventArgs e);
其中myEventArgs是一个类,从EventArgs类继承下来的。在这个类中可以添加任何类型的自定义参数用于传值。

在Form2中:
private void button1_Click(object sender, EventArgs e)
{
//在单击该窗体上的按钮时触发事件
if(myevent!=null)
{
myEventArgs e = new myEventArgs();
e…
[/Quote]
楼上,看来是学的很明白了,那是比较好的方法
pp_shy 2008-06-29
  • 打赏
  • 举报
回复
也可以把委托中的参数写成:
public delegate void mydelegate(object sender, myEventArgs e);
其中myEventArgs是一个类,从EventArgs类继承下来的。在这个类中可以添加任何类型的自定义参数用于传值。

在Form2中:
private void button1_Click(object sender, EventArgs e)
{
//在单击该窗体上的按钮时触发事件
if(myevent!=null)
{
myEventArgs e = new myEventArgs();
e.自定义参数1 = 值;
e.自定义参数2 = 值;
......
myevent(this, e);
}
}

在Form1中:
public void gengxin(object sender, myEventArgs e) //用于修改label的方法
{
this.label1.Text = e.自定义参数;
}
otie 2008-06-29
  • 打赏
  • 举报
回复
学习了...
7777766 2008-06-28
  • 打赏
  • 举报
回复
凑下热闹 学习下
marvelstack 2008-06-28
  • 打赏
  • 举报
回复
利用事件不错,我在这里讲到了另外几种方法,也好用的。
窗体的参数传递
http://blog.csdn.net/zhzuo/archive/2006/05/05/708941.aspx#sec5
wxm3630478 2008-06-27
  • 打赏
  • 举报
回复
学习学习~~~~~~~~~~~~~~~~~~~~~~~`
smntbk 2008-06-27
  • 打赏
  • 举报
回复
我一般用这个方法来实时更新窗体数据(修改三级窗体的同时更新二级窗体)。委托中可以定义需要的参数,传递相关的数据。
jeffreyljc 2008-06-27
  • 打赏
  • 举报
回复
多谢fangxinggood大哥指教
DongloveRen 2008-06-27
  • 打赏
  • 举报
回复
学习!
wuhaiwuya 2008-06-27
  • 打赏
  • 举报
回复
hahaha
Adechen 2008-06-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 JackLucifer 的回复:]
同意1楼的观点,这的确是一个不错的思路.
[/Quote]
yeahspyme 2008-06-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fangxinggood 的回复:]
当然,有些场合是需要这种“弯”的
[/Quote]
比如跨线程时
baihe_591 2008-06-27
  • 打赏
  • 举报
回复
Label lab=Application.FindForms["Form1"].Controls["label1"] as Label;
if(lab!=null)
lab.Text="改了吗?";

我一般用上面的方法.
llixy 2008-06-27
  • 打赏
  • 举报
回复
不错~~
加载更多回复(9)

110,560

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧