如何解决如何订阅事件?
我会在开始时指出我只是在学习 C# 和事件。
我有程序的主要 Main 类,它也创建了一个表单。在那个类中,我创建了一个类 A 的对象。在类 a 中,我创建了一个类 B 的对象。
在 B 类中,我定义了一个 Event,我想让 EventHandler 从 Main 类订阅它(目的是在 TextBox 中显示从 Event 传递的文本)。怎么做?
在关于事件的教程中通常显示两个类的示例,在一个类中从第二个类创建一个对象,例如,类 B 的对象在类级别 A 中的此事件订阅如下所示:
b.OnMultipleOfFiveReached += b_MultipleOfFiveReached;
我非常需要帮助。
编辑:
表单类:
using System;
using System.Windows.Forms;
namespace TestApp
{
public partial class Form1 : Form
{
private ClassA _ClassAObject;
public Form1()
{
Console.WriteLine("Form!");
InitializeComponent();
_ClassAObject = new ClassA();
// It is IMPOSSIBLE to register Form handler to Class B event (no access to Class B object here):
//_ClassBObject.OnLogEntry += Form_OnLogEntryHandler;
}
public void Form_OnLogEntryHandler(object sender,LogEntryEventArgs e)
{
Console.WriteLine("Event Handler in Form! Log entry: " + e.LogEntry);
this.textBox1.Text = e.LogEntry;
}
}
}
A 类:
using System;
namespace TestApp
{
public class ClassA
{
private ClassB _ClassBObject;
public ClassA()
{
Console.WriteLine("Class A Object!");
_ClassBObject = new ClassB();
// It is possible to register Class A handler to Class B event:
_ClassBObject.OnLogEntry += ClassA_OnLogEntryHandler;
_ClassBObject.StartProcess();
}
public void ClassA_OnLogEntryHandler(object sender,LogEntryEventArgs e)
{
Console.WriteLine("Event Handler in Class A object! Log entry: " + e.LogEntry);
}
}
}
B 类:
using System;
namespace TestApp
{
public class ClassB
{
// declaring an event
public event EventHandler<LogEntryEventArgs> OnLogEntry;
public ClassB()
{
Console.WriteLine("Class B Object!");
}
public void StartProcess()
{
OnLogEntry?.Invoke(this,new LogEntryEventArgs("#1 Example Log Entry"));
}
}
public class LogEntryEventArgs : EventArgs
{
public LogEntryEventArgs(String iLogEntry)
{ LogEntry = iLogEntry; }
public String LogEntry { get; set; }
}
}
解决方法
如果 B 的实例被 A 暴露,例如您有一个带有公共 getter 的 MyB 属性,而 a 是 Main 中的 A var,您可以简单地编写 a.MyB.OnMultipleOfFiveReached += b_MultipleOfFiveReached;
。
如果不是这种情况并且类 A 中的 B 实例是私有的,则必须在 A 中定义另一个事件,该事件在 B 中的事件被触发时触发。像这样:
public class B
{
public event EventHandler OnMultipleOfFiveReached;
}
public class A
{
private B b;
public event EventHandler OnMultipleOfFiveReachedInB;
public A()
{
b = new B();
b.OnMultipleOfFiveReached += B_OnMultipleOfFiveReached;
}
private void B_OnMultipleOfFiveReached(object sender,EventArgs e)
{
if (OnMultipleOfFiveReachedInB != null)
OnMultipleOfFiveReachedInB(sender,e);
}
}
此时您可以在 Main 中编写 a.OnMultipleOfFiveReachedInB += b_MultipleOfFiveReached;
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。