我是一个学习c#的人,我有一个包含父表格和子表格的程序。我希望子表单引发一个事件,以便父表单可以执行某些操作。我复制了一些代码,但我不够聪明,看不出有什么问题。我不知道如何正确编码子表单中的事件。错误是未定义DatasourceUpdated。任何人都可以帮我解决建议的修复方法吗?
我有儿童表格
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();
答案 0 :(得分:4)
现在,你宣布一个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();
这是因为事件是在实例级别声明的,而不是静态的。
答案 1 :(得分:2)
Form2.DatasourceUpdated += ...
你试图将你的处理程序附加到类中试试这个
myForm.DatasourceUpdated += ...
答案 2 :(得分:1)
只要你有一个实际的处理程序,你的代码看起来是正确的,据我所知。你没有在你的代码中包含它。 ChildUpdated
需要是一个带有签名void (object sender, EventArgs e)
的方法,您还应该像this.DataSourceUpdated(this, null);
签名是由您声明事件由具有该签名的System.EventHandler
处理的事实指定的。如果您希望它接收一些特殊参数或根本没有参数,您也可以创建自己的代理。
此外,您的示例中有一个不准确的大小写this.DatasourceUpdated
- > this.DataSourceUpdated
,但我会假设这只是在你的例子中......?
答案 3 :(得分:0)
.NET事件同时具有“sender”对象和“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();
}
答案 4 :(得分:0)
首先,有一个小错字:DatasourceUpdated
vs DataSourceUpdated
。看到首都S?另外,不要忘记args并将DataSourceUpdated
声明为event
:
public event EventHandler DataSourceUpdated;
...
this.DataSourceUpdated(this, EventArgs.Empty);
我注意到的另一个问题是当你应该调用实例成员时调用静态成员:
Form2.DatasourceUpdated += ChildUpdated;
到
myForm.DatasourceUpdated += ChildUpdated;