利用自定义事件实现不同窗体间的通讯 -- C#篇

C# 中的“事件”是当对象满足一定条件,发生某些事情时,类向该类的客户提供通知的一种方法。使用事件,拥有该事件的对象不必知道需要通知谁,一旦满足了某个条件,将自动调用该事件,正确通知每个需要通知的对象。通过使用事件,提高了程序的模块化程度。

要在程序中使用自定义事件,需按以下步骤进行:

1、声明事件
要在类内声明事件,首先必须声明该事件的委托类型:
public delegate void SelectionChangedEventHandler(object sender,
SelectionChangedEventArgs e);

说明:由于本示例程序需在事件中传递数据,因此定义了EventArgs的派生类SelectionChangedEventArgs。
public class SelectionChangedEventArgs : EventArgs
{
private string m_selection;

//本属性用于传递事件数据
public string Selection
{
get { return m_selection; }
}

public SelectionChangedEventArgs(string selection)
{
m_selection = selection;
}
}

委托类型定义传递给处理该事件的方法的一组参数。多个事件可共享相同的委托类型,因此仅当尚未声明任何合适的委托类型时才需要执行该步骤。

接下来,声明事件本身:
public event SelectionChangedEventHandler SelectionChanged;

2、调用事件
如果没有任何客户将委托与该事件挂钩,该字段将为空;否则该字段引用应在调用该事件时调用的委托。因此,调用事件时通常先检查是否为空,然后再调用事件。
public class Form2 : System.Windows.Forms.Form
{
... ...

public event SelectionChangedEventHandler SelectionChanged;

... ...

private void comboBox1_SelectedIndexChanged(object sender, System.EventArgs e)
{
if (SelectionChanged != null)
{
SelectionChangedEventArgs E = new SelectionChangedEventArgs(comboBox1.Text);
SelectionChanged(this, E);
}
}
}

3、与事件挂钩
为了开始接收事件调用,客户代码先创建事件类型的委托,该委托引用应从事件调用的方法。然后它使用 += 将该委托写到事件可能连接到的其他任何委托上。
public class Form1 : System.Windows.Forms.Form
{
... ...

private Form2 m_frm2;

... ...

public Form1()
{
... ...

m_frm2 = new Form2();

//与事件挂钩
m_frm2.SelectionChanged += new SelectionChangedEventHandler(frm2_SelectionChanged);
}

... ...

private void button1_Click(object sender, System.EventArgs e)
{
m_frm2.ShowDialog();
}

private void frm2_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
//获取事件传递过来的数据
textBox1.Text = e.Selection;
}
}

时间: 2024-09-11 17:03:30

利用自定义事件实现不同窗体间的通讯 -- C#篇的相关文章

详解JavaScript中的自定义事件编写_基础知识

我们可以自定义事件来实现更灵活的开发,事件用好了可以是一件很强大的工具,基于事件的开发有很多优势(后面介绍). 与自定义事件的函数有 Event.CustomEvent 和 dispatchEvent. 直接自定义事件,使用 Event 构造函数: var event = new Event('build'); // Listen for the event. elem.addEventListener('build', function (e) { ... }, false); // Disp

在不同窗体间传递数据

问题描述 想在不同窗体间传递数据,已经试过构造函数了,还想试一下用属性传递,但是我在第一个窗体中查看该属性的值是有变化的,但在第二个窗体中,却无法得到该值,该属性值为空,请问为什么? 解决方案 解决方案二:那你在第一个窗体调用第二个窗体的时候中有没有把属性值传给第二个窗体呢?解决方案三:引用1楼jsnjlhb的回复: 那你在第一个窗体调用第二个窗体的时候中有没有把属性值传给第二个窗体呢? 构造方法?重载构造方法是可以的我是说,单独建立一个类用于接收和传递属性值,在第二个窗体中初始化第一个窗体对象

Javascript中的自定义事件工作笔记

什么是自定义事件 自定义事件常伴左右,但是我们可能用得很少,我们可以看看jQuery的用法:  代码如下 复制代码 // 监听自定义事件 $node.on(CUSTOM_EVENT_NAME, callbackFn); // 触发自定义事件 $node.trigger(CUSTOM_EVENT_NAME, params); // 解除自定义事件 $node.off(CUSTOM_EVENT_NAME, fn); 看到这里,我们会发现,这个跟我们常用那些个浏览器事件用法几乎一样,只是多了个触发的方

JavaScript 自定义事件的学习笔记

JavaScript 自定义事件就是有别于如 click, submit 等标准事件的自行定制的事件,在叙述自定义事件有何好处之前,先来看一个自定义事件的例子:  代码如下 复制代码 <div id="testBox"></div> // 创建事件 var evt = document.createEvent('Event'); // 定义事件类型 evt.initEvent('customEvent', true, true); // 在元素上监听事件 var

关于窗体间数据传递

问题描述 在程序启动时启动frmMain(mdi窗体),childfrm1(用于显示明细数据的listview)根据用户使用时根据需求启动frm1,frm2.....当点击frm中的某条数据时将这条数据的明细信息传递给childfrm1(类似于vs.net窗体中在切换不同编辑窗体时将数据传递给属性编辑窗体这样的效果.) 解决方案 解决方案二:做成事件解决方案三:用构造函数或事件来实现窗体之间的通讯~~比如:classForm2{ListView_lv;publicForm2(ListView_l

在.NET中利用委托实现窗体间通信

对于窗体间简单的通信,采用VB6.0的方法就能满足我们的要求,但在一些架构设计复杂的应用中,这种方法就显得有点捉襟见肘了,同时该方法还有一个缺点,就是它仅仅对通过.NET窗体向导添加进去的窗体起作用,而对于自定义的窗体类型我们是无法添加到Forms对象集合中的.而且也和其它诸如构造函数传参等方法一样,会在窗体间大量互相引用各自的成员,造成了彼此之间存在着很大的耦合性,非常不利于窗体模块间的独立,这不符合良好软件设计模式的思想. 如果我们想在一个窗体中访问另一个窗体中自定义的成员,必须把该成员的可

利用C#实现窗体间的数据传递

一个稍微复杂一点的程序一般都有二个或者更多的窗体.有时在程序设计中,数据不仅要在同一个窗体中传递,还要在窗体间传递,这种传递是主窗体与从窗体之间数据的互相传递.从本文开始,我们将列举不同窗体间数据传递的四种情况,和用Visual C#实现这四种情况的具体方法.下面先介绍用Visual C#实现窗体间传递数据中第一种情况--从主窗体向从窗体传递字符串.在阅读完本文后,你还尝试一下利用此方法在窗体间传送数值等数据. 本文中程序设计.调试.运行的软件环境: Windows2000 服务器版 Visua

在.NET中利用委托实现窗体间通信_实用技巧

对于窗体间简单的通信,采用VB6.0的方法就能满足我们的要求,但在一些架构设计复杂的应用中,这种方法就显得有点捉襟见肘了,同时该方法还有一个缺点,就是它仅仅对通过.NET窗体向导添加进去的窗体起作用,而对于自定义的窗体类型我们是无法添加到Forms对象集合中的.而且也和其它诸如构造函数传参等方法一样,会在窗体间大量互相引用各自的成员,造成了彼此之间存在着很大的耦合性,非常不利于窗体模块间的独立,这不符合良好软件设计模式的思想. 如果我们想在一个窗体中访问另一个窗体中自定义的成员,必须把该成员的可

WinForm窗体显示和窗体间传值总结

WinForm 2009-02-10 10:47:47 阅读50 评论0 字号:大中小 A.WinForm中窗体显示 显示窗体可以有以下2种方法: Form.ShowDialog方法 (窗体显示为模式窗体) Form.Show方法 (窗体显示为无模式窗体) 两者具体区别如下: 1.在调用Form.Show方法后,Show方法后面的代码会立即执行 2.在调用Form.ShowDialog方法后,直到关闭对话框后,才执行此方法后面的代码 3.当窗体显示为模式窗体时,单击"关闭"按钮会隐藏窗