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的函数库有点熟悉。
行
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)
签名。
this.ErrorLogView.DataBind()
。