C#4:在静态CL之间引发和订阅事件

本文关键字:事件 之间 静态 CL C#4 | 更新日期: 2023-09-27 18:22:29

在过去的几天里,我一直在阅读我的各种书籍和MSDN文档,但我无法完成看似极其简单的任务。

简而言之,我想做的是:我有一个静态类DBToolBox,它在SQL数据库上运行各种函数,我希望它有一个独立于UI的错误报告系统。我想用一个事件来通知日志(DataTable)何时更新,这样另一个静态类,一个带有DataGridView的windows窗体,就会刷新自己。这是我无法工作的代码:

信号类别:

public static class DBTools
{
public static readonly DataTable ErrorLog = new DataTable();
public static event EventHandler LogUpdated = delegate {};
// the actual functionality of the class
    private static void Error(Exception Ex, string MethodName)  
    {

        ErrorLog.Rows.Add((); 
        //logs the error with a bunch of data that I'm not listing here 
        LogUpdated(null, EventArgs.Empty); //I attempt to raise an event

    }
 }

反应类别:

public static partial class ErrorWindow : Form
{
    DBToolbox.LogUpdated += ErrorWindow.ErrorResponse; 
    ''the offending event handler:
             ''invalid token "+=" in class, struct, or interface member declaration
             ''invalid token ";" in class, struct, or interface member declaration
             '''QueryHelper_2._0.DBToolbox.LogUpdated' is a 'field' but is used like a 'type'
             '''QueryHelper_2._0.ErrorWindow.ErrorResponse(object)' is a 'method' but is used like a 'type'

      private void Error_Load(object sender, EventArgs e)
    {
        ErrorLogView.DataSource = DBToolbox.ErrorLog;
    }
    public void ErrorResponse(object sender)
    {
        this.Show();
        this.ErrorLogView.DataSource = DBToolbox.ErrorLog;
        this.ErrorLogView.Refresh();
        this.Refresh();
    }
}

}

我做错了什么?

此外,还有另外两种解决方案可以满足我的需求:第一个是DataTable自己的事件RowUpdated或NewTableRow,但我不确定如何订阅该事件。

另一个是DataGridVeiw的DataSourceChanged事件,但我不知道这是否意味着当DataSource的地址发生变化时会触发该事件,也不知道它的值是否发生变化。

我的C#职业生涯也开始了大约一周半,但在此之前,我用VB2010编程了大约一年,所以我对.NET4的函数库有点熟悉。

C#4:在静态CL之间引发和订阅事件

DBToolbox.LogUpdated += ErrorWindow.ErrorResponse;

需要在方法中。尝试向ErrorWindow中添加一个包含该行的静态构造函数。

static ErrorWindow()
{
  DBToolbox.LogUpdated += ErrorWindow.ErrorResponse;
}

首先:partial类只有在所有部分都声明为静态时才是静态的。此外(据我所知,因为我目前还没有测试它的方法)static类既不能由另一个类继承,也不能由它们自己继承
最后但同样重要的是:UI元素派生总是需要实例化的类,因为所有底层的东西都是基于实例的。

要将事件处理程序附加到事件,您需要在方法体(即构造函数)中这样做:

public ErrorWindow()
{
    InitializeComponent(); // Needed to init Winforms stuff
    DBToolbox.LogUpdated += ErrorResponse;
}

此外,您还必须更改ErrorResponse事件处理程序以匹配void EventHandler(object, EventArgs)签名。

设置DataSource后,请尝试this.ErrorLogView.DataBind()