C#事件有两种形式的处理 [英] c# event handling between two forms
问题描述
我有两种形式,我试图捕捉从frmEventReceive.cs frmEventGenerate.cs生成的事件。
在这个例子中,我可以从frmEventGenerate.cs接收该事件,但不知道我怎么能在frmEventReceive.cs抓住这个? frmEventReceive.cs是创造frmEventGenerate.cs我的启动形式。
有人点我在正确的方向,我想我是愚蠢的!
感谢您
frmEventGenerate.cs:
使用系统;
使用System.Collections.Generic;
使用System.ComponentModel;
使用System.Data这;
使用System.Drawing中;
使用System.Linq的;
使用System.Text;
使用System.Windows.Forms的;
命名活动
{
公共委托无效LinkToEventHandler();
公共部分类frmEventGenerate:表
{
公共静态事件LinkToEventHandler EVT;
公共frmEventGenerate()
{
的InitializeComponent();
EVT =新LinkToEventHandler(ReceiveEvent);
的SendEvent();
}
公共静态无效的SendEvent()
{
如果(EVT!= NULL)
{
EVT();
}
}
公共无效ReceiveEvent()
{
的System.Console.WriteLine(接收到的事件 - 这个工程确定);
}
}
}
frmEventReceive.cs:
使用系统;
使用System.Collections.Generic;
使用System.ComponentModel;
使用System.Data这;
使用System.Drawing中;
使用System.Linq的;
使用System.Text;
使用System.Windows.Forms的;
命名活动
{
公共部分类frmEventReceive:表
{
公共frmEventReceive()
{
的InitializeComponent();
frmEventGenerate frmGen =新frmEventGenerate();
}
公共无效ReceiveEvent()
{
的System.Console.WriteLine(我希望能够接收,即使在这里!);
}
}
}
在你的构造函数,实例化 frmEventGenerate
之后:
frmGen.Evt + = ReceiveEvent;
您不必新LinkEventHandler(...)
更多 - 为C#2,有一个的方法组转换可用它你可以使用从方法组(一个方法的名称)转换为委托类型。
编辑:我没有看到你的事件是静态的。这表明,其实你应该使用:
frmEventGenerate.Evt + = ReceiveEvent;
...你不需要 frmGen
可变的。
不过,我强烈建议你从这个 - 你为什么希望事件是静态的摆在首位? (我也想呼吁大家更理智命名类型 - 类似EventGenerator会更好,在这里,例如忽略约定,类型名称应该是帕斯卡的情况下会导致混乱code。)
I have two forms and I am trying to capture an event generated from frmEventGenerate.cs in frmEventReceive.cs.
In this example I can receive the event from frmEventGenerate.cs but not sure how I can catch this in frmEventReceive.cs? frmEventReceive.cs is my startup form which creates frmEventGenerate.cs.
Can someone point me in the right direction, I think I am being stupid!
Thank you
frmEventGenerate.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Events
{
public delegate void LinkToEventHandler();
public partial class frmEventGenerate : Form
{
public static event LinkToEventHandler Evt;
public frmEventGenerate()
{
InitializeComponent();
Evt += new LinkToEventHandler(ReceiveEvent);
SendEvent();
}
public static void SendEvent()
{
if (Evt != null)
{
Evt();
}
}
public void ReceiveEvent()
{
System.Console.WriteLine("Received Event - This works ok");
}
}
}
frmEventReceive.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Events
{
public partial class frmEventReceive : Form
{
public frmEventReceive()
{
InitializeComponent();
frmEventGenerate frmGen = new frmEventGenerate();
}
public void ReceiveEvent()
{
System.Console.WriteLine("I want to be able to receive the even here!");
}
}
}
In your constructor, after instantiating frmEventGenerate
:
frmGen.Evt += ReceiveEvent;
You don't need new LinkEventHandler(...)
any more - as of C# 2, there's a method group conversion available which you can use to convert from a method group (the name of a method) to a delegate type.
EDIT: I hadn't seen that your event was static. That suggests you should actually use:
frmEventGenerate.Evt += ReceiveEvent;
... and you don't need the frmGen
variable at all.
However, I would strongly discourage you from this - why do you want the event to be static in the first place? (I'd also urge you to name your types more sensibly - something like "EventGenerator" would be better here, for example. Ignoring the convention that type names should be in Pascal case leads to confusing code.)
这篇关于C#事件有两种形式的处理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!