C#自定义事件处理程序
我是一个学习c#的人,我有一个带有父窗体和子窗体的程序。我希望子窗体引发事件,以便父窗体可以执行某些操作。我复制了一些代码,但我不够聪明,看不出哪里出了问题。我不知道如何在子窗体中正确地编写事件代码。错误为DatasourceUpdate未定义。有人能帮我推荐一个解决方案吗 以我的孩子的形式C#自定义事件处理程序,c#,events,C#,Events,我是一个学习c#的人,我有一个带有父窗体和子窗体的程序。我希望子窗体引发事件,以便父窗体可以执行某些操作。我复制了一些代码,但我不够聪明,看不出哪里出了问题。我不知道如何在子窗体中正确地编写事件代码。错误为DatasourceUpdate未定义。有人能帮我推荐一个解决方案吗 以我的孩子的形式 public partial class Form2 : Form { public EventHandler DataSourceUpdated; ... private void bu
public partial class Form2 : Form
{
public EventHandler DataSourceUpdated;
...
private void button2_Click(object sender, EventArgs e) //Done button
{
if (this.DataSourceUpdated != null) //raise the event
{
this.DatasourceUpdated();
}
this.Close();
}
在父窗体中,我有以下内容:
private void myAddRecord()
{
string myID = string.Empty;
string myMessage = "Insert";
Form2 myForm = new Form2(myID, myMessage);
Form2.DatasourceUpdated += ChildUpdated;
myForm.Show();
.NET事件同时具有“发件人”对象和“EventArgs”对象。在调用您的事件时,需要包括这些内容
例如:
private void button2_Click(object sender, EventArgs e) //Done button
{
if (this.DataSourceUpdated != null) //raise the event
{
this.DatasourceUpdated(this, EventArgs.Empty);
}
this.Close();
}
您正在尝试将处理程序附加到类,请改为尝试以下操作
myForm.DatasourceUpdated += ...
首先有一个小错误:
DatasourceUpdated
vsDatasourceUpdated
。看到首都S了吗?另外,不要忘记args并将数据源更新
声明为事件
:
public event EventHandler DataSourceUpdated;
...
this.DataSourceUpdated(this, EventArgs.Empty);
我注意到的另一个问题是,在应该调用实例成员时调用静态成员:
Form2.DatasourceUpdated += ChildUpdated;
到
现在,您正在声明一个EventHandler,而不是一个事件。将此更改为:
public partial class Form2 : Form
{
public event EventHandler DataSourceUpdated;
...
private void button2_Click(object sender, EventArgs e) //Done button
{
if (this.DataSourceUpdated != null) //raise the event
{
this.DataSourceUpdated(this, EventArgs.Empty);
}
this.Close();
}
此外,当您要订阅事件时,您需要在实例上而不是在类上订阅事件:
Form2 myForm = new Form2(myID, myMessage);
myForm.DataSourceUpdated+= ChildUpdated;
myForm.Show();
这是因为事件是在实例级别声明的,而不是静态声明的。据我所知,您的代码看起来是正确的,只要您有一个实际的处理程序;您还没有在代码中包含这一点
ChildUpdated
需要是一个签名为void的方法(objectsender,EventArgs e),您还应该像this.DataSourceUpdated(this,null)那样引发事件代码>
签名由以下事实指定:您将事件声明为由具有该签名的System.EventHandler
处理。如果希望代理接收某些特殊参数或根本不接收任何参数,也可以创建自己的代理
另外,您的示例中的大小写不准确,this.DatasourceUpdated
->this.DatasourceUpdated
,但我假设这只是在您的示例中…?ChildUpdated在哪里定义?你能给我们看一下代码吗?我有一个名为InsertRecord的方法,它处理子窗体上的SQL更新。我是否需要根据InsertRecord的结果设置DataSourceUpdate,还是只使用eventhandler引用InsertRecord?@Mark W,您不应该编辑这些错误。现在,如果有人阅读你的问题,他们将看不到你的实际问题,并且可能没有意识到你用“固定”代码更新了你的问题,这可能会使他们认为你发布的内容实际上是不正确的。对不起,忽略我的上一条评论。我完全忽略了其中的细微差别。他还将其声明为一个委托,而不是一个事件。Form2类中也存在一些问题,即事件是如何声明和引发的。
public partial class Form2 : Form
{
public event EventHandler DataSourceUpdated;
...
private void button2_Click(object sender, EventArgs e) //Done button
{
if (this.DataSourceUpdated != null) //raise the event
{
this.DataSourceUpdated(this, EventArgs.Empty);
}
this.Close();
}
Form2 myForm = new Form2(myID, myMessage);
myForm.DataSourceUpdated+= ChildUpdated;
myForm.Show();