Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建EventHandler并侦听另一个类中的事件_C# - Fatal编程技术网

C# 创建EventHandler并侦听另一个类中的事件

C# 创建EventHandler并侦听另一个类中的事件,c#,C#,我已经创建了如下所示的事件,希望在触发时侦听它并在另一个类中执行方法 但是saveEvent总是为null,并且不会触发 我不知道我错过了什么 这是我的第一堂课 internal partial class OpenSaveReportWizardForm : Form { public event EventHandler saveEvent; private void saveButton_Click(object sender, EventArgs e) { saveEvent?.In

我已经创建了如下所示的事件,希望在触发时侦听它并在另一个类中执行方法 但是saveEvent总是为null,并且不会触发 我不知道我错过了什么

这是我的第一堂课

internal partial class OpenSaveReportWizardForm : Form
{
public event EventHandler saveEvent;
private void saveButton_Click(object sender, EventArgs e)
{
  saveEvent?.Invoke(this, e); 
}
}
这是第二节课,我想听听saveEvent

 internal class Database
 {
  public Database()
  { 
        Program._wizardForm.saveEvent += (sender, e) => HandleSaveMethod( );

  }

public void HandleSaveMethod()
  {
   // do something
  }
这是我打开表格的地方

internal  class Program
{
  public static OpenSaveReportWizardForm _wizardForm;
  private static void Main()
  {
  OpenFileCommandHandler();
  }

void OpenFileCommandHandler()
     { 
        _wizardForm = new OpenSaveReportWizardForm( );

        _wizardForm.ShowDialog(); 
     }
 }

因为您处理了wizardForm,所以在该事件被清除之后。 您应该编写下一个代码:

 internal class Database
 {
    private bool _isDisposed;
    private OpenSaveReportWizardForm _wizardForm;

  public Database()
  {
      _wizardForm = new  OpenSaveReportWizardForm(m_Opening,m_ConnectionProperties,m_ColumnProperties))
      _wizardForm.saveEvent += (sender, e) => HandleSaveMethod( );

  }

public void HandleSaveMethod()
  {
   // do something
  }

  public void Dispose()
  {
    if(_isDisposed)
        return;

    _isDisposed = true;

    _wizardForm.saveEvent -= HandleSaveMethod;
    _wizardForm.Dispose();
  }

因为一旦using块退出,当我在saveButton上使用debugger时,saveEvent属性将被清除,因此saveEvent最终不会触发,因为您甚至不显示表单,我猜测您正在程序的其他地方打开表单,但希望它与您在
数据库中创建的实例相同。即使您修复了代码,使其不会立即处置
,除非引用打开的同一个实例,否则您将无法得到所需的结果。我认为您是对的,因为我是从另一个类中打开表单的,而不是从上述两个类中打开表单的,所以我应该从该实例中获取ref并在Db类中使用它吗?编译器没有到达Db类,因为单击事件保存事件为null