簡體   English   中英

C#自定義事件處理程序

[英]C# Custom Event Handler

我是一個學習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();

現在,您聲明的是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();

這是因為該事件是在實例級別而非靜態聲明的。

Form2.DatasourceUpdated += ...

您正在嘗試將您的處理程序附加到該類上,請改用

myForm.DatasourceUpdated += ...

據我所知,只要您有實際的處理程序,您的代碼就看起來正確。 您尚未將其包含在您的代碼中。 ChildUpdated必須是一個帶有簽名標記void (object sender, EventArgs e) ,並且還應該引發類似this.DataSourceUpdated(this, null);的事件this.DataSourceUpdated(this, null);

通過將事件聲明為由具有該簽名的System.EventHandler處理的事實來指定簽名。 如果希望它接收某些特殊參數或根本不接收任何參數,則也可以創建自己的委托。

另外,您的示例中有一個不正確的大小寫, this.DatasourceUpdated > this.DataSourceUpdated ,但是我假設這只是您的示例...?

.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();
}

首先有一個小錯字: DatasourceUpdated vs DataSourceUpdated 看到大寫字母S嗎? 另外,不要忘記args並將DataSourceUpdated聲明為event

public event EventHandler DataSourceUpdated;

...

this.DataSourceUpdated(this, EventArgs.Empty); 

我注意到的另一個問題是,您應該在調用實例成員時調用靜態成員:

Form2.DatasourceUpdated += ChildUpdated;

myForm.DatasourceUpdated += ChildUpdated;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM